天天看點

Cypher 語句實戰

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;

Cypher 語句實戰

2.2 查詢具有指定标簽的節點

查詢Movie标簽下的節點

match(n:Movie) return n;

Cypher 語句實戰

2.3 where 謂詞查詢

查詢名稱為林志玲的節點

match (n:Person) where n.name='林志玲' return n

查詢born屬性小于1967的節點

match(n) where n.born<1967 return n;

Cypher 語句實戰

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;

Cypher 語句實戰
Cypher 語句實戰

3.2 建立關系,并設定關系的屬性

MATCH (a:Person),(b:Movie) WHERE a.name = '劉德華' AND b.title = '神雕俠侶' CREATE (a)-[r:出演 { roles:['楊過'] }]->(b) RETURN r;

Cypher 語句實戰
Cypher 語句實戰

3.3 建立雙向關系

劉德華的女是劉向蕙,劉向蕙的父親是劉德華

MATCH (a:Person),(c:Person)

WHERE a.name = '劉德華' AND c.name = '劉向蕙'

CREATE (a)-[r:父親 { nickname:'甜心' }]->(c),

(c)-[d:女兒 { nickname:'爹地' }]->(a)

RETURN r;

Cypher 語句實戰

關系建錯了 删除關系 (見5.2 )

重新建立

CREATE (a)-[d:女兒 { nickname:'甜心' }]->(c),

(c)-[r:父親 { nickname:'爹地' }]->(a)

Cypher 語句實戰

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)

Cypher 語句實戰

繼續新增關系 劉德華和林志玲,金城武,任賢齊

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

Cypher 語句實戰

4 查詢關系

在Cypher中,關系分為三種:符号“--”,表示有關系,忽略關系的類型和方向;符号“-->”和“<--”,表示有方向的關系;

4.1 查詢整個資料圖形

Cypher 語句實戰

4.2 查詢跟指定節點有關系的節點

查詢跟Movie标簽有關系的所有節點

Cypher 語句實戰

4.3,查詢有向關系的節點

查詢和劉德華有關系的電影

MATCH (:Person { name: '劉德華' })-->(movie)RETURN movie;

Cypher 語句實戰

4.4 為關系命名

通過[r]為關系定義一個變量名,通過函數type擷取關系的類型

MATCH (:Person { name: '劉德華' })-[r]->(movie) RETURN r,type(r);

Cypher 語句實戰

4.5 查詢特定的關系類型

通過[Variable:RelationshipType{Key:Value}]指定關系的類型和屬性

MATCH (:Person { name: '劉德華' })-[r:出演{partner:'張國榮'}]->(Movie) RETURN r,type(r);

Cypher 語句實戰

查詢和劉德華和張國榮合作過的電影

MATCH (:Person { name: '劉德華' })-[r:出演{partner:'張國榮'}]->(m:Movie) RETURN m;

Cypher 語句實戰

查詢被劉德華稱呼為甜心的女兒

MATCH (:Person { name: '劉德華' })-[r:女兒{nickname:'甜心'}]->(m:Person) return m

查詢劉德華的老婆是誰

Match (n:Person{name: '劉德華'})-[:wife]->(a:Person) return a

Cypher 語句實戰

劉德華出演過的電影

Cypher 語句實戰

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)

Cypher 語句實戰

查詢标簽(Person)中born=1966的一共有多少節點(人):

三種寫法(第三種不能用似乎):

1. Match (n:Person) where n.born=1966 return count(n)

Cypher 語句實戰

2. Match (n:Person{born:1966}) return count(n) //特别注意類型,如果存的類似是數字類型,使用字元串就查不出來,如下:

Cypher 語句實戰

3. Match (n:Person) return count(n.born=1966) //貌似無效?

Cypher 語句實戰

6.2 Limit

Match (n:Person) return n limit 3

Cypher 語句實戰
Cypher 語句實戰

6.3 Distinct

Match (n:Person) return distinct(n.born)

Cypher 語句實戰

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 (降序)

Cypher 語句實戰
Cypher 語句實戰
Cypher 語句實戰

6.5 根據id查找

match (n) where id(n)=548 return n

Cypher 語句實戰

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

//不明白為什麼一直少一條記錄

Cypher 語句實戰

6.7 Exists

節點存在 name這個屬性的記錄:

Match (n) where exists(n.title) return n

Cypher 語句實戰

6.8 With

查詢name以‘劉’開頭的節點:

Match (n) where n.name starts with '劉' return n

Cypher 語句實戰

查詢name以‘明’結尾的節點:

Match (n) where n.name ends with '齊' return n

Cypher 語句實戰

6.9 Contains

查詢title中含有 ‘俠侶’的節點

Match (n:Movie) where n.title Contains '俠侶' return n

Cypher 語句實戰

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

Cypher 語句實戰

7. 更新

7.1 建立一個完整的Path

CREATE p =(m:Person{ name:'劉亦菲',title:"演員" })-[:簽約]->(neo)<-[:簽約]-(n:Person { name: '趙薇',title:"投資人" })

RETURN p

Cypher 語句實戰
Cypher 語句實戰

7.2 為節點增加一個屬性

通過節點的ID擷取節點,Neo4j推薦通過where子句和ID函數來實作。

match (n)

where id(n)=358

set n.name = '華誼兄弟'

return n;

Cypher 語句實戰

7.3 為節點增加标簽

set n:公司

Cypher 語句實戰

7.4 為關系增加屬性

match (n)-[r]->(m)

where id(n)=357 and id(m)=358

set r.經紀人='程晨'

Cypher 語句實戰

此時圖譜效果

Cypher 語句實戰

接着讓劉德華也和華誼兄弟簽約

MATCH (a:Person),(c:公司)

WHERE a.name = '劉德華' AND c.name = '華誼兄弟'

CREATE (a)-[d:簽約 { 經紀人:'劉得得' }]->(c)

Cypher 語句實戰

7.5 MERGE

Merge子句的作用有兩個:當模式(Pattern)存在時,比對該模式;當模式不存在時,建立新的模式,功能是match子句和create的組合。在merge子句之後,可以顯式指定on creae和on match子句,用于修改綁定的節點或關系的屬性。

通過merge子句,你可以指定圖形中必須存在一個節點,該節點必須具有特定的标簽,屬性等,如果不存在,那麼merge子句将建立相應的節點。

通過merge子句比對搜尋模式

比對模式是:一個節點有Person标簽,并且具有name屬性;如果資料庫不存在該模式,那麼建立新的節點;如果存在該模式,那麼綁定該節點;

MERGE (m:Person { name: '邁克爾·傑克遜' })

RETURN m;

Cypher 語句實戰

在merge子句中指定on create子句

如果需要建立節點,那麼執行on create子句,修改節點的屬性;

MERGE (m:Person { name: '傑森·斯坦森' })

ON CREATE SET m.registertime = timestamp()

RETURN m.name, m.registertime

Cypher 語句實戰

在merge子句中指定on match子句

如果節點已經存在于資料庫中,那麼執行on match子句,修改節點的屬性;節點屬性不存在則新增

MERGE (m:Person)

ON MATCH SET m.registertime = timestamp()

Cypher 語句實戰

在merge子句中同時指定on create 和 on match子句(沒有對應屬性則修改不成功,不會新增屬性)

MERGE (m:Person{ name: '李連傑' })

ON MATCH SET m.offtime = timestamp()

RETURN m.name, m.registertime,m.offtime

Cypher 語句實戰
Cypher 語句實戰

merge子句用于match或create一個關系

MATCH (m:Person { name: '劉德華' }),(n:Movie { title: '神雕俠侶' })

MERGE (m)-[r:導演]->(n)

RETURN m.name, type(r), n.title

Cypher 語句實戰

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

Cypher 語句實戰

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 = ''

Cypher 語句實戰

where id(n)=175

set n.bornin = '香港'

Cypher 語句實戰

where n.name='金城武'

set n.bornin = '台灣'

Cypher 語句實戰

需求:查找劉德華和金城武的資訊和所在地的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;

Cypher 語句實戰

建立劉德華出生地是香港這條關系

MATCH (a:Person),(c:City)

WHERE a.name = '劉德華' AND c.name = '香港'

CREATE (a)-[r:出生地]->(c)

Cypher 語句實戰

需求:給Person中每個節點都建立一個出生地的關系,沒有則傳回null

MERGE (p)-[r:出生地]->(c)

RETURN p.name, p.bornin, c.othername;

Cypher 語句實戰
Cypher 語句實戰

删除這些關系

Match (a:Person)-[r:出生地]->(c:City{name:''}) delete r

Match (a:City)-[r:出生地]->(c:Person) delete r

Cypher 語句實戰

查詢Person标簽中不存在name屬性的節點

Match (n:Person) where not exists(n.name) return n

Match (n:Person) where not exists(n.name) delete n

Cypher 語句實戰

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

Cypher 語句實戰

通過type函數,查詢關系的類型

查詢Person标簽中和劉德華相關的關系(以下三種結果相同)

MATCH (:Person { name: '劉德華' })-[r]->(a)

MATCH (:Person { name: '劉德華' })-[r]->(b)

MATCH (:Person { name: '劉德華' })-[r]->()

RETURN type(r);

Cypher 語句實戰
Cypher 語句實戰

通過lables函數,查詢節點的标簽

查詢和劉德華有關系的節點

MATCH (:Person { name: '劉德華' })-[r]->(p)

RETURN p;

Cypher 語句實戰

查詢和劉德華有關系的标簽(去重)

RETURN distinct(labels(p))

Cypher 語句實戰

通過keys函數,檢視節點或關系的屬性鍵

MATCH (a)

WHERE a.name = '劉德華'

RETURN keys(a)

Cypher 語句實戰

MATCH (:Person { name: '劉德華' })-[r]->(p) RETURN distinct(keys(r))

Cypher 語句實戰

通過properties()函數,檢視節點或關系的屬性

RETURN properties(a)

Cypher 語句實戰

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