在线课程中的聚合计数示例:推荐基努·里维斯应该合作(但没有合作)的 3 位演员

Aggregates Count Example in Online Course : Recommend 3 actors that Keanu Reeves should work with (but hasn’t)

在线课程中的示例要求推荐3个基努里维斯应该合作但没有合作的演员,该示例中的解决方案演示为:

MATCH (keanu:Person {name:"Keanu Reeves"})-[:ACTED_IN]->()<-[:ACTED_IN]-(c),
      (c)-[:ACTED_IN]->()<-[:ACTED_IN]-(coc)
WHERE coc <> keanu  AND NOT((keanu)-[:ACTED_IN]->()<-[:ACTED_IN]-(coc))
RETURN coc.name, count(coc)
ORDER BY count(coc) DESC
LIMIT 3;

以上结果

Tom Hanks   4
Stephen Rea 3
John Hurt   3

然而,根据样本数据库,汤姆·汉克斯出演了 12 部电影。此外,还有像梅格瑞恩这样排名更高的电影明星不在该名单上。

我的解决方案是这个密码

match (other:Person)-[:ACTED_IN]->(movie),
(keanu:Person {name:'Keanu Reeves'})
WHERE
NOT (keanu)-[:ACTED_IN]->(movie)
return other.name, count(movie)
order by count(movie) desc
limit 3;

结果如下:

Tom Hanks   12
Meg Ryan    5
Jack Nicholson  4

我错过了什么吗?或者是提供的示例解决方案不准确。

我是 Neo4j 的初学者,如果我完全不喜欢请原谅我。

提供的解决方案称为协同过滤,即。喜欢我喜欢的人也喜欢什么。这种方法是基于为自己找到一个"peer group"。

您建议的是基于受欢迎程度或频率的指标。

现实世界的建议基于许多方面,具体取决于您的要求和用例。

有关介绍,请参阅此演示文稿:http://de.slideshare.net/bachmanm/recommendations-with-neo4j-fosdem-2015

实际上,您没有正确理解任务(我也是第一次!)

问题的作者实际上问的是:找到三个与基努·里维斯一起演过电影的演员一起演过电影并且还没有和基努本人演过任何电影的演员。

你解决了这个问题:找出三个尚未与基努·里维斯出演同一部电影的演员中出镜率最高的演员

当然,对于模棱两可的表述,问题作者感到羞耻!

顺便说一句,我想向您介绍我的替代解决方案,它看起来比作者提供的要短一些:

MATCH (actor:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(keanu:Person {name: "Keanu Reeves"}),
(other:Person)-[:ACTED_IN]->(movie)<-[:ACTED_IN]-(actor)
WHERE NOT (movie)<-[:ACTED_IN]-(keanu:Person {name: "Keanu Reeves"})
RETURN other.name, COUNT(*) as Movies
ORDER BY Movies DESC
LIMIT 3;
    ╒═══════════════╤════════╕
    │"other.name"   │"Movies"│
    ╞═══════════════╪════════╡
    │"Tom Hanks"    │4       │
    ├───────────────┼────────┤
    │"Jim Broadbent"│3       │
    ├───────────────┼────────┤
    │"Halle Berry"  │3       │
    └───────────────┴────────┘