Neo4j电影教程查询

时间:2016-06-30 13:57:59

标签: graph neo4j cypher

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

其中一个例子为Tom Hanks推荐新的合作者,即 找到汤姆汉克斯尚未合作的演员,但他的合作演员有。

查询:

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 Zach Grenier 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中的错误还是教程中给出的查询中的错误? 如果是查询中的错误什么是正确的查询?

1 个答案:

答案 0 :(得分:2)

该查询并未找到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]->(m2)并没有任何意义;他所做的一切都是断言汤姆汉克斯并没有在他的合作演员和共同演员共同演绎的任何电影中表演。没有任何理由断言汤姆汉克斯从来没有对受coCoActors约束的人采取行动。