從上篇文章中咱們瞭解到了什麼是Neo4j、爲何要用Neo4j、什麼場景使用 以及怎麼安裝,若是您還不想熟悉, 點擊此處,傳送過去哦~既然Neo4j是一個圖數據庫,那麼毫無疑問,增刪改查是必不可少的,這篇文章,咱們就一塊兒學習下Neo4j對節點以及關係的基本操做。node
首先咱們打開Neo4j的瀏覽器控制檯(http://xxx.xxx.xxx.xxx:7474/browser),用戶名是neo4j,默認密碼也是 neo4j,若是你已經了密碼,那麼,就輸入你修改的密碼便可。登錄進去咱們會看到以下的界面的,spring
沒錯,就是在你們最喜歡的美圓符號那裏輸入 CQL語句的。這裏咱們拿學生和老師舉例來講明。數據庫
Neo4j使用的是create 命令進行增長,就相似與MySQL中的insert。瀏覽器
1.建立一個學生節點(只有節點,沒有屬性):springboot
create (s:Student)函數
在美圓符號輸入完上面的CQL後,回車 或者 點擊右側的三角號執行按鈕,會看到以下結果:學習
這說明咱們已經建立完了學生節點。測試
不難看出 create 的語法以下:spa
create (<node-name>:<label-name>)3d
2.建立一個學生節點(建立具備屬性的節點)
建立一個id爲10000,名字爲張三,年齡爲18歲,性別爲男的學生節點
create (s:Student{id:10000, name:"張三",age:18,sex:1})
執行後,會看到以下的結果:
這說明咱們建立了一個具備id,name,age,sex四個屬性的s節點。
不難理解,id、name、age、sex,就相似咱們MySQL中 表中的字段同樣。
建立帶屬性的節點語法以下:
create (<node-name>:<label-name> {
<property1-name>:<property1-Value>,
<property2-name>:<property2-Value>,
...,
<property3-name>:<property3-Value>
})
property1-name就是屬性名稱,property1-Value就是屬性值。
咱們在上一步建立了沒有屬性的節點和有屬性的節點,那麼問題來了,咱們怎麼查看呢?查詢咯~
Neo4j使用的是match ... return ... 命令進行查詢,就相似與MySQL中的select。
咱們查詢剛剛建立的節點信息。
1.所有查詢學生
match (s:Student) return s
從上圖能夠看到咱們剛剛建立的兩個節點,一個是沒有屬性節點,一個是有屬性的節點。兩個節點是以圖的形式展現,咱們也能夠切換左邊的Graph(圖)、Table(表格)、Text(文本)等來以不一樣的形式展現。
2.查詢所有或者部分字段
只須要把要展現的字段以節點名 + 點號 + 屬性字段 拼接便可,以下:
match (s:Student) return s.id,s.name,s.age,s.sex
這樣就清楚的看到咱們插入的學生屬性信息。由於有一個是沒有屬性的節點,因此表格中第2行顯示的各個值都是null。
3.查詢知足年齡age等於18的學生信息
match (s:Student) where s.age=18 return s.id,s.name,s.age,s.sex
怎麼樣,這條件查詢 是否是和MySQL的很類似。固然還有排序、分組、聯合、分頁等。爲了能更好的演示這幾種,咱們先插入一部分數據,逐條插入:
create (s:Student{id:10001, name:"李四",age:18,sex:1}) return s
create (s:Student{id:10002, name:"王五",age:19,sex:1}) return s
create (s:Student{id:10003, name:"趙六",age:20,sex:1}) return s
create (s:Student{id:10004, name:"周七",age:17,sex:0}) return s
create (s:Student{id:10005, name:"孫八",age:23,sex:1}) return s
create (s:Student{id:10006, name:"吳九",age:15,sex:1}) return s
create (s:Student{id:10007, name:"鄭十",age:19,sex:0}) return s
create (s:Student{id:10008, name:"徐十一",age:18,sex:1}) return s
create (s:Student{id:10009, name:"朱十二",age:21,sex:1}) return s
create (s:Student{id:10010, name:"譚十三",age:22,sex:1}) return s
這個咱們在create 的語句後面加上了return,意思就是我插入完你要把數據返回給我看下,以下:
這樣,咱們的數據就造好了,咱們能夠先查詢所有的看下:
match (s:Student) return s.id,s.name,s.age,s.sex
上圖的左下角咱們能夠看到一共有12條數據。一條沒有屬性的 + 11條有屬性的。
4.查詢出全部的男生(sex=1)並按年齡倒敘排序
match (s:Student) where s.sex=1 return s.id,s.name,s.age,s.sex order by s.age desc
很清晰,是以age倒敘排序的。
5.查詢出名字不爲null,且按性別分組
這裏要注意一點,CQL中的分組和SQL是有所差別的,在CQL中不用顯式的寫group by分組字段,由解釋器自動決定:即未加聚合函數的字段自動決定爲分組字段。
match (s:Student) where s.name is not null return s.sex,count(*)
不難看出,上面是按sex字段分組的。
6.union聯合查詢(查詢性別爲男或者女的,且年齡爲19歲的學生)
match (s:Student) where s.sex=1 and s.age=19 return s.id,s.name,s.sex,s.age
union
match (s:Student) where s.sex=0 and s.age=19 return s.id,s.name,s.sex,s.age
有union,固然也有 union all,這兩個的區別和SQL中也是同樣的。
7.分頁查詢(每頁4條,查詢第3頁的數據)
match (s:Student) return s.id,s.name,s.sex,s.age skip 8 limit 4
上面CQL中的skip表示跳過多少條,limit表示獲取多少條。每頁4條,查詢第三頁的數據,也就是跳過前8條,查詢4條,或者說從第8條開始,不包括第8條,而後再查詢4條。
8.in操做(查詢id爲10001和10005的兩個數據)
match (s:Student) where s.id in [10001,10005] return s.id,s.name,s.sex,s.age
須要注意的是,這裏 用的是中括號,和SQL中是有區別的。
上面咱們介紹了增長單個節點和查詢的知識點。這裏咱們介紹下增長關係。爲了存在關係,咱們先建立一個老師節點。
建立一個教語文的年齡爲35歲的男的王老師:
create (t:Teacher{id:20001,name:"王老師",age:35,sex:1,teach:"語文"}) return t
1.假設王老師所教的班級有3個學生:張3、李4、王五,這裏咱們就要建立王老師 和 3個學生的關係,注意,這裏是爲兩個現有節點建立關係。
match (t:Teacher),(s:Student) where t.id=20001 and s.id=10000
create (t)-[teach:Teach]->(s)
return t,teach,s
這樣,王老師和張三的關係就建立了。下面,咱們再繼續建立王老師 和 李4、王五的關係。
match (t:Teacher),(s:Student) where t.id=20001 and s.id=10001
create (t)-[teach:Teach]->(s)
return t,teach,s
match (t:Teacher),(s:Student) where t.id=20001 and s.id=10002
create (t)-[teach:Teach]->(s)
return t,teach,s
不難發現,建立關係的語法以下:
match (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
where <condition>
create (<node1-label-name>)-[<relationship-label-name>:<relationship-name>]
->(<node2-label-name>)
或者
match (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
where <condition>
create (<node1-label-name>)-[<relationship-label-name>:<relationship-name>
{<relationship-properties>}\]->(<node2-label-name>)
老師和學生的關係增長了,咱們查詢下:
match (t:Teacher)-[teach:Teach]-(s:Student) return t,teach,s
這關係就很顯然了吧。王老師教張3、李4、王五。
2.咱們給廣東和深圳建立關係,深圳是屬於廣東省的。可是並無廣東省份節點和深圳市節點,沒錯,咱們就是爲兩個不存在的節點建立關係。
create (c:City{id:30000,name:"深圳市"})-[belongto:BelongTo{type:"屬於"}]->(p:Province{id:40000,name:"廣東省"})
咱們查詢下咱們建立的深圳和廣東的關係。
match (c:City{id:30000,name:"深圳市"})-[belongto:BelongTo{type:"屬於"}]->(p:Province{id:40000,name:"廣東省"}) return c,belongto,p
爲兩個不存在的節點建立關係的語法以下:
create (<node1-name>:<label1-name>
{<property1-name>:<property1-Value>, <property1-name>:<property1-Value>})-
[(<relationship-name>:<relationship-label-name>{<property-name>:<property-Value>})]
->(<node2-name>:<label2-name>
{<property1-name>:<property1-Value>, <property1-name>:<property1-Value>})
固然,屬性都非必填的,只是爲了更加準確。
若是咱們要查詢Neo4j中所有的關係須要怎麼寫CQL呢,以下:
match (a)-[b]-(c) return a,b,c
Neo4j中的修改也和SQL中的是很類似的,都是用set子句。和es同樣,Neo4j CQL set子句也能夠向現有節點或關係添加新屬性。
經過上面的查詢,咱們已經熟記了學生張三的年齡是18歲,2020年了,張三也長大了一歲,因此咱們就須要把張三的年齡改成19。
match (s:Student) where s.name="張三" set s.age=19 return s
從上圖的紅色框中咱們能夠清晰的看到張三的年齡已經更新到19了。
Neo4j中的刪除也和SQL中的是很類似的,都是delete,固然,除了delete刪除,還有remove刪除。
1.刪除單個節點
這裏以刪除學生節點中沒有屬性的來舉例:
先查詢下學生中沒有屬性的節點
match (s:Student) where s.name is null return s
而後咱們再刪除這個節點:
match (s:Student) where s.name is null delete s
把上面查詢的CQL中的return 改成 delete 就OK了。
執行完上面的刪除CQL後,咱們再從新查詢下:
發現已經不存在沒有屬性的學生節點了,這說明咱們已經刪除成功了。
2.刪除帶關係的節點
這裏咱們以刪除廣東和深圳的關係來舉例:
match (c:City{id:30000,name:"深圳市"})-[belongto]->(p:Province{id:40000,name:"廣東省"}) return c,belongto,p
這個時候是有數據的。
而後咱們執行下面的刪除CQL,把上面的查詢CQL中的return 改成 delete哦:
match (c:City{id:30000,name:"深圳市"})-[belongto]->(p:Province{id:40000,name:"廣東省"}) delete c,belongto,p
執行完上面的刪除CQL後我,咱們從新再查詢下:
發現已經不存在廣東和深圳這兩個節點以及關係了。
3.刪除所有節點已經關係
這裏這個CQL主要用做測試的,生產環境可不要執行,不然,真的是從刪庫到跑路了~
match (n) detach delete n
這個CQL就不演示了。
4.刪除節點或關係的現有屬性
能夠經過remove來刪除節點或關係的現有屬性。
例如,咱們刪除學生李四節點中的sex屬性:
match (s:Student{id:10001}) remove s.sex
執行完上面的remove CQL後,咱們從新查詢下:
看到李四的sex屬性爲null了。
這篇文章就介紹了下Neo4j中的CQL,以及增刪改查,咱們也在實踐中和MySQL中的某些SQL作了對比。下篇文章繼續介紹,neo4j在springboot中的應用。