所以我找到了 2 种看起来不错的不同方式。第一个查找具有最多“ACTED_IN 同一部电影”路径的人,而原始人不是与基努·里维斯有“ACTED_IN 同一部电影”关系的人。
第二个查找没有与基努·里维斯合作的电影 ACTED_IN 的人,但按出演电影最多的人排序。
当然,最简单的方法是在所有共享此关系的演员之间创建“WORKED_WITH”关系,然后搜索所有基努没有 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”的人数。
编辑添加:
在 's answer 之后,我使用了他们更精简的查询方法来提出这个:
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 是他们参与过的电影数量。