Cypher 語句實戰
下載下傳和安裝
Neo4j windows 桌面版- 環境設定
https://www.w3cschool.cn/neo4j/neo4j_exe_environment_setup.html
Neo4j - 解壓版環境設定
https://www.w3cschool.cn/neo4j/neo4j_zip_environment_setup.html
Cypher語言的關鍵字不區分大小寫,但是屬性值,标簽,關系類型和變量是區分大小寫的。
Neo4j中不存在表的概念,隻有标簽(labels),節點(Node),關聯(Relation),路徑(path),标簽裡存的節點,節點和關聯可以簡單了解為圖裡面的點和邊,路徑是用節點和關聯表示的如:(a)-[r]->(b),表示一條從節點a經關聯r到節點b的路徑。
在資料查詢中,節點一般用小括号(),關聯用中括号[]。
1.建立節點
建立Person 标簽,劉德華等若幹節點,各自有name,birthday ,born,englishname等屬性
create (n:Person { name: '劉德華', birthday:'1961年9月27日',born: 1961 ,englishname:'Andy Lau'})
create (n:Person { name: '朱麗倩', birthday:'1966年4月6日',born: 1966 ,englishname:'Carol'}) ;
create (n:Person { name: '劉向蕙', birthday:'2012年5月9日',born: 2012 ,englishname:'Hanna'}) ;
create (n:Person { name: '任賢齊', birthday:'1966年6月23日',born: 1966 ,englishname:'Richie Jen'}) ;
create (n:Person { name: '金城武', birthday:'1973年10月11日',born: 1973,englishname:'Takeshi Kaneshiro'}) ;
create (n:Person { name: '林志玲', birthday:'1974年11月29日',born: 1974,englishname:'zhilin'}) ;
建立Movie 标簽,彩雲曲等若幹節點,各自有title,released 等屬性
create (n:Movie { title: '彩雲曲',released: 1981})
create (n:Movie { title: '神雕俠侶',released: 1983})
create (n:Movie { title: '暗戰',released: 2000})
create (n:Movie { title: '拆彈專家',released: 2017})
2.查詢節點
2.1 查詢整個圖形資料庫:
點選節點,檢視節點的屬性,如圖,Neo4j自動為節點設定ID值
match(n) return n;
2.2 查詢具有指定标簽的節點
查詢Movie标簽下的節點
match(n:Movie) return n;
2.3 where 謂詞查詢
查詢名稱為林志玲的節點
match (n:Person) where n.name='林志玲' return n
查詢born屬性小于1967的節點
match(n) where n.born<1967 return n;
3.建立關系
關系的構成:StartNode - [Variable:RelationshipType{Key1:Value1,Key2:Value2}] -> EndNode,在建立關系時,必須指定關系類型。
3.1 建立沒有任何屬性的關系
MATCH (a:Person),(b:Movie) WHERE a.name = '劉德華' AND b.title = '暗戰' CREATE (a)-[r:DIRECTED]->(b) RETURN r;
3.2 建立關系,并設定關系的屬性
MATCH (a:Person),(b:Movie) WHERE a.name = '劉德華' AND b.title = '神雕俠侶' CREATE (a)-[r:出演 { roles:['楊過'] }]->(b) RETURN r;
3.3 建立雙向關系
劉德華的女是劉向蕙,劉向蕙的父親是劉德華
MATCH (a:Person),(c:Person)
WHERE a.name = '劉德華' AND c.name = '劉向蕙'
CREATE (a)-[r:父親 { nickname:'甜心' }]->(c),
(c)-[d:女兒 { nickname:'爹地' }]->(a)
RETURN r;
關系建錯了 删除關系 (見5.2 )
重新建立
CREATE (a)-[d:女兒 { nickname:'甜心' }]->(c),
(c)-[r:父親 { nickname:'爹地' }]->(a)
MATCH (a:Person),(c:Movie)
WHERE a.name = '劉德華' AND c.title = '彩雲曲'
CREATE (a)-[r:出演 { partner:'張國榮' }]->(c),
(c)-[d:演員 { rolename:'阿華哥' }]->(a)
WHERE a.name = '劉德華' AND c.title = '拆彈專家'
CREATE (a)-[r:出演 { partner:'趙薇,高圓圓' }]->(c),
(c)-[d:演員 { rolename:'華仔' }]->(a)
WHERE a.name = '劉德華' AND c.title = '神雕俠侶'
CREATE (a)-[r:出演 { partner:'劉亦菲' }]->(c),
(c)-[d:演員 { rolename:'楊過' }]->(a)
繼續新增關系 劉德華和林志玲,金城武,任賢齊
WHERE a.name = '劉德華' AND c.name = '任賢齊'
CREATE (a)-[d:朋友 { sex:'男' }]->(c)
RETURN d;
WHERE a.name = '劉德華' AND c.name = '金城武'
這裡沒有給關系設定屬性sex
WHERE a.name = '劉德華' AND c.name = '林志玲'
CREATE (a)-[d:朋友]->(c)
查詢Person關系
MATCH (n:Person) RETURN n
4 查詢關系
在Cypher中,關系分為三種:符号“--”,表示有關系,忽略關系的類型和方向;符号“-->”和“<--”,表示有方向的關系;
4.1 查詢整個資料圖形
4.2 查詢跟指定節點有關系的節點
查詢跟Movie标簽有關系的所有節點
4.3,查詢有向關系的節點
查詢和劉德華有關系的電影
MATCH (:Person { name: '劉德華' })-->(movie)RETURN movie;
4.4 為關系命名
通過[r]為關系定義一個變量名,通過函數type擷取關系的類型
MATCH (:Person { name: '劉德華' })-[r]->(movie) RETURN r,type(r);
4.5 查詢特定的關系類型
通過[Variable:RelationshipType{Key:Value}]指定關系的類型和屬性
MATCH (:Person { name: '劉德華' })-[r:出演{partner:'張國榮'}]->(Movie) RETURN r,type(r);
查詢和劉德華和張國榮合作過的電影
MATCH (:Person { name: '劉德華' })-[r:出演{partner:'張國榮'}]->(m:Movie) RETURN m;
查詢被劉德華稱呼為甜心的女兒
MATCH (:Person { name: '劉德華' })-[r:女兒{nickname:'甜心'}]->(m:Person) return m
查詢劉德華的老婆是誰
Match (n:Person{name: '劉德華'})-[:wife]->(a:Person) return a
劉德華出演過的電影
5 删除
5.1删除節點
create (n:City { name: '北京'})
Match (n:City{name:'北京'}) delete n
5.2 删除關系
Match (a:Person{name:'劉德華'})-[r:父親]->(b:Person{name:'劉向蕙'}) delete r
Match (a:Person{name:'劉向蕙'})-[r:女兒]->(b:Person{name:'劉德華'}) delete r
6 常用查詢關鍵詞
6.1 count
查詢Person 一共有多少人
Match (n:Person ) return count(n)
查詢标簽(Person)中born=1966的一共有多少節點(人):
三種寫法(第三種不能用似乎):
1. Match (n:Person) where n.born=1966 return count(n)
2. Match (n:Person{born:1966}) return count(n) //特别注意類型,如果存的類似是數字類型,使用字元串就查不出來,如下:
3. Match (n:Person) return count(n.born=1966) //貌似無效?
6.2 Limit
Match (n:Person) return n limit 3
6.3 Distinct
Match (n:Person) return distinct(n.born)
6.4 Order by
Match(n:Person) return n order by n.born (預設升序)
Match(n:Person) return n order by n.born asc (升序)
Match(n:Person) return n order by n.born desc (降序)
6.5 根據id查找
match (n) where id(n)=548 return n
6.6 In的用法
Match (n) where ID(n) IN[353,145,547] return n
Match (n) where ID(n) IN[145,175,353,547,548] return n
//不明白為什麼一直少一條記錄
6.7 Exists
節點存在 name這個屬性的記錄:
Match (n) where exists(n.title) return n
6.8 With
查詢name以‘劉’開頭的節點:
Match (n) where n.name starts with '劉' return n
查詢name以‘明’結尾的節點:
Match (n) where n.name ends with '齊' return n
6.9 Contains
查詢title中含有 ‘俠侶’的節點
Match (n:Movie) where n.title Contains '俠侶' return n
6.10 Union all (Union)
求并集,不去重(去重用Union, as 取别名):
Match(n:Person) where n.born=1966 return n.name as name
Union all
Match(n:Movie) where n.released=1983 return n.title as name
7. 更新
7.1 建立一個完整的Path
CREATE p =(m:Person{ name:'劉亦菲',title:"演員" })-[:簽約]->(neo)<-[:簽約]-(n:Person { name: '趙薇',title:"投資人" })
RETURN p
7.2 為節點增加一個屬性
通過節點的ID擷取節點,Neo4j推薦通過where子句和ID函數來實作。
match (n)
where id(n)=358
set n.name = '華誼兄弟'
return n;
7.3 為節點增加标簽
set n:公司
7.4 為關系增加屬性
match (n)-[r]->(m)
where id(n)=357 and id(m)=358
set r.經紀人='程晨'
此時圖譜效果
接着讓劉德華也和華誼兄弟簽約
MATCH (a:Person),(c:公司)
WHERE a.name = '劉德華' AND c.name = '華誼兄弟'
CREATE (a)-[d:簽約 { 經紀人:'劉得得' }]->(c)
7.5 MERGE
Merge子句的作用有兩個:當模式(Pattern)存在時,比對該模式;當模式不存在時,建立新的模式,功能是match子句和create的組合。在merge子句之後,可以顯式指定on creae和on match子句,用于修改綁定的節點或關系的屬性。
通過merge子句,你可以指定圖形中必須存在一個節點,該節點必須具有特定的标簽,屬性等,如果不存在,那麼merge子句将建立相應的節點。
通過merge子句比對搜尋模式
比對模式是:一個節點有Person标簽,并且具有name屬性;如果資料庫不存在該模式,那麼建立新的節點;如果存在該模式,那麼綁定該節點;
MERGE (m:Person { name: '邁克爾·傑克遜' })
RETURN m;
在merge子句中指定on create子句
如果需要建立節點,那麼執行on create子句,修改節點的屬性;
MERGE (m:Person { name: '傑森·斯坦森' })
ON CREATE SET m.registertime = timestamp()
RETURN m.name, m.registertime
在merge子句中指定on match子句
如果節點已經存在于資料庫中,那麼執行on match子句,修改節點的屬性;節點屬性不存在則新增
MERGE (m:Person)
ON MATCH SET m.registertime = timestamp()
在merge子句中同時指定on create 和 on match子句(沒有對應屬性則修改不成功,不會新增屬性)
MERGE (m:Person{ name: '李連傑' })
ON MATCH SET m.offtime = timestamp()
RETURN m.name, m.registertime,m.offtime
merge子句用于match或create一個關系
MATCH (m:Person { name: '劉德華' }),(n:Movie { title: '神雕俠侶' })
MERGE (m)-[r:導演]->(n)
RETURN m.name, type(r), n.title
merge子句用于match或create多個關系
趙薇既是神雕俠侶的導演,也是神雕俠侶的演員
MATCH (m:Person { name: '趙薇' }),(n:Movie { title: '神雕俠侶' })
MERGE (m)-[r:導演]->(n)<-[r2:出演]-(m)
RETURN m.name, type(r),type(r2), n.title
merge子句用于子查詢
先添加基礎資料
建立城市節點
create (n:City { name: '北京',othername:'帝都'})
create (n:City { name: '香港',othername:'HongKong'})
create (n:City { name: '台灣',othername:'灣灣'})
為Person标簽的每個節點都增加一個屬性 bornin
match (n:Person)
set n.bornin = ''
where id(n)=175
set n.bornin = '香港'
where n.name='金城武'
set n.bornin = '台灣'
需求:查找劉德華和金城武的資訊和所在地的othername(相當于mysql 連表查詢)
MATCH (p:Person)
where p.name='劉德華' or p.name='金城武'
MERGE (c:City { name: p.bornin })
RETURN p.name,p.born,p.bornin , c.othername;
建立劉德華出生地是香港這條關系
MATCH (a:Person),(c:City)
WHERE a.name = '劉德華' AND c.name = '香港'
CREATE (a)-[r:出生地]->(c)
需求:給Person中每個節點都建立一個出生地的關系,沒有則傳回null
MERGE (p)-[r:出生地]->(c)
RETURN p.name, p.bornin, c.othername;
删除這些關系
Match (a:Person)-[r:出生地]->(c:City{name:''}) delete r
Match (a:City)-[r:出生地]->(c:Person) delete r
查詢Person标簽中不存在name屬性的節點
Match (n:Person) where not exists(n.name) return n
Match (n:Person) where not exists(n.name) delete n
create (n:Prize { name: '金馬獎'});
create (n:Prize { name: '奧斯卡金獎'});
create (n:Prize { name: '金雞獎'});
create (n:Prize { name: '香港電影金像獎'});
7.6 跟實體相關的函數
通過id函數,傳回節點或關系的ID
查詢Person标簽中和劉德華有關系的 id(節點和關系)
MATCH (:Person { name: '劉德華' })-[r]->(movie)
RETURN id(r);
通過type函數,查詢關系的類型
查詢Person标簽中和劉德華相關的關系(以下三種結果相同)
MATCH (:Person { name: '劉德華' })-[r]->(a)
MATCH (:Person { name: '劉德華' })-[r]->(b)
MATCH (:Person { name: '劉德華' })-[r]->()
RETURN type(r);
通過lables函數,查詢節點的标簽
查詢和劉德華有關系的節點
MATCH (:Person { name: '劉德華' })-[r]->(p)
RETURN p;
查詢和劉德華有關系的标簽(去重)
RETURN distinct(labels(p))
通過keys函數,檢視節點或關系的屬性鍵
MATCH (a)
WHERE a.name = '劉德華'
RETURN keys(a)
MATCH (:Person { name: '劉德華' })-[r]->(p) RETURN distinct(keys(r))
通過properties()函數,檢視節點或關系的屬性
RETURN properties(a)
MATCH (:Person { name: '劉德華' })-[r]->(p) RETURN properties(r)
參考資料:
https://www.cnblogs.com/ljhdo/p/5516793.html
https://www.cnblogs.com/hwaggLee/p/5959716.html
原文位址:https://blog.csdn.net/poxiaomeng187/article/details/82496157