首页 > 解决方案 > Neo4j 在 where 条件下的细微差别

问题描述

我写了 2 个类似的查询,旨在查找“任何与汤姆汉克斯演过的电影合演的演员,但不是汤姆汉克斯电影的合演演员的演员”。

我以为我可以用movie1.title <> movie2.title成为条件,但结果不同

查询 1(Neo4j.com 上提供的答案):

MATCH
  (p:Person)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(p2:Person {name:"Tom Hanks"}),
  (candidate:Person)-[:ACTED_IN]->(m2:Movie)<-[:ACTED_IN]-(p:Person)
where NOT (p2)-[:ACTED_IN]->()<-[:ACTED_IN]-(candidate)
return candidate,m2.title,count(*) as strong order by strong DESC

我的查询:

MATCH
  (p:Person)-[:ACTED_IN]->(m)<-[:ACTED_IN]-(p2:Person {name:"Tom Hanks"}),
  (candidate:Person)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(p:Person)
where m.title<>m2.title and p2<>candidate
return candidate.name ,count(*) as strong order by strong DESC

任何人都可以非常简要地解释为什么我的查询结果包含更多参与者?

标签: neo4jcypher

解决方案


假设candidate和汤姆汉克斯共同出演了除m和之外的其他电影m2。测试将m.title<>m2.title通过,并将candidate返回。

您必须确保根本没有他们共同出演的电影。这就是第一个查询测试的内容。

顺便说一句:m.title<>m2.title应该m<>m2改为测试,因为不同的电影可以有相同的标题。


推荐阅读