CYPHER dili

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

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

İlgili yazılarım:

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! 😊

--

--