不懂Neo4j?沒關系,先學增刪改查


從上篇文章中我們了解到了什么是Neo4j、為什么要用Neo4j、什么場景使用 以及怎么安裝,如果您還不想熟悉,點擊此處,傳送過去哦~

既然Neo4j是一個圖數據庫,那么毫無疑問,增刪改查是必不可少的,這篇文章,我們就一起學習下Neo4j對節點以及關系的基本操作。

首先我們打開Neo4j的瀏覽器控制台(http://xxx.xxx.xxx.xxx:7474/browser),用戶名是neo4j,默認密碼也是 neo4j,如果你已經了密碼,那么,就輸入你修改的密碼即可。登陸進去我們會看到如下的界面的,

1578360110721

沒錯,就是在大家最喜歡的美元符號那里輸入 CQL語句的。這里我們拿學生和老師舉例來說明。

一、增加節點

Neo4j使用的是create 命令進行增加,就類似與MySQL中的insert。

1.創建一個學生節點(只有節點,沒有屬性):

create (s:Student)

在美元符號輸入完上面的CQL后,回車 或者 點擊右側的三角號執行按鈕,會看到如下結果:

1578360684013

這說明我們已經創建完了學生節點。

不難看出 create 的語法如下:

create (<node-name>:<label-name>)
  • node-name:它是我們要創建的節點名稱
  • label-name:它是我們要創建的標簽名稱

2.創建一個學生節點(創建具有屬性的節點)

創建一個id為10000,名字為張三,年齡為18歲,性別為男的學生節點

create (s:Student{id:10000, name:"張三",age:18,sex:1}) 

執行后,會看到如下的結果:

1578361203929

這說明我們創建了一個具有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

1578396408822

從上圖可以看到我們剛剛創建的兩個節點,一個是沒有屬性節點,一個是有屬性的節點。兩個節點是以圖的形式展示,我們也可以切換左邊的Graph(圖)、Table(表格)、Text(文本)等來以不同的形式展示。

2.查詢全部或者部分字段

只需要把要展示的字段以節點名 + 點號 + 屬性字段 拼接即可,如下:

match (s:Student) return s.id,s.name,s.age,s.sex

1578396659400

這樣就清楚的看到我們插入的學生屬性信息。因為有一個是沒有屬性的節點,所以表格中第2行顯示的各個值都是null。

3.查詢滿足年齡age等於18的學生信息

match (s:Student) where s.age=18 return s.id,s.name,s.age,s.sex

1578396814805

怎么樣,這條件查詢 是不是和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,意思就是我插入完你要把數據返回給我看下,如下:

1578397558503

這樣,我們的數據就造好了,我們可以先查詢全部的看下:

match (s:Student) return s.id,s.name,s.age,s.sex

1578397776586

上圖的左下角我們可以看到一共有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

1578398132323

很清晰,是以age倒敘排序的。

5.查詢出名字不為null,且按性別分組

這里要注意一點,CQL中的分組和SQL是有所差異的,在CQL中不用顯式的寫group by分組字段,由解釋器自動決定:即未加聚合函數的字段自動決定為分組字段。

match (s:Student) where s.name is not null return s.sex,count(*)

1578398874418

不難看出,上面是按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 

1578400151646

有union,當然也有 union all,這兩個的區別和SQL中也是一樣的。

  • union:對兩個結果集進行並集操作,不包括重復行;
  • union all:對兩個結果集進行並集操作,包括重復行;

7.分頁查詢(每頁4條,查詢第3頁的數據)

match (s:Student) return s.id,s.name,s.sex,s.age skip 8 limit 4

1578401297733

上面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

1578401244837

需要注意的是,這里 用的是中括號,和SQL中是有區別的。

三、增加關系

上面我們介紹了增加單個節點和查詢的知識點。這里我們介紹下增加關系。為了存在關系,我們先創建一個老師節點。

創建一個教語文的年齡為35歲的男的王老師:

create (t:Teacher{id:20001,name:"王老師",age:35,sex:1,teach:"語文"}) return t 

1578404678017

1.假設王老師所教的班級有3個學生:張三、李四、王五,這里我們就要創建王老師 和 3個學生的關系,注意,這里是為兩個現有節點創建關系。

match (t:Teacher),(s:Student) where t.id=20001 and s.id=10000 
create (t)-[teach:Teach]->(s)
return t,teach,s

1578445707072

這樣,王老師和張三的關系就創建了。下面,我們再繼續創建王老師 和 李四、王五的關系。

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

1578445801429

不難發現,創建關系的語法如下:

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>) 

  • node1-name表示節點名稱,label1-name表示標簽名稱
  • relationship-name表示關系節點名稱,relationship-label-name表示關系標簽名稱
  • node2-name表示節點名稱,label2-name表示標簽名稱

老師和學生的關系增加了,我們查詢下:

match (t:Teacher)-[teach:Teach]-(s:Student) return t,teach,s

1578446099722

這關系就很顯然了吧。王老師教張三、李四、王五。

2.我們給廣東和深圳創建關系,深圳是屬於廣東省的。但是並沒有廣東省份節點和深圳市節點,沒錯,我們就是為兩個不存在的節點創建關系。

create (c:City{id:30000,name:"深圳市"})-[belongto:BelongTo{type:"屬於"}]->(p:Province{id:40000,name:"廣東省"})

1578446703909

我們查詢下我們創建的深圳和廣東的關系。

match (c:City{id:30000,name:"深圳市"})-[belongto:BelongTo{type:"屬於"}]->(p:Province{id:40000,name:"廣東省"}) return c,belongto,p

1578446839578

為兩個不存在的節點創建關系的語法如下:

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

1578447197269

三、修改

Neo4j中的修改也和SQL中的是很相似的,都是用set子句。和es一樣,Neo4j CQL set子句也可以向現有節點或關系添加新屬性。

通過上面的查詢,我們已經熟記了學生張三的年齡是18歲,2020年了,張三也長大了一歲,所以我們就需要把張三的年齡改為19。

match (s:Student) where s.name="張三" set s.age=19 return s

1578403440111

從上圖的紅色框中我們可以清晰的看到張三的年齡已經更新到19了。

四、刪除

Neo4j中的刪除也和SQL中的是很相似的,都是delete,當然,除了delete刪除,還有remove刪除。

1.刪除單個節點

這里以刪除學生節點中沒有屬性的來舉例:

先查詢下學生中沒有屬性的節點

match (s:Student) where s.name is null return s 

1578447405826

然后我們再刪除這個節點:

match (s:Student) where s.name is null delete s 

把上面查詢的CQL中的return 改為 delete 就OK了。

執行完上面的刪除CQL后,我們再重新查詢下:

1578447511309

發現已經不存在沒有屬性的學生節點了,這說明我們已經刪除成功了。

2.刪除帶關系的節點

這里我們以刪除廣東和深圳的關系來舉例:

match (c:City{id:30000,name:"深圳市"})-[belongto]->(p:Province{id:40000,name:"廣東省"}) return c,belongto,p

1578447714210

這個時候是有數據的。

然后我們執行下面的刪除CQL,把上面的查詢CQL中的return 改為 delete哦:

match (c:City{id:30000,name:"深圳市"})-[belongto]->(p:Province{id:40000,name:"廣東省"}) delete c,belongto,p

執行完上面的刪除CQL后我,我們重新再查詢下:

1578447832474

發現已經不存在廣東和深圳這兩個節點以及關系了。

3.刪除全部節點已經關系

這里這個CQL主要用作測試的,生產環境可不要執行,否則,真的是從刪庫到跑路了~

match (n) detach delete n

這個CQL就不演示了。

4.刪除節點或關系的現有屬性

可以通過remove來刪除節點或關系的現有屬性。

例如,我們刪除學生李四節點中的sex屬性:

match (s:Student{id:10001}) remove s.sex

執行完上面的remove CQL后,我們重新查詢下:

1578452069113

看到李四的sex屬性為null了。

五、總結

這篇文章就介紹了下Neo4j中的CQL,以及增刪改查,我們也在實踐中和MySQL中的某些SQL做了對比。下篇文章繼續介紹,neo4j在springboot中的應用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM