Neo4j入門(六)從計算節(jié)點的出度、入度開始
??本文將會介紹一些較高級的Neo4j查詢Cypher語句,先從計算節(jié)點的出度、入度開始。
??在此之前,我們先構(gòu)建一個簡單的電影知識圖譜。
圖譜構(gòu)建
??我們將構(gòu)建一個IMDB排名前250的電影知識圖譜,其數(shù)據(jù)來源可訪問網(wǎng)址:https://www.imdb.cn/imdb250/6,電影數(shù)據(jù)示例如下:

??其中節(jié)點的Schema如下:
| 節(jié)點類型 | 屬性 |
|---|---|
| Movie | name,language,releaseDate,minutes |
| Person | name |
| Country | name |
| Genre | name |
其中Movie為電影節(jié)點,Person為人物節(jié)點,包含導(dǎo)演、編劇、主演,Country為國家或地區(qū),Genre為電影類型。關(guān)系Schema如下:
| 頭結(jié)點 | 尾結(jié)點 | 關(guān)系 | 備注 |
|---|---|---|---|
| Movie | Person | director | 電影的導(dǎo)演 |
| Movie | Person | editor | 電影的編劇 |
| Movie | Person | actor | 電影的主演 |
| Movie | Country | country | 電影所屬國家或地區(qū) |
| Movie | Genre | has | 電影類型 |
根據(jù)上述數(shù)據(jù)源及Schema,我們構(gòu)建的電影圖譜示例如下:

Cypher查詢
查詢節(jié)點的出度、入度
??首先我們查詢某個節(jié)點的出度,比如我們想知道肖申克的救贖的出度(即有多少關(guān)系以該節(jié)點為頭結(jié)點),則可以使用如下查詢語句:
match?(n:Movie{name:?'肖申克的救贖'})?with?n,?size((n)-[]->())?as?s?return?s;
返回結(jié)果如下:
s
9
??如果我們想查詢某個節(jié)點的入度,比如我們想知道前250部電影中有多少部是美國拍的,則可以使用如下查詢語句:
match?(n:Country{name:?'美國'})?with?n,?size((n)<-[]-())?as?s?return?s;
返回結(jié)果如下:
s
186
匹配多種關(guān)系
??接下來我們查詢多種關(guān)系,比如我們想知道阿甘正傳的導(dǎo)演及電影類型,則可以使用如下查詢語句:
match?p=(n:Movie{name:?'阿甘正傳'})?-[r:director|has]?->?(m)?return?p;
返回結(jié)果如下圖:

匹配多種類型節(jié)點
??匹配多種類型的節(jié)點時,不像匹配多種關(guān)系使用|那么方便,比如我們想知道圖譜中的電影及國家,則可以使用如下查詢語句:
match?(n)?where?n:Movie?or?n:Country?return?n.name;
限定條件的節(jié)點出度、入度
??比如我們想知道肖申克的救贖的主演和導(dǎo)演數(shù)量,則可以使用如下查詢語句:
match?(n:Movie{name:?'肖申克的救贖'})?with?n,?size((n)-[:actor|director]->())?as?s?return?s;
返回結(jié)果如下:
s
6
又比如我們想知道一共有多少部劇情片和愛情片,則可以使用如下查詢語句:
match?(n:Genre)?where?n.name?=?'劇情'?or?n.name?=?'愛情'?with?n,?size((n)<-[]-?())?as?s?return?n.name,?s;
返回結(jié)果如下:
n.name ?s
"愛情" ? ?15
"劇情" ? ?116
按節(jié)點出度、入度排序
??比如我們想按照國家所拍攝的電影數(shù)量對國家排序,即對國家節(jié)點按出度進行排序,則可以使用如下查詢語句:
match?(n:Country)?with?n,?size((n)<-[]-())?as?s?order?by?s?desc?return?n.name,?s;
則返回結(jié)果如下:

改變節(jié)點的標(biāo)簽
??Neo4j是支持對同一節(jié)點賦予多個標(biāo)簽(label)的,那么我們嘗試著對擁有director、editor、actor關(guān)系的Person節(jié)點再給它們賦予Director、Editor、Actor標(biāo)簽,查詢語句如下:
match?(n:Movie)?-[r:director]->(m:Person)?set?m:Director?return?(m);
如下圖:

??有了上述操作,我們就可以知道那些
即是導(dǎo)演又是編劇又是主演的人了,查詢語句如下:match?(n)?where?n:Director?and?n:Editor?and?n:Actor?return?(n);
返回結(jié)果如下:

去百度查詢特瑞·瓊斯,也是符合我們的搜索結(jié)果的:

總結(jié)
??從上面的查詢中我們可以看到,知識圖譜可以告訴我們很多有趣的事實,這也是圖譜的魅力所在~
??本文將會介紹了一些較高級的Neo4j查詢Cypher語句,感謝閱讀~
