来自培训的Neo4j cypher查询

来自培训的Neo4j cypher查询,neo4j,cypher,Neo4j,Cypher,我刚在完成了培训,有几个关于实验室答案的问题 第一个来自第2课的高级图形实验室。(未给出答案,且未在图形小部件thingie中验证) 问题是:推荐3位基努·里维斯应该合作的演员(但没有)。暗示是,你基本上应该挑选三个与基努没有出演过的电影有关系的人 该图具有人物节点和电影节点,在关系和定向关系中具有ACTED_ 我想到了这个: MATCH (a:Person)-[:ACTED_IN]->(movie:Movie) WHERE NOT (:Person {name:"Keanu Reeves

我刚在完成了培训,有几个关于实验室答案的问题

第一个来自第2课的高级图形实验室。(未给出答案,且未在图形小部件thingie中验证)

问题是:推荐3位基努·里维斯应该合作的演员(但没有)。暗示是,你基本上应该挑选三个与基努没有出演过的电影有关系的人

该图具有人物节点和电影节点,在关系和定向关系中具有ACTED_

我想到了这个:

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
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 (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
因为有太多的差异,我不喜欢,但结果如下:

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

今天我遇到了一个问题,这就是我所做的

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
因为有太多的差异,我不喜欢,但结果如下:

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

所以我找到了两种不同的方法,第一种是找到那些“在同一部电影中扮演”角色最多的人,而他们的原型并不是基努·里夫斯与之有“在同一部电影中扮演”关系的人

第二个发现的人没有和基努·里夫斯在电影中合作过,但是被在大多数电影中工作过的人点播过

当然,在所有分享这种关系的演员之间建立一种“合作”关系,然后搜索基努没有合作过的每个人是最容易的,但我想这会让问题失去乐趣

第一个解决方案非常简单,看起来非常准确:

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
其中d是c“参与”的人数


编辑以添加:

在客户的回答之后,我使用了他们更加精简的查询方法得出以下结论:

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
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

其中m是他们拍摄过的电影数量。

因此我找到了两种不同的方法,似乎都很好。第一种方法是找到那些“在同一部电影中扮演”最多的人,而他们的原创者不是基努·里夫斯与之有“在同一部电影中扮演”关系的人

第二个发现的人没有和基努·里夫斯在电影中合作过,但是被在大多数电影中工作过的人点播过

当然,在所有分享这种关系的演员之间建立一种“合作”关系,然后搜索基努没有合作过的每个人是最容易的,但我想这会让问题失去乐趣

第一个解决方案非常简单,看起来非常准确:

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
其中d是c“参与”的人数


编辑以添加:

在客户的回答之后,我使用了他们更加精简的查询方法得出以下结论:

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
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

其中m是他们拍摄的电影数量。

到目前为止,我找到了两种解决方案

1:推荐基努·里维斯没有合作过的最忙的演员

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;
2:推荐与基努·里维斯合作的演员

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;

到目前为止,我已经找到了两种解决方案

1:推荐基努·里维斯没有合作过的最忙的演员

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;
2:推荐与基努·里维斯合作的演员

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;

我想你也可以根据其他电影做一个计数,它会给出不同的结果,汤姆·汉克斯、丹尼·德维托和J.T.沃尔什在这些案例中,斯托姆·汉克斯实际上与两个以上的人合作过。看我的新答案。我想你也可以根据其他电影做一个计数,结果会不同,汤姆·汉克斯、丹尼·德维托和J.T.华lsh在那个些案例中,Stom Hanks实际上已经和两个以上的人合作过。看我的新答案。现在我正在阅读这些答案,它们非常有意义。结果和我的解决方案相似,但语法更简单。You's语法比我提出的(我的带有NOT in语句的管道查询)要干净得多。我修改了我的第一个(显示了没有与Keanu合作的参与者和大多数合作者(朋友))来匹配您的查询风格,并且更喜欢它。现在我正在阅读它们,它们非常有意义。结果与我的解决方案类似,但语法更简单。您的语法比我提出的(我的带有NOT IN语句的管道查询)干净得多.我修改了我的第一个(显示了没有与基努合作的演员和大多数合作演员(朋友))以匹配您的查询风格,并且更喜欢它。