為什么需要圖數(shù)據(jù)庫肚吏?
?????現(xiàn)在,業(yè)務需求的頻繁變動和數(shù)據(jù)之間的復雜聯(lián)系都需要數(shù)據(jù)庫有很強的適應力。對于傳統(tǒng)關系型數(shù)據(jù)庫分扎,對于復雜的數(shù)據(jù)關系并不能很好的展現(xiàn)。比如社交網站的用戶關系胧洒,錯綜復雜就像一張網 畏吓。對于這種數(shù)據(jù),圖數(shù)據(jù)庫就能很好以圖結構來存儲卫漫。
聯(lián)系才是數(shù)據(jù)本質的存在
聊聊neo4j的CQL操作
CQL
CQL是neo4j的圖形查詢語言菲饼。【Cyther(友情提示:賽粉兒) Query Language】
圖數(shù)據(jù)庫有什么列赎?
最簡單的回答:點和邊昂暝谩!
正經一點回答:點代表一個節(jié)點信息,邊代表節(jié)點信息之間的關系饼煞。點和邊都可以具有屬性源葫,以鍵值對的形式。
創(chuàng)建節(jié)點
語法結構:create (<node-name>:<label-name>)
節(jié)點名稱砖瞧、標簽名稱息堂。
create (p:phone) //創(chuàng)建了一個沒有屬性的節(jié)點,這個節(jié)點是個phone块促,具體是什么phone看使用者是如何定義了
create (p:phone{type:"phone",phoneNumber:"181XXXX3333"}) //創(chuàng)建了一個有屬性的節(jié)點荣堰,想必這種形式大家不陌生。對竭翠,就是你們想的那樣振坚。并且,type也只是屬性之一逃片,并不是必須的屡拨。
按照以上格式,我們可以創(chuàng)建多個褥实。如果想要在創(chuàng)建的時候看到創(chuàng)建結果可以在后面追加
return p;
create (p:phone) return p;
eg2:
create (b:bag{color:"red"}),(b2:bag{color:"green"})
創(chuàng)建關系
關系是節(jié)點與節(jié)點之間的關聯(lián)呀狼。
關系分為單向和雙向。創(chuàng)建關系時請帶上箭頭>或者<损离。
語法:
match:匹配
where:在某某條件前提下
return:返回一個而結果哥艇,返回什么由后面內容決定
在明確這些前提之后。我們可以這樣:
- 已有節(jié)點之間創(chuàng)建無屬性的關系
eg1:
match (p1:phone{phone:"18145626687"}),(p2:phone{phone:"13415556888"})
create (p1)-[r:call]->(p2)
return r;
eg2:
match (b1:bag{color:"red"}),(b2:bag{color:"green"}) create (b1)-[r:mixWith]->(b2) return r;
根據(jù)上列CQL僻澎,相信大家還是能讀懂字面意思貌踏。就是我要match倆phone節(jié)點,他們分別是具有某某電話的屬性窟勃。然后我create一個鏈路祖乳,從p1到p2,中間中括號是r:call秉氧,還有個方向鍵眷昆。
即創(chuàng)建一個關系,這個關系是從a到b的汁咏,然后關系的名字是call亚斋。
其中p1和p2就像是對象一樣,隨便叫什么攘滩。
同理帅刊,我們還可以有另一種寫法,把where用上
match (p1:phone),(p2:phone)
where p1.phone="18145626687" and p2.phone="13415556888"
create (p1)-[r:call]->(p2)
return r;
//創(chuàng)建關系
- 已有節(jié)點之間創(chuàng)建有屬性的關系
match (p1:phone),(p2:phone)
where p1.phone="18145626687" and p2.phone="13415556888"
create (p1)<-[r:call{sumTime:"30.22",counts:"3"}]-(p2)
return r;//可要可以不要這一句漂问,只是看看返回結果
- 沒有節(jié)點赖瞒,直接創(chuàng)建節(jié)點和關系
create (h1:hero{name:"ez",age:"18"})-[r:loves{loveTime:"10"}]->(h2:hero{name:"lux",age:"16"})
查詢
語法:match 匹配 + return 返回
單獨使用match是會報錯的女揭,因為只是匹配沒有返回
where 用于篩選條件
with 在return之前進行特殊處理,值得注意的一點是如果return返回某個值冒黑,這個值要在with中申明田绑。
//普通查找節(jié)點
match (pn:hero) where pn.name="ez" return pn;
match res=(pn:hero) where pn.name="ez" return res;
match (pn:hero{name:"ez"}) return pn;
//排序查找節(jié)點
match res=(p1:hero) return res order by p1.age desc;
//普通查找關系
match res = (p1:hero{name:"ez"})-[r:loves]->(p2:hero) return res; //返回ez愛上了誰,
match res = (p1:hero{name:"ez"})<-[r:loves]-(p2:hero) return res; //返回誰愛ez抡爹,
match res = (p1:hero{name:"ez"})-[r:loves]-(p2:hero) return res; //返回誰和ez相愛了掩驱,
match res = (p1:hero{name:"ez"})-[r:loves]-() return res; //返回ez喜歡的任何東西,除了人還有其他的冬竟,
聚合查找
with 在where后對搜索結果進行二次處理時需要用到
distinct 去重欧穴,可以對節(jié)點去重也可以對節(jié)點的屬性去重
as 重命名(和sql一樣)
count(*)計數(shù)
sum(屬性值的累加) avg、min泵殴、max
沒有group by涮帘。
這里隨便寫一個
match res=(p1:hero{name:"ez"})-[r:loves]->(p2:hero) with distinct p2.name as lover return p1,lover; //返回ez和ez愛上的人,并且出現(xiàn)同名的則只要顯示一個名字就可以了
刪除節(jié)點笑诅、關系
delete 刪除節(jié)點或者關系调缨,刪除節(jié)點時,如果存在關系則刪不掉
match (p:hero{name:"lux"}) delete p;
Neo.ClientError.Schema.ConstraintValidationFailed: Cannot delete node<106743711>, because it still has relationships. To delete this node, you must first delete its relationships.
match (p1:hero{name:"ez"})-[r:loves]->(p2:hero{name:"lux"}) delete r,p2; //刪除關系r和節(jié)點p2吆你。ez不愛拉克絲了弦叶。
待續(xù)。妇多。伤哺。。