不懂Neo4j?沒關係,先學增刪改查
從上篇文章中我們瞭解到了什麼是Neo4j、為什麼要用Neo4j、什麼場景使用 以及怎麼安裝,如果您還不想熟悉,點選此處,傳送過去哦~
既然Neo4j是一個圖資料庫,那麼毫無疑問,增刪改查是必不可少的,這篇文章,我們就一起學習下Neo4j對節點以及關係的基本操作。
首先我們開啟Neo4j的瀏覽器控制檯(http://xxx.xxx.xxx.xxx:7474/browser),使用者名稱是neo4j,預設密碼也是 neo4j,如果你已經了密碼,那麼,就輸入你修改的密碼即可。登陸進去我們會看到如下的介面的,
沒錯,就是在大家最喜歡的美元符號那裡輸入 CQL語句的。這裡我們拿學生和老師舉例來說明。
一、增加節點
Neo4j使用的是create 命令進行增加,就類似與MySQL中的insert。
1.建立一個學生節點(只有節點,沒有屬性):
create (s:Student)
在美元符號輸入完上面的CQL後,回車 或者 點選右側的三角號執行按鈕,會看到如下結果:
這說明我們已經建立完了學生節點。
不難看出 create 的語法如下:
create (<node-name>:<label-name>)
- node-name:它是我們要建立的節點名稱
- label-name:它是我們要建立的標籤名稱
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中也是一樣的。
- union:對兩個結果集進行並集操作,不包括重複行;
- union all:對兩個結果集進行並集操作,包括重複行;
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個學生的關係,注意,這裡是為兩個現有節點建立關係。
match (t:Teacher),(s:Student) where t.id=20001 and s.id=10000
create (t)-[teach:Teach]->(s)
return t,teach,s
這樣,王老師和張三的關係就建立了。下面,我們再繼續建立王老師 和 李四、王五的關係。
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>)
- node1-name表示節點名稱,label1-name表示標籤名稱
- relationship-name表示關係節點名稱,relationship-label-name表示關係標籤名稱
- node2-name表示節點名稱,label2-name表示標籤名稱
老師和學生的關係增加了,我們查詢下:
match (t:Teacher)-[teach:Teach]-(s:Student) return t,teach,s
這關係就很顯然了吧。王老師教張三、李四、王五。
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中的應用。