【问题标题】:Neo4j Movie Tutorial queryNeo4j 电影教程查询
【发布时间】:2016-06-30 13:57:58
【问题描述】:

我正在查看 Neo4j 电影示例项目: https://github.com/neo4j-examples/movies-java-spring-data-neo4j-4

其中一个例子为汤姆汉克斯推荐了新的合作演员,即 查找汤姆·汉克斯尚未合作过但与他的合作演员合作过的演员。

查询:

MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
      (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors)
WHERE NOT (tom)-[:ACTED_IN]->(m2)
RETURN cocoActors.name AS Recommended, count(*) AS Strength ORDER BY Strength DESC

前 3 个结果是: 推荐强度 汤姆克鲁斯 5 扎克·格雷尼尔 5 海伦亨特 4

但是海伦·亨特却在汤姆·汉克斯的合作演员名单中回归:

MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name

汤姆汉克斯又回到了海伦亨特的合作演员名单中:

MATCH (tom:Person {name:"Helen Hunt"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name 

这是 Neo4j 中的错误还是教程中给出的查询中的错误? 如果是查询中的错误,那么正确的查询是什么?

【问题讨论】:

  • 你在哪里看到这个查询?我似乎在 movies-java-spring-data-neo4j-4 存储库中找不到它

标签: graph neo4j cypher


【解决方案1】:

该查询未找到 Tom Hanks 尚未合作过的人。我不确定他们的目的是什么,但要做到这一点,你应该这样做:

MATCH (tom:Person)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coActors:Person),
      (coActors)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coCoActors:Person)
WHERE tom.name = 'Tom Hanks' AND
      NOT (tom)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coCoActors)
RETURN coCoActors.name AS recommended, count(*) AS strength 
ORDER BY strength DESC;

他们查询中的WHERE NOT (tom)-[:ACTED_IN]-&gt;(m2) 行没有任何意义;所做的只是断言汤姆汉克斯没有在他的合作演员和合作演员一起出演的任何电影中演出。断言 Tom Hanks 从未与绑定到coCoActors 的人合作并没有任何意义。

【讨论】:

  • guide to a simple recommendation engine 中很有趣,他们有正确的查询形式,声明“另外你可能想说汤姆汉克斯从未与推荐的人合作过,不仅仅是在他的电影中合作演员在其中工作。”您还可以添加限制 AND id(tom)&lt;&gt;id(coCoActos) 以避免 coCoActors 与 tom 匹配的情况。
猜你喜欢
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多