簡體   English   中英

來自Training的Neo4j密碼查詢

[英]Neo4j cypher query from Training

我剛剛在http://www.neo4j.org/learn/online_course上完成了培訓,並對實驗室答案有幾個問題。

首先是來自第2課的高級圖形實驗室。(未給出答案,並且未在圖形小部件thingie中進行驗證)

問題是:推薦基努·里維斯應與之合作的3位演員(但沒有)。 提示是,您基本上應該選擇與Keanu還沒有ACTED_IN的電影具有ACTED_IN關系的三個人物。

該圖包含具有ACTED_IN關系和DIRECTED關系的Person節點和Movie節點。

我想出了這個:

MATCH (a:Person)-[:ACTED_IN]->(movie:Movie)
WHERE NOT (:Person {name:"Keanu Reeves"})-[:ACTED_IN]->(movie)
RETURN a, count(movie)
ORDER BY count(movie) DESC
LIMIT 3

但我無法確定這是否真的排除了同一部電影,還是只排除了基努·里維斯(因為基恩努的電影中沒有回返的演員,但無論如何他們可能都已經回了。

到目前為止,我已經找到了兩個解決方案。

1:推薦最忙的演員基努·里夫斯(Keanu Reeves)未曾與之合作。

MATCH (p:Person)-[:ACTED_IN]->(m)
WHERE p.name <> 'Keanu Reeves'
AND NOT (p)-[:ACTED_IN]->()<-[:ACTED_IN]-(:Person{name:'Keanu Reeves'})
RETURN p.name, count(m) AS rating
ORDER BY count(m) DESC
LIMIT 3;

哪個產量

p.name          | rating
--------------------------
Tom Hanks       | 12
Meg Ryan        | 5
Cuba Gooding Jr.| 4

2:推薦演員基努·里維斯(Keanu Reeves)的主演與大多數人合作

MATCH (f:Person)-[:ACTED_IN]->(m)<-[:ACTED_IN]-(c:Person),
(k:Person{name:'Keanu Reeves'})
WHERE c.name <> 'Keanu Reeves'
AND (f)-[:ACTED_IN]->()<-[:ACTED_IN]-(k)
AND NOT (c)-[:ACTED_IN]->()<-[:ACTED_IN]-(k)
RETURN c.name, count(c) AS  Rating
ORDER BY Rating desc
LIMIT 3;

哪個產量

p.name          | rating
--------------------------
Danny DeVito    | 2
J.T. Walsh      | 2
Tom Hanks       | 2

今天我遇到了這個問題,在這里我做了什么

MATCH (keanu:Person)-[:ACTED_IN]->(movie),
      (playedwith:Person)-[:ACTED_IN]->(movie), 
      (playedwith)-[t:ACTED_IN]->(othermovie),
      (other:Person)-[:ACTED_IN]->(othermovie)
WHERE keanu.name = "Keanu Reeves"
      AND NOT (other)-[:ACTED_IN]->(movie)
      AND NOT (keanu)-[:ACTED_IN]->(othermovie)
RETURN other.name
      ,collect(DISTINCT othermovie)
      ,collect(DISTINCT playedwith)
      ,count(DISTINCT playedwith)
ORDER BY count(DISTINCT playedwith)desc
LIMIT 3

由於Distict太多,我雖然不喜歡它,但結果如下:

other.name    | collect(DISTINCT othermovie) | collect(DISTINCT playedwith)        | count(DISTINCT playedwith)
-----------------------------------------------------------------------------------------------------------------------------
Tom Hanks     | ["Cloud Atlas",              | ["Hugo Weaving","Charlize Theron"]  | 2
              |  "That Thing You Do"]        |
Tom Cruise    | ["A Few Good Men"]           | ["Jack Nicholson"]                  | 1
Robin Williams| ["The Birdcage"]             | ["Gene Hackman"]                    | 1

因此,我發現了兩種看起來不錯的不同方法。 第一個查找具有“ ACTED_IN同一部電影”最多的人,其原始人不是與Keanu Reeves有“ ACTED_IN同一部電影”關系的人。

第二個查找的人尚未與Keanu Reeves交流過電影,但按照參與最多電影的人排序。

當然,在共享此關系的所有演員之間創建“ WORKED_WITH”關系,然后搜索Keanu尚未使用WORKED_WITH的所有人,這將是最簡單的方法,但這使我猜錯了。

第一個解決方案非常簡單,而且看起來非常准確:

MATCH (a:Person {name:"Keanu Reeves"})-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(b:Person)
WITH collect(b.name) AS FoF
MATCH (c:Person)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(d:Person)
WHERE not c.name IN FoF AND c.name <> "Keanu Reeves"
RETURN distinct c.name, count(distinct d)
ORDER BY count(distinct d) desc
limit 3

它返回:

c.name          | count(distinct d)
-------------------------------
Tom Hanks       |    34
Cuba Gooding Jr.|    24
Tom Cruise      |    23

d是c擁有“ ACTED_IN”的人數。


編輯添加:

在給出答案后,我使用了更為簡化的查詢方法來提出以下建議:

MATCH (a:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(b:Person)
WHERE a.name <>'Keanu Reeves' 
AND NOT (a)-[:ACTED_IN]->()<-[:ACTED_IN]-(b:Person {name:'Keanu Reeves'})
RETURN a.name, count(Distinct b) AS Rating
ORDER BY Rating DESC
LIMIT 3

返回與上面相同的內容。


或者,我將這些用於大多數電影中工作過的人:

MATCH (a:Person {name:"Keanu Reeves"})-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(b:Person)
WITH collect(b.name) AS FoF
MATCH (c:Person)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(d:Person)
WHERE not c.name IN FoF AND c.name <> "Keanu Reeves"
RETURN distinct c.name, count(distinct m)
ORDER BY count(distinct m) desc
limit 3

返回:

c.name           |  count(distinct m)
-------------------------------------------
Tom Hanks        |  11
Meg Ryan         |  5
Cuba Gooding Jr. |  4

其中m是他們制作的電影數量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM