官术网_书友最值得收藏!

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)刪除成功了。

主站蜘蛛池模板: 通渭县| 崇左市| 唐山市| 霍州市| 新余市| 岚皋县| 汽车| 徐水县| 三江| 吴桥县| 甘孜县| 定结县| 武威市| 肃南| 辽阳市| 正镶白旗| 社旗县| 繁昌县| 育儿| 大足县| 绥芬河市| 南丹县| 元氏县| 肃北| 沅江市| 海宁市| 象山县| 东丽区| 平南县| 怀宁县| 平谷区| 兴和县| 铁力市| 杨浦区| 德安县| 汤阴县| 太湖县| 白玉县| 房产| 荥阳市| 通州区|