查詢1
https://www.cnblogs.com/zhengshiqiang47/p/8488490.html
一,Node語法
1,() 代表匹配任意一個節點
2, (node1) 代表匹配任意一個節點,並給它起了一個別名
3, (:Lable) 代表查詢一個型別的資料
4, (person:Lable) 代表查詢一個型別的資料,並給它起了一個別名
5, (person:Lable {name:"小王"}) 查詢某個型別下,節點屬性滿足某個值的資料
6, (person:Lable {name:"小王",age:23}) 節點的屬性可以同時存在多個,是一個AND的關係
二,關係語法
1,--> 指向一個節點
2,-[role]-> 給關係加個別名
3,-[:acted_in]-> 訪問某一類關係
4,-[role:acted_in]-> 訪問某一類關係,並加了別名
5,-[role:acted_in {roles:["neo","hadoop"]}]-> 訪問某一類關係下的某個屬性的關係的資料
三,模式語法
(p1: Person:Actor {name:"tom"})-[role:acted_in {roles:["neo","actor"]}]-(m1:Movie {title:"water"})
四, 模式變數
為了增加模組化和減少重複,cypher允許把模式的結果指定在一個變數或者別名中,方便後續使用或操作
path = (: Person)-[:ACTED_IN]->(:Movie)
path是結果集的抽象封裝,有多個函式可以直接從path裡面提取資料如:
nodes(path):提取所有的節點
rels(path): 提取所有的關係 和relationships(path)相等
length(path): 獲取路徑長度
五,條件
1,建立
create (:Movie {title:"驢得水",released:2016}) return p;
2,查詢
match (p: Person) return p; 查詢Person型別的所有資料
match (p: Person {name:"sun"}) return p; 查詢名字等於sun的人
match( p1: Person {name:"sun"} )-[rel:friend]->(p2) return p2.name , p2.age 查詢sun的朋友的名字和年齡
match (old) ... create (new) create (old)-[rel:dr]->(new) return new 對已經存在的節點和新建的節點建立關係
3,查詢或更新
merge 語法可以對已經存在的節點不做改變,對變化的部分會合並
MERGE (m:Movie { title:"Cloud Atlas" })ON CREATE SET m.released = 2012RETURN m
merge .... on create set ... return 語法支援合併更新
4,篩選過濾
cypher過濾也是用的和SQL一樣的關鍵詞where
match (p1: Person) where p1.name="sun" return p1;
等同下面的
match (p1: Person {name:"sun"}) return p1
注意where條件裡面支援 and , or ,xor,not等boolean運算子,在json串裡面都是and
除此之外,where裡面查詢還支援正則查詢
match (p1: Person)-[r:friend]->(p2: Person)
where p1.name=~"K.+" or p2.age=24 or "neo" in r.rels
return p1,r,p2
關係過濾匹配使用not
MATCH (p:Person)-[:ACTED_IN]->(m)WHERE NOT (p)-[:DIRECTED]->()RETURN p,m
5,結果集返回
MATCH (p:Person)RETURN p, p.name AS name, upper(p.name), coalesce(p.nickname,"n/a") AS nickname, { name: p.name, label:head(labels(p))} AS person
結果集返回做去重
match (n) return distinct n.name;
6,聚合函式
cypher支援count,sum,avg,min,max
match (: Person) return count(*)
聚合的時候null會被跳過 count 語法 支援 count( distinct role )
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(director:Person)RETURN actor,director,count() AS collaborations
7,排序和分頁
MATCH (a:Person)-[:ACTED_IN]->(m:Movie)RETURN a,count() AS appearancesORDER BY appearances DESC SKIP 3 LIMIT 10;
8, 收集聚合結果
MATCH (m:Movie)<-[:ACTED_IN]-(a:Person)
RETURN m.title AS movie, collect(a.name) AS cast, count(*) AS actors
9, union 聯合
支援兩個查詢結構集一樣的結果合併
MATCH (actor:Person)-[r:ACTED_IN]->(movie:Movie)
RETURN actor.name AS name, type(r) AS acted_in, movie.title AS title
UNION (ALL)
MATCH (director:Person)-[r:DIRECTED]->(movie:Movie)
RETURN director.name AS name, type(r) AS acted_in, movie.title AS title
10, with
with語句給cypher提供了強大的pipeline能力,可以一個或者query的輸出,或者下一個query的輸入 和return語句非常類似,唯一不同的是,with的每一個結果,必須使用別名標識。
通過這個功能,我們可以輕而易舉的做到在查詢結果裡面在繼續巢狀查詢。
MATCH (person:Person)-[:ACTED_IN]->(m:Movie)
WITH person, count(*) AS appearances, collect(m.title) AS movies
WHERE appearances > 1RETURN person.name, appearances, movies
注意在SQL裡面,我們想過濾聚合結果,需要使用having語句但是在cypher裡面我們可以配合with語句使用 where關鍵詞來完成過濾
11,新增約束或者索引
唯一約束(使用merge來實現) CREATE CONSTRAINT ON (movie:Movie) ASSERT movie.title IS UNIQUE
新增索引(在圖譜遍歷時,快速找到開始節點),大幅提高查詢遍歷效能 CREATE INDEX ON :Actor(name)
新增測試資料:
CREATE (actor:Actor { name:"Tom Hanks" }),(movie:Movie { title:‘Sleepless IN Seattle‘ }),
(actor)-[:ACTED_IN]->(movie);
使用索引查詢:
MATCH (actor:Actor { name: "Tom Hanks" })RETURN actor;