cypher查詢務必在需要查詢的節點上加上標籤,否則資料量一大查詢就會非常慢(在查詢時必須設定實體標籤,否則不走索引),另外Neo4j索引做好了查詢的優化基本上就完成了80%。需要注意index是建立在label上的,不是在node上,所以一個node有多個label,需要對每一個label都建立index。直接根據ID查詢效率也比較高。
一、索引的建立分為單屬性索引和複合索引:
1、建立單屬性索引
CREATE INDEX ON :地(name);
2、建立複合索引
CREATE INDEX ON :賬號(name,event_site_name,site_name);
3、建立唯一限制(多屬性聯合唯一限制社群版本目前不支援)
CREATE CONSTRAINT ON(n:地)ASSERT n.name IS UNIQUE;
二、常用查詢
1、 刪除節點和關係
match p=(n)-[r]-(m) where n.name=~'.*name.*' delete n,r;
match p=(n)-[r]-(m) where n.name contains 'name' delete n,r; // 模糊查詢也可以使用非正則的形式(關鍵字)
2、.刪除節點(刪除時知識圖譜全是獨立的實體節點沒有關係,如果存在關係必須先刪除關係)
match(n:事 {name:'2'}) delete n;
3、刪除所有節點和關係
match(n) OPTIONAL MATCH (n)-[r]-() DELETE n,r
4、查詢所有節點
match(n) return n;
5、通過name查詢節點
Match (n:人) where n.姓名='李澤鉅' return n
6、通過關係型別查詢-過濾與青海省有隸屬關係的市
MATCH (省 { NAME:'青海省' })<-[:隸屬關係]-(市) RETURN 市;
7、關聯節點的name
MATCH (省 { NAME:'青海省' })--(市) RETURN 市.NAME
MATCH (省 { NAME:'青海省' })-[]-(市) RETURN 市.NAME
8、帶索引的查詢會更快速
MATCH (n:地 { NAME:'青海省' })--(m:市) RETURN m;
9、查詢關係的名稱
match( p1:市 {NAME:"西寧市"} )-[rel:隸屬關係]->(p2) return p2.NAME
10、距離為1到3的關聯節點
match(n:國家 {NAME:'中國'})-[*1..3]-(p) return n,p;
[ ] 括號內n的意義:
n 距離為n
..n 最大距離為n
n.. 最小距離為n
m..n 距離在m到n之間
11、國家省市區縣
match p=(n:國家 {NAME:'中國'})-[:隸屬關係*..2]-(m) with *,relationships(p) as r return n,m;
12、多標籤查詢
match (n:人:演員) return n;
13、通過節點ID查詢
match (user)-[:主要成就]->(p) where id(user)=71 return p;
match (n) WHERE id(n)=99815 RETURN n;
14、通過多個節點ID查詢
start user=node(71,68) match (user)-[:主要成就]->(p) return p;
15、刪除帶有關係的節點
start grace=node(10) match grace-[r]-() delete grace,r
16、更新節點屬性
start user=node(1,2) set user.group='ADMINISTRATOR'
17、刪除節點屬性
start n=node(1) delete n.group;
18、刪除關係
start grace=node(69) match (grace)-[r:妻子]-() delete r
start grace=node(71) match (grace)-[r:妻子]->(p:人 {name:'莊月明'}) delete r
19、刪除節點與關係
start grace=node(89264) match (grace)-[r]-() delete grace,r
20、match子句和create的組合,MERGE子句
MERGE (michael:Person { name: 'Michael Douglas' }) RETURN michael;
21、人員距離為N的時候尋找與之有關聯的人員
match p=(n:人 {name:'WQ111'})-[*..2]-(m:人) with *,relationships(p) as r return n,m;
22、統計當前圖資料庫的節點數量
MATCH (n) RETURN count(n);
23、統計當前圖資料庫的關係數量
MATCH ()-->() RETURN count(*);
24、What kind of nodes exist. Sample some nodes, reporting on property and relationship counts per node.
MATCH (n) WHERE rand() <= 0.1
RETURN
DISTINCT labels(n),
count(*) AS SampleSize,
avg(size(keys(n))) as Avg_PropertyCount,
min(size(keys(n))) as Min_PropertyCount,
max(size(keys(n))) as Max_PropertyCount,
avg(size( (n)-[]-() ) ) as Avg_RelationshipCount,
min(size( (n)-[]-() ) ) as Min_RelationshipCount,
max(size( (n)-[]-() ) ) as Max_RelationshipCount
25、What is related, and how(Neo4j函式可以在Cypher語句的任何關鍵字附近使用,而過程非也)
CALL db.schema() // Neo4j過程(這些是Neo4j自帶過程,非自定義過程)
26、List node labels
CALL db.labels()
27、List relationship types
CALL db.relationshipTypes()
28、Display constraints and indexes
:schema
29、查詢與周迅有直接關係的明星
match m=(:明星 {名稱:'周迅'})-[*..1]-() return m;
30、查詢周迅與王菲的最短路徑
MATCH p = shortestPath((周迅:明星 {名稱:"周迅"})-[*..6]-(王菲:明星 {姓名:"王菲"}))RETURN p;
31、查詢周迅與王菲的所有最短路徑
MATCH p = allShortestPaths((周迅:明星 {名稱:'周迅'})-[*..6]-(王菲:明星 {姓名:'王菲'})) RETURN p;
match p=allshortestpaths((n:People {name:'蔡成功'})-[*..6]-(m:People {name:'季昌明'})) return p;
32、查詢股票與股東的關係
match m=(h:Holder)-->(s:Stock) where s.name=~".*五礦.*" return m;
33、給已經存在的人新增關係
Match (n:Person {id:'erzi'}),(f:Person {id:'bozi'}) Merge (n)-[:fuqi]->(f)
34、兒子和柏之結婚了,relation修改
Match (n:Person ),(f:Person)
where n.id='erzi' and f.id='bozi'
Merge (n)-[r:fuqi]->(f) delete r
Merge (n)-[:FUQI]->(f)
return n,f
35、更新屬性
Match (n:Person {id:'baba'}) set n.name='張三' return n;
36、刪除label
MATCH (n:Test) remove n:Test
remove和delete都應該與match命令一起使用,
DELETE操作用於刪除節點和relation。
REMOVE操作用於刪除標籤label和屬性。
37、刪除與該關係相關的老師和學生及label
MATCH (s:Teacher)-[r:teach]->(d:Student) delete r,s,d
38、更新屬性
Match (n:Person {id:'baba'}) set n.name='張三' return n;
39、僅僅刪除一個relation
Match (a:Person),(b:Person) where a.id='erzi' and b.id='bozi' merge (a)-[r:FUQI]->(b) DELETE r
40、排序 order by
-降序 MATCH (n:Person) RETURN n order by n.id,n.name desc LIMIT 25
--正序 MATCH (n:Person) RETURN n order by n.id LIMIT 25
41、Limit 和 skip
Limit : 顯示多少行,最前邊開始, Skip:跳過前多少行
MATCH (n:Person) RETURN n order by n.id desc skip 2 LIMIT 25
42、Union 和 union all
Union:把多段Match的return結果 上線組合成一個結果集,會自動去掉重複行;
Union all:作用同union,但不去重;
eg. MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all MATCH (n:Person) where n.id='erzi' RETURN n.id,n.age
43、Null需要注意什麼
eg. MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all MATCH (n:Person) where n.id='erzi' and n.age is not null RETURN n.id,n.age
Where 屬性 is null or is not null
44、In語法
MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all MATCH (n:Person) where n.id in ['erzi','bozi','baba'] RETURN n.id,n.age
45、內建 id
Create (a:Person {id:’123’}) //這裡的ID是一個屬性,和內建ID是兩碼事
通過函式id(node/relation)可以獲取id值
46、索引index(根據需要把查詢多的欄位建索引(create index on :Person(name))