Neo4j nedir?

Talha Tarık Küçük
5bayt
Published in
5 min readOct 22, 2018

Neo4j, Neo4j Inc. tarafından geliştirilen bir grafik veritabanı yönetim sistemidir. Geliştiricilerin yerel grafik depolama ve işleme özelliğine sahip ACID uyumlu bir işlem veritabanı olarak tanımladığı Neo4j, DB-Engines sıralamasına göre en popüler grafik veritabanıdır ve 22. en popüler genel veritabanıdır…

Neo4j kurulumu için Docker + Neo4j(Docker içine) Kurulumu yazıma göz atabilirsiniz.

Genel olarak graph databaselerin yapısı benzerdir… İşte Neo4j’nin yapısı…

1. Nodes — Kayıtlar

2. Relationships — Kayıtların ilişkileri

3. Properties — Node’ların özellikleri/içerdikleri veriler

NODE

Node’lar ana kayıtlardır. Node’lar içersindeki özellikler name, from gibi… Properties olarak adlandırılır.Yani her Node, Properties’e sahiptir…

LABELS

Labels(etiketler) ise node gruplarına verilen addır. Örneğin name:”Emil” olan node aslında “Person(İnsan)” etiketiyle etiketlenmektedir. Person Label’ının rengi kırmızıdır.

Bir node hiç Label’a sahip olmayabilir veya birden fazla Label’a sahip olabilir. Label’lar herhangi bir özelliğe sahip olamaz. Sadece gruplama yapabilir. Zaten özelliklerin node içinde tutulduğundan bahsetmiştik…

ÇOK SAYIDA NODE

Çok sayıda node(kayıt) içerebilr. Örneğin hemen yanda “Person” Label’ını içeren kişi isimlerinin yer aldığı Node’lar vardır.. İstediğimiz kadar node ekleyebiliriz.. Node’lar hakkında şunları söyleyebiliriz.

  1. Emil’in yaşı 15 olarak yazabilir…
  2. Johan’ın İsviçreli olduğunu…
  3. Ian’ın İngiltereli olduğunu ve yazar olduğunu.
  4. Rik’in Belçikalı olduğunu ve kedisinin adının Rio olduğunu…
  5. Allison’ın Amerikalı olduğu ve seyahat yapmayı çok sevdiğini yazabilir.

Özetle şunları söylememiz mümkündür..

· Aynı label içeriside bulunan yada bulunmayan benzer Node’lar farklı kayıtlar içerebilir.

· Özellikler string, sayı veya boolean değerler olabilir…

· Neo4j milyarlarca node içerebilir…

NODE’LAR ARASINDAKİ İLİŞKİLER (RELATIONSHIPS)

Graph Database’lerin kullanılmasındaki asıl güçlü unsur Node’lar arasındaki ilişkisel bağlantılardır…

Yandaki resimde LABEL=”Person” olan Node’lar arasındaki ilişkileri görmektesiniz. Özetle KNOWS(bilmek/tanımak) bağıntsını ele alırsak.

  1. Emil TANIR -> Johan ve Ian’i
  2. Johan TANIR -> Ian ve Rik’ı
  3. Rik ve Ian TANIR -> Allison’u

· Relationships’lerin bir yönü vardır.

· Relationships bir tipe sahiptir.

RELATIONSHIPS’LERİN ÖZELLİKLERE SAHİP OLMASI

Yukarıda basitçe belirttiğimiz gibi Relationships’ler nodelar arasındaki bağıntıları gösteriyordu. Bu ilişkilerin çeşitli özellikleri olabilir. Örneğin..

-Emil 2001’den beri Johan’ı tanımaktadır…

CYPHER

Neo4j’nin Cypher adında SQL’e benzer bir sorgulama dili vardır. Şimdi birkaç örnekle adım adım Cypher’a değinelim..

CREATE — Node oluşturma.

CREATE (ee:Person { name: “Emil”, from: “Sweden”, klout: 99 })

CREATE() oluşturma komutumuz. Parantez içine Label {Node Değerleri} formatında veri gireceğiz.

Ee:Person “PERSON LABEL’inde eklenecek kayıt anlamına gelmektedir.

MATCH — Node arama.

MATCH (ee:Person) WHERE ee.name = "Emil" RETURN ee;

MATCH(ee:Person) Burada ise Person etiketi altındaki Node’ları bize verecektir. WHERE’ ee:name diyerek Node’la içerisinden adı Emil olanları seçiyor RETURN ee ile döndürüyoruz…

Buradaki ee’yi aslında bir değişken, sorguyla ilgili birden fazla bu tip değişken oluşturulabilir. Ben bu yapıyı daha çok T-SQL’deki “:WITH geciciTablo as {}” yapısına benzetiyorum. Yani burdaki ee değerinin içerikteki bir karşılığı yok.. Sadece sorgulardaki sonuçları içiçe sorgulamak için kullanılan bir yapı..

Aşağıda birden fazla CREATE örneği bulunmaktadır.

MATCH (ee:Person) WHERE ee.name = "Emil"

CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),

(ir:Person { name: "Ian", from: "England", title: "author" }),

(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),

(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),

(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),

(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),

(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),

(rvb)-[:KNOWS]->(ally)

CREATE (), (),(),() şeklinde içeriğindeki sorgu tipi aşağıdaki gibi olacak şekilde oluşturma yapılabilir.

(js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),

Örneğin işin içine ilişkileri ekleme girdiğinde… Yukarıdaki sorguda “ee” bize Emil’i işaret etmektedir. Aşağıdaki sorguda ise Emil’in 2001’den beri tanıdığı js’içerisinde. (js bize Person labeli içerisinde yer alan adı Ian olan, ülkesi England olan, başlığı Author olan veriyi işaret etmektedir.) Dolayısıyla burada Emil’in Ian’ı 2001’den beri tanıdığı ilişkisi eklenmiştir.

(ee)-[:KNOWS {since: 2001}]->(js)

Aşağıda Emil’in KNOWS olduğu arkadaşlarını listeleyecek. Friends bir Node’un ilişkili olduğu Node’ları göstermektedir. Firiends’lerden KNOWS olanları listeleyecektir. Friends ile çağırmaktadır.

MATCH (ee:Person)-[:KNOWS]-(friends)

WHERE ee.name = "Emil" RETURN ee, friends

Aşağıdaki sorguda tavsiyeler alınacaktır. [:KNOWS]-()-[:KNOWS] ile içerisindeki boş parantez araya herangi bir node’un gelebileceğini örneğin Ahmet Mehmet’i tanıyor, Mehmet Ömer’i… Ahmet ile Ömer’in arasında KNOWS-()-KNOWS ilişkisi vadırdır. Kısaca Ahmet’in tanıdığının, tanıdığı anlamına gelmektedir.

Örneğimize geçelim, Johan bu tip bir ilişki bağı içerisinde hobby=”Surfing” olanları öğrenmek istediğinde bağlantılarının bağlantısının olduğu bir sonuç dönecektir, bir tavsiye olarak.. Eğer bu yapıda en yakınında hobby=surfing olan varsa da listelenecek, uzaktan bağlantıları varsa da listelenecektir. RETURN DISTINCT ile aynı kayıtları almayacaktır.

MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)

WHERE js.name = "Johan" AND surfer.hobby = "surfing"

RETURN DISTINCT surfer

Analiz (Yukarıdaki sorguyu görsel olarak dönen sorgu aşağıdaki gibidir. Aynı yapıda ancak başında PROFILE kullanılmıştır. Profile yerine Explain de kullanılabilir)

PROFILE MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)

WHERE js.name = "Johan" AND surfer.hobby = "surfing"

RETURN DISTINCT surfer

Neo4j’ye basitçe değinmek istedik.. Ben neo4j ile Docker içinde çalışıyorum. Bundan sonraki örneklerde Docker içinde Python kurulumu ve python ile yine docker içinde yer alan Neo4j’ye kayıt gönderme ve kayıt çekme işlemlerini yapacağımız yazılara devam edeceğim… 5Bayt’ı takipte kalın! 😊

--

--