Giriş ve birkaç not
İlk giriş için birkaç not yazmam gerekti. Aşağıdaki notları esasında kendim için tuttum. Ve Neo4j ile ne yaparsam yapayım bu sayfayı acayip çok kullanıyorum ve işime çok yarıyor. Demek ki sizin de çok işinize yarayacak.
Neo4j nedir?
Basit cevabı: Graph database dediğimiz ilişkisel veri tabanı. RDBMS'in relational kısmı mevcut ama ekstrası da var: AI ile beraber işlemeye uygun bir veri tabanı sistemi.
Farklı ikinci cevap: Neo4j gibi graph database'ler bugünün yazılımlarıdır! Geleceğin yazılımı demeyeceğim, çünkü geleceği artık yaşamaya başladık bile. AI ile ilgiliysen Neo4j kullanman gereken yararlı bir yol. Diyelim Herhangi bir dernek , vakıf, devlet kurumu, veya bürokratik bir birimde çalışıyorsun: Neo4j kullanman gereken, hatta zorunda olduğun bir veri tabanı programıdır.
Neden mesela MySQL, SAP veya başka RDBMS programı değil de Graph database olan Neo4j?
Çünkü
1/ Şu anda piyasada yaygın olan RDBMS sisteme dayanan veri tabanları, eski bir sisteme aitler. RDBMS harikulade bir sistem, ama yetmiyor, AI için yeterli değil, bu sebeplerle artık tarihe karışmaya başladı bile. Büyük kurumlar çok hantal ve bunların yönetimi, hatalı şekilde düşünerek, bu ağır hantal yazılımlarıı kullanmak zorundaymış gibi hissediyorlar.
Bu hatalı düşünceleri sebebiyle, bu ağır ve büyük kurumlar da tarihe karışacak, çünkü esnekliğe sahip değiller. İşin acı yanı tarihe karıştıklarını gazetelerde yavaş yavaş okuyoruz da. Esneklik bence veritabanının mantıklı şekilde NoSQL dataları barındırabilme kapasitesi ile geliyor. RDBMS'de nosql datalar, data integrity'yi bozuyor, hatta RDBMS'lerin ilk harfi olan Relational mantığına ters düşüyorlar. Ama bugünün dünyası NoSQL dataları gittikçe daha çok kullanıyor. İşte bu modern zamanın hali RDBMS'leri zor duruma düşürüyor bence. Bu sebeple de RDBMS 'e dayanan veri tabanı yazılımları obsolete yani teknolojik olarak geri kalmış oluyorlar.
17 sene RDBMS'i kullandım ve hayrandım, ama Graph database ile tanışınca eskidiklerini anladım. Dev kurumlar, sizlere kötü bir haberim var; kusura bakmayın ama boşu boşuna RDBMS bazlı programlarınızı bilen adamları işe alarak, bünyenizi şişiriyorsunuz. Yeni teknolojiye geçmezseniz, harcamanız şimdiden boşa çıkmaya başlayacak.
Piyasa örneklerini hatırlayın; Koskoca "Nokia" ve "Motorola" yeni teknolojiye ayak uyduramadıkları için ne olduklarını bile anlamadan yokoldular. İşte RDBMS bazlı yazılımları kullanan firmaların da yakın geleceği ne yazık ki böyle. İşin acı yanı Dünya'daki pek çok devletin en önemli kurumları RDBMS bazlı yazılımlar ile ayakta duruyorlar. Ama Dünya acımasız. Bu ülkelere piyasa acımayacak, sırf eski nesil veri tabanı kullandıkları için bu ülkeler geriye düşecekler.
2/ Neo4j Graph Database dediğimiz 2000 'li senelerin başında ortaya çıkan devrimsel bir veri tabanı sistemi. Neo4j'nin RDBMS bazlı db'lere nazaran "data integrity" sağlamasını karşılaştırırsak, çok daha iyi olduğunu görürüz. Bir ilişkili veriler kümesi kurmak Neo4j'de 2 kat daha kısa ve query ile sorgulamada da herhalde birkaç kat daha hızlı, Milyon datalara erişimde ilişkisel verilere göre çok daha hızlı. Yani Neo4j ileri bir kuvvete sahip.
RDBMS mi yoksa Graph Database mi? Hangisinin geleceği parlak?
Kanaatimce eski tip veri tabanları son tangoyu oynuyorlar, eski yapılar, eski kafalar, eski düzenler bu eski tip RDBMS'leri delicesine ama çok lüzumsuz şekilde koruyor. Üzgünüm ama "Nokia" ve "Motorola" nın "Iphone" ve "Android" telefonlar çıktıktan sonra yokolma örneklerini hiç bir devlet kurumu ve özel kuruluş unutmamalı. Çünkü herhangi bir kurum dev boyuta ulaşsa da, muazzam bir insan, altyapı ve parasal sermaye biriktirse de, teknolojik değişim, az olan akıl sermayesiyle bile, bu dev insan ve finansal sermayeli kuruluşları serçe parmağıyla yıkmaya kudretli oluyor.
Yani devir artık para devri değil akıl devri. Ve akıl artık sadece kafada olması değil bilgisayarda da olması gerekiyor. Bu çok tuhaf değil mi? Binlerce yıldır insan aklını öven, ve insan aklının herşeyi yapabileceğini söyleyen yazılar okuduk durduk. Bugün insan aklı bilgisayar aklı tarafından geçilmek üzere.
İşte Graph database bu yeni aklın kullanım aracı. "Bilgiyi kontrol eden dünyayı kontrol eder" lafına göre harekete etmeliyiz bizler. Buna göre, bilgi oluşturmanın yeni aracı olan yeni tip veri tabanı olan Graph Database yazılımlarını kullanmak gerekiyor. Gelecek artık bugündür. Bu sebeple bugün ayakta kalmak isteyen kurumlar teknolojiye ayak uydurmak zorundalar. Bu istisnasız tüm devletleri dahi ilgilendiren bir husus. Devletler de ayakta akalabilmek için teknolojiye ayak uydurmak zorundalar.
17 senelik deneyimlerimde gördüğüm yegane şey: Kurumlar, RDBMS, veya daha eski teknoloji olan Excel ve bugünkü türlü şekillerine, aşık kaldıkça, romantik ve nostaljik olup ayrıca da batan kurumlar olacaklardır.
"Verileri excel'de de toplarız, veri tabanı denen saçmalık da ne ki! " diye sürekli böbürlenen son patronum şirketini iflas sebebiyle kapatmıştı. Teknolojiye gözünü yuman bir patrondu, sonunu kendisi hazırladı.
Rekabette arkalara düşen, küçülmek zorunda kalan, bir başka çalıştığım kurumun müdürleri ve sahibi de aynı hataları yaptılar. Eski tip veri tabanlarına milyonları gömüp, "yeni teknoloji de ne ki, bak biz milyonları şu "X" yazılıma gömdük" diyorlardı. Oysa ki yeni yazılımlar daha ucuz ve daha verimliler. Ama görmek istemediler.
Bunlara karşı ne diyeyim bilemiyorum! "Her koyun kendi bacağından asılır" demek istemiyorum . Çünkü, bu güzel bir laf değil. Bu laf şunu demek ile aynı: sen yokolmaya giderken seni sadece izleyeceğim, sen yokolacaksın ben de ayakta kalacağım. Çok acımasız, yardımseverlikten uzak bir görüşü tasvir ediyor bu laf. Bu laftan dolayı babamdan azar işitmiştim, bunu sizlere aktarmam gerekiyordu.
aklın olmadığı yolda birisi yürüyorsa bu kişiler bu yoldan dönmeleri sağlanmalı, oturup da onun kötü gidişini seyretmemeli insan.
Düşünceler ve deneyimlerimden elde ettiklerimi iletmeye çalıştım.
Create
Create unique Node
MERGE (p:kol1 {name: 'Kazan'})
Create multiple nodes with label
CREATE (a:kol2 {name: 'Cafe'}), (b:kol2 {name: 'Tarim'}), (c:kol2 {name: 'Otel'}), (d:kol2 {name: 'Havacilik'}), (e:kol2 {name: 'Sanat'}), (f:kol2 {name: 'Endustri'}), (g:kol2 {name: 'Spor'})
MERGE = Duplicate`i engeller ve create eder
CREATE = Duplicate var mi diye kontrol etmez
Create Relationship by matching (better option)
MATCH (b {name: 'Uretim'}), (a {name: 'Kazan'})
MERGE (a)-[R_K_01_01:SEKTOR]->(b)
or
MERGE (a)-[:LIKES]->(b)
Create Nodes and Relationship all together - easier way:
CREATE (a:kol1 {name: 'Kazan'}), (b:kol2 {name: 'Cafe'}), (c:kol2 {name: 'Tarim'}), (d:kol2 {name: 'Otel'}), (e:kol2 {name: 'Havacilik'}), (f:kol2 {name: 'Sanat'}), (g:kol2 {name: 'Endustri'}), (h:kol2 {name: 'Spor'})
CREATE (a)-[pr:FAALYT]->(b), (a)-[pf:FAALYT]->(c), (a)-[pl:FAALYT]->(d), (a)-[pl:FAALYT]->(e), (a)-[pl:FAALYT]->(f), (a)-[pl:FAALYT]->(g)
RETURN a,b,c,d,e,f,g
Create Relationship - has problems see note
MATCH (cmk:kol1), (ddm:kol2)
WHERE cmk.name = 'Kazan' AND ddm.name = 'Hizmet'
CREATE (cmk)-[R_K_01_01:FAALYT]->(skol:kol2 {name: 'Spor'}),(cmk)-[R_K_01_02:SEKTOR]->(ddm),
(ddm)-[R_H_01_01:ALT_FT]->(cfkol21:kol2 {name: 'Cafe'}),(ddm)-[R_H_01_02:ALT_FT]->(cfkol22:kol2 {name: 'Otel'});
Note: it creates the nodes as duplicates: cafe, otel, spor
Delete
Delete the node and its relationship
MATCH (n:kol2 {name: 'Hizmet'})
DETACH DELETE n
Delete nodes with null names (and their relationships)
match (n) WHERE (IS NULL(n.name)) DETACH DELETE n
Delete node by its elementid
MATCH (p) where elementId(p)='4:2281ff98-ea44-490d-836f-e6961cda3ec3:16'
DETACH DELETE p
Remove a node`s label
MATCH (n)
WHERE ID(n) = 35 REMOVE n:Tarla
don`t know
MATCH ()-[r:FAALYT]->(n:kol2 {name: 'Cafe'})
DELETE r
Querying
Query for one node:
MATCH (a:kol1 {name: "Kazan"}) RETURN a
Change
Set a property name (property here is `Labels`< > label)
MATCH (n) WHERE Id(n)=13 SET n.Labels = 'Sektor'
Edit - baska yontem ? : test ettim - tercih edilen: -
Hurriyet ve Itilaf node`una kurulus ekledim
MATCH (n {name: 'Hurriyet ve itilaf'})
SET n.kurulus = '1919'
Remove property
MATCH (a {name: 'Hizmet'})
REMOVE a.Labels
ornek 2:
`Muhalif` ana node`una, yanliskla `kurulus` ve data da `1919` tarihini \eklemisim
asagidaki kod ile, `kurulus` property`si icindeki `1919` datasi ile silinir
MATCH (a {name: 'Muhalif'}) REMOVE a.kurulus
Change label (by removing the old one)
MATCH (ddm:kol2) // eski property`yi bul: kol2
WHERE ddm.name IN ["Hizmet"] // Hangi var olan node icinde? Cevap = Node adi: Hizmet
WITH ddm
REMOVE ddm:kol2 // bu node`daki eski property "kol2" `yi siliyor
SET ddm:skt1 // bu node`a yeni property: "skt1" `i ekliyor
Change Relationship type:
It is not possible to do it directly (by: jaderberg). But you can do something that looks like to it:
MATCH (n:kol2 {name:"Spor"})-[r:URETIM]->(m:Fun_Hizm {name:"Tenis"})CREATE (n)-[r2:FUN]->(m)SET r2 = rWITH rDELETE r
(source: https://stackoverflow.com/ by: Michael Hunger edited: Hendy Irawan)
Change Node`s name property
Match (n:kol1{name:'Kazan'}) Set n.name = 'Tarla'Match by id
MATCH (n)WHERE ID(n) = 35
Data integrity
Constraint
CREATE CONSTRAINT Fun_Hizm_Uniq FOR (a:Fun_Hizm) REQUIRE a.name IS UNIQUE
CREATE CONSTRAINT ideol_uniq FOR (cc:ideoloji) REQUIRE cc.name IS UNIQUE
Import
Import data from csv
LOAD CSV WITH HEADERS FROM 'file:///n4j_cift_02_node_yrd_dal_is_kolu.csv'
AS row
MERGE (:2_yrd_dal {id: row[1], is_ad: row[2], Sehir: row[3], type: row[4]});
AS row
MERGE (:2_yrd_dal {id: row[1], is_ad: row[2], Sehir: row[3], type: row[4]});
LOAD CSV WITH HEADERS FROM 'file:///n4j_cift_02_node_yrd_dal_is_kolu.csv'
AS row
MERGE (:yrd_dal {is_ad: row[1], Sehir: row[2], type: row[3]});
AS row
MERGE (:yrd_dal {is_ad: row[1], Sehir: row[2], type: row[3]});
LOAD CSV WITH HEADERS FROM 'FILE:///n4j_cift_01_node_anadal.csv'
AS row
MERGE (:Ana_dal {is_bolgesi_ad: row[1], sehir: row[2], mevki: row[3], type: row[4]});
AS row
MERGE (:Ana_dal {is_bolgesi_ad: row[1], sehir: row[2], mevki: row[3], type: row[4]});
LOAD CSV WITH HEADERS FROM 'FILE:///n4j_cift_01_node_anadal.csv'
AS row
CREATE (and:ana_dal)
SET and = row;
AS row
CREATE (and:ana_dal)
SET and = row;
LOAD CSV WITH HEADERS FROM 'FILE:///n4j_cift_02_node_yrd_dal_is_kolu.csv'
AS row
CREATE (yrd:yrd_dal)
SET yrd = row;
AS row
CREATE (yrd:yrd_dal)
SET yrd = row;
LOAD CSV WITH HEADERS FROM 'FILE:///n4j_cift_03_node_uyg_is_kolu.csv'
AS row
CREATE (usk:uyg_kol)
SET usk = row;
AS row
CREATE (usk:uyg_kol)
SET usk = row;
LOAD CSV WITH HEADERS FROM 'FILE:///n4j_cift_04_node_uyg_tip.csv'
AS row
CREATE (utip:uyg_tip)
SET utip = row;
n4j_cift_01_node_anadal
n4j_cift_02_node_yrd_dal_is_kolu
n4j_cift_03_node_uyg_is_kolu
n4j_cift_04_node_uyg_tip
n4j_cift_05_rel_menfaat_iliskisi
n4j_cift_06_rel_uyg_baglantisi
n4j_cift_07_rel_yapilacak_is
AS row
CREATE (utip:uyg_tip)
SET utip = row;
n4j_cift_01_node_anadal
n4j_cift_02_node_yrd_dal_is_kolu
n4j_cift_03_node_uyg_is_kolu
n4j_cift_04_node_uyg_tip
n4j_cift_05_rel_menfaat_iliskisi
n4j_cift_06_rel_uyg_baglantisi
n4j_cift_07_rel_yapilacak_is
Sum
MATCH(n:Person) RETURN SUM(n.salary) as value
(source: https://self-learning-java-tutorial.blogspot.com/search/label/Neo4j - I highly recommend this blog!)
https://neo4j.com/docs/cypher-cheat-sheet/5/all/ cheat sheet
https://neo4j.com/docs/cypher-manual/5/clauses/where/ - Where clause