- Neo4j權(quán)威指南 (圖數(shù)據(jù)庫技術(shù)叢書)
- 張幟
- 1778字
- 2020-11-28 15:15:50
2.4 官方入門實例介紹
為了方便讀者入門,Neo4j Web管理界面提供了一個官方入門實例“電影關(guān)系圖”,幫助初學(xué)者在自己電腦上一步步創(chuàng)建一個入門級別的圖數(shù)據(jù)結(jié)構(gòu)。本節(jié)將圍繞這個“電影關(guān)系圖”實例一步步講解、分析其創(chuàng)建和查詢等操作。
首先,打開Neo4j Web管理界面(如圖2-47所示)后,在引導(dǎo)實例區(qū)單擊Write Code鏈接進入代碼書寫引導(dǎo)頁,然后單擊Movie Graph下的Create a graph鏈接就進入“電影關(guān)系圖”實例引導(dǎo)界面了,如圖2-48所示。

圖2-47 Neo4j Web管理界面

圖2-48 引導(dǎo)實例區(qū)
“電影關(guān)系圖”實例將電影、電影導(dǎo)演、演員之間的復(fù)雜網(wǎng)狀關(guān)系作為藍(lán)本,使用Neo4j創(chuàng)建三者關(guān)系的圖結(jié)構(gòu),雖然實例數(shù)據(jù)規(guī)模小但結(jié)構(gòu)是相對完整的。
這個實例將指引讀者學(xué)習(xí)以下入門操作:
(1)創(chuàng)建圖數(shù)據(jù):將電影、演員、導(dǎo)演等圖數(shù)據(jù)導(dǎo)入到Neo4j數(shù)據(jù)庫中。
(2)檢索節(jié)點:檢索特定電影和演員。
(3)查詢關(guān)系:發(fā)現(xiàn)相關(guān)的演員和導(dǎo)演。
(4)查詢關(guān)系路徑:查詢他們之間的關(guān)系路徑。
2.4.1 創(chuàng)建圖數(shù)據(jù)
單擊“電影關(guān)系圖”實例引導(dǎo)頁的右側(cè)換頁箭頭可以看到一些實例代碼,其中包含多個帶有CREATE關(guān)鍵字的Cypher語句。單擊代碼塊,代碼塊將自動填入到命令行輸入?yún)^(qū)。單擊運行命令按鈕,圖數(shù)據(jù)就創(chuàng)建完成了。
下面,對這些創(chuàng)建語句進行分析說明,先不必完全弄懂這些命令,只需要了解它們的目的即可,關(guān)于這些Cypher語句的具體學(xué)習(xí),在后續(xù)章節(jié)會有詳細(xì)介紹。
【程序2-1】創(chuàng)建電影節(jié)點
CREATE (TheMatrix:Movie {title:'The Matrix',
released:1999, tagline:'Welcome to the Real World'})
上面的Cypher語句使用CREATE指令創(chuàng)建了一個Movie節(jié)點,這個節(jié)點上帶有三個屬性{title:'The Matrix', released:1999, tagline:'Welcome to the Real World'},分別表示這個電影的標(biāo)題:The Matrix、發(fā)布時間:1999、宣傳詞:Welcome to the Real World。
上述Cypher語句運行后將會在數(shù)據(jù)庫中創(chuàng)建一個Movie節(jié)點,在數(shù)據(jù)庫中的存儲形態(tài)如圖2-49所示。

圖2-49 Movie節(jié)點
【程序2-2】創(chuàng)建人物節(jié)點
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
上面代碼使用CREATE指令創(chuàng)建了一個Person節(jié)點,節(jié)點帶有兩個屬性{name:'Keanu Reeves', born:1964}。
在后續(xù)的6行代碼中都使用了同樣的CREATE指令分別創(chuàng)建了人物:Carrie、Laurence、Hugo、LillyW、LanaW和JoelS。
【程序2-3】創(chuàng)建演員、導(dǎo)演關(guān)系
CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix), (Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix), (Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix), (Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix), (LillyW)-[:DIRECTED]->(TheMatrix), (LanaW)-[:DIRECTED]->(TheMatrix), (JoelS)-[:PRODUCED]->(TheMatrix)
上面代碼中除了使用CREATE指令外,還使用了箭頭運算符,如:(Keanu)-[:ACTED_IN{roles:['Neo']}]->(TheMatrix),這一行的意思是創(chuàng)建一個演員參演電影的關(guān)系,演員Keanu以角色roles:['Neo']參演ACTED_IN到電影TheMatrix中。代碼前4行都是創(chuàng)建演員參演電影關(guān)系的指令。
第5行指令:(LillyW)-[:DIRECTED]->(TheMatrix),意思是創(chuàng)建導(dǎo)演與電影的關(guān)系,即LillyW導(dǎo)演了“[:DIRECTED]”電影TheMatrix。
上面的指令運行完后,數(shù)據(jù)庫中會有以下存儲形態(tài),如圖2-50所示。

圖2-50 導(dǎo)演、電影關(guān)系圖
這樣數(shù)據(jù)庫中一個電影、演員、導(dǎo)演、制片商的關(guān)系就創(chuàng)建出來了。在后面的代碼中用了同樣的指令分別創(chuàng)建了電影:The Matrix Revolutions、The Devil's Advocate、A Few Good Men、Top Gun、Jerry Maguire等,然后又創(chuàng)建了與這些電影相關(guān)的演員、導(dǎo)演、制片商與他們之間的關(guān)系。
通過上述的創(chuàng)建指令就把“電影關(guān)系圖”實例創(chuàng)建完成了。
2.4.2 檢索節(jié)點
圖數(shù)據(jù)結(jié)構(gòu)創(chuàng)建完畢后,下面介紹檢索節(jié)點的相關(guān)操作。
2.4.2.1 查找人員
【程序2-4】查找名為“Tom Hanks”的人物
MATCH (tom {name: "Tom Hanks"}) RETURN tom
上面語句使用MATCH指令查找匹配條件:{name: "Tom Hanks"}的節(jié)點,執(zhí)行的結(jié)果如圖2-51所示。

圖2-51 查找到的節(jié)點
可以在結(jié)果顯示區(qū)看到查詢到的節(jié)點,注意在結(jié)果展示區(qū)單擊節(jié)點圖標(biāo),會查看到節(jié)點的屬性。
2.4.2.2 查找電影節(jié)點
【程序2-5】查找名為“Cloud Atlas”的電影
MATCH (cloudAtlas {title: "Cloud Atlas"}) RETURN cloudAtlas
上面指令查找匹配條件{title: "Cloud Atlas"}的節(jié)點,返回結(jié)果如圖2-52所示。

圖2-52 查找到的節(jié)點
2.4.2.3 隨機查找多個人物的人名
【程序2-6】隨機查找10個人物的人名
MATCH (people:Person) RETURN people.name LIMIT 10
上面指令查找10個Person節(jié)點,然后返回每個節(jié)點的name屬性,返回結(jié)果如圖2-53所示。

圖2-53 name屬性列表
在本次結(jié)果中,由于只返回name屬性,所以就不用圖形化的形式返回了。
2.4.2.4 查找多個電影
【程序2-7】查找1990年到2000年發(fā)行的電影的名稱
MATCH (nineties:Movie) WHERE nineties.released > 1990 AND nineties.released < 2000 RETURN nineties.title
上面指令略微復(fù)雜,首先匹配Movie節(jié)點,然后使用WHERE子句查詢電影的released屬性值大于1990并且小于2000條件的節(jié)點,然后只返回匹配節(jié)點的title屬性。返回結(jié)果為如圖2-54所示。

圖2-54 title屬性列表
2.4.3 查詢關(guān)系
下面拓展MATCH指令的使用。
2.4.3.1 查找演員參演的電影
【程序2-8】查找“Tom Hanks”參演過的電影的名稱
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom, tomHanksMovies
上述指令首先匹配節(jié)點類型為Person、屬性為{name: "Tom Hanks"}的節(jié)點,然后匹配此節(jié)點具有關(guān)系[:ACTED_IN],并且此關(guān)系指向某個電影節(jié)點的節(jié)點。返回結(jié)果如圖2-55所示。

圖2-55 “Tom Hanks”參演過的電影
通過結(jié)果可以看到演員Tom Hanks參演過的所有電影。
【程序2-9】查找誰導(dǎo)演了電影“Cloud Atlas”
MATCH (cloudAtlas {title: "Cloud Atlas"})<-[:DIRECTED]-(directors) RETURN directors.name
上面指令首先匹配屬性為{title: "Cloud Atlas"}的節(jié)點,然后匹配此節(jié)點具有關(guān)系[:DIRECTED]并且是被某個節(jié)點指向的節(jié)點,再返回匹配節(jié)點的name屬性。返回結(jié)果如圖2-56所示。

圖2-56 電影Cloud Atlas的導(dǎo)演名單
通過結(jié)果可以看到Lily Wachowski、Lana Wachowski、Tom Tykwer導(dǎo)演了電影Cloud Atlas。
【程序2-10】查找與Tom Hanks同出演過電影的人
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]- (coActors) RETURN coActors.name
上面指令首先匹配節(jié)點類型為Person、屬性為{name:"Tom Hanks"}的節(jié)點,然后匹配此節(jié)點通過[:ACTED_IN]關(guān)系指向的節(jié)點m,并且同時匹配某個節(jié)點coActors也通過[:ACTED_IN]關(guān)系指向的節(jié)點m,然后返回匹配節(jié)點m的name屬性。返回結(jié)果如圖2-57所示。

圖2-57 與“Tom Hanks”同出演過電影的人
這樣與Tom Hanks同時出演過電影的人的姓名就查出來了。
【程序2-11】查找與電影“Cloud Atlas”相關(guān)的所有人
MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) RETURN people.name, Type(relatedTo), relatedTo
上面指令首先匹配節(jié)點類型為Person的節(jié)點,然后匹配節(jié)點類型為Movie、節(jié)點屬性為{title: "Cloud Atlas"}的節(jié)點,最后匹配他們兩者之間存在某種關(guān)系(無論是導(dǎo)演還是演員關(guān)系)的情況,然后將人名、電影的關(guān)系類型、電影的關(guān)系同時返回。返回結(jié)果如圖2-58所示。

圖2-58 與電影“Cloud Atlas”相關(guān)的所有人
通過結(jié)果可以看到返回了三列數(shù)據(jù),這與RETURN語句后面的people.name、Type(relatedTo)、 relatedTo相對應(yīng)。
2.4.3.2 查詢關(guān)系路徑
您或許聽說過“六度空間”理論,也就是說,世界上任何兩個人,他們之間至多通過6條關(guān)系路徑就可以相互聯(lián)系到彼此。使用Neo4j的關(guān)系路徑查詢可以查找任意深度的關(guān)系路徑,也就很輕松地能夠?qū)崿F(xiàn)人脈關(guān)系查詢了。
【程序2-12】查找與演員“Kevin Bacon”存在4條及以內(nèi)關(guān)系的任何演員和電影
MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood) RETURN DISTINCT hollywood
上面指令首先匹配節(jié)點類型為Person、屬性為{name: " Kevin Bacon "}的節(jié)點,然后將關(guān)系深度限制為從1到4再進行遍歷,最后返回匹配的所有節(jié)點。返回結(jié)果如圖2-59所示。

圖2-59 與演員Kevin Bacon存在4條及以內(nèi)關(guān)系的演員和電影
通過結(jié)果可以看到演員Kevin Bacon4度關(guān)系以內(nèi)的演員和電影網(wǎng)絡(luò)是很龐大的。
【程序2-13】查找與演員Kevin Bacon與Meg Ryan之間的最短關(guān)系路徑
MATCH p=shortestPath( (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"}) ) RETURN p
上面指令首先匹配節(jié)點類型為Person、屬性為{name: "Kevin Bacon"}的節(jié)點,再匹配節(jié)點類型為Person、屬性為{name: " Meg Ryan "}的節(jié)點,兩者用[*]關(guān)系操作符相連代表兩者存在任意深度的關(guān)系,然后使用shortestPath方法返回兩者在所有深度關(guān)系遍歷路徑中最短的一條。返回結(jié)果如圖2-60所示。

圖2-60 “Kevin Bacon”與“Meg Ryan”之間的最短關(guān)系路徑
通過結(jié)果可以看到演員Meg Ryan與Tom Hanks同參演過Joe Versus the Volcano電影,而Tom Hanks與Kevin Bacon同參演過Apollo 13電影,這就是他們兩者之間的最短關(guān)系路徑。
2.4.4 思考與練習(xí)
基于這個“電影關(guān)系圖”實例,可以考慮一下其他的應(yīng)用場景:要為Tom Hanks推薦新的合作伙伴,一個比較好的辦法就是通過認(rèn)識Tom Hanks的人的人脈來尋找新的合作伙伴。
對于Tom Hanks來說,這意味著:
第一步,先找到Tom Hanks還沒有合作過的演員,但Tom Hanks的合作伙伴曾經(jīng)與其合作過。
第二步,找到一個可以向他的潛在合作者介紹Tom Hanks的人。
【程序2-14】查找沒有與Tom Hanks合作過的演員
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]- (coActors), (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors) WHERE NOT (tom)-[:ACTED_IN]->(m2) RETURN cocoActors.name AS Recommended, count(*) AS Strength ORDER BY Strength DESC
結(jié)果如圖2-61所示。

圖2-61 沒有與Tom Hanks合作過的演員
【程序2-15】找人將Tom Hanks介紹給Tom Cruise
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]- (coActors), (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cruise:Person {name:"Tom Cruise"}) RETURN tom, m, coActors, m2, cruise
結(jié)果如圖2-62所示。

圖2-62 找人將Tom Hanks介紹給Tom Cruise
2.4.5 清空數(shù)據(jù)庫
上面的數(shù)據(jù)在操作完后,有時候需要清理掉這些數(shù)據(jù)。下面的代碼就可以做到。
【程序2-16】清空所有Person、Movie節(jié)點及其所有關(guān)系
MATCH (a:Person), (m:Movie) OPTIONAL MATCH (a)-[r1]-(), (m)-[r2]-() DELETE a, r1, m, r2
這樣操作完成后,為了查詢數(shù)據(jù)是否已經(jīng)被清空了,可以運行以下命令先看數(shù)據(jù)庫中是否還有任何數(shù)據(jù)。
【程序2-17】查詢?nèi)我鈹?shù)據(jù)
MATCH (n) RETURN n
如果沒有,就說明已經(jīng)刪除成功了。
- 前端跨界開發(fā)指南:JavaScript工具庫原理解析與實戰(zhàn)
- Getting Started with ResearchKit
- 算法基礎(chǔ):打開程序設(shè)計之門
- PostgreSQL技術(shù)內(nèi)幕:事務(wù)處理深度探索
- 新手學(xué)Visual C# 2008程序設(shè)計
- 軟件項目管理實用教程
- 小程序開發(fā)原理與實戰(zhàn)
- Learning DHTMLX Suite UI
- Apache Kafka Quick Start Guide
- 領(lǐng)域驅(qū)動設(shè)計:軟件核心復(fù)雜性應(yīng)對之道(修訂版)
- Kivy Cookbook
- 精通MySQL 8(視頻教學(xué)版)
- C++ System Programming Cookbook
- Building Clouds with Windows Azure Pack
- 自己動手構(gòu)建編程語言:如何設(shè)計編譯器、解釋器和DSL