我在安装Neo4j时附带的Neo4j电影数据库上练习。出于某种原因,这两个查询会返回不同的结果:
match (keanu:Person {name: "Keanu Reeves"})-[:ACTED_IN]->()
<-[:ACTED_IN]-(actor), (actor)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)
where NOT ((keanu)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)) and
other <>keanu return other.name, count(other) as count order by count DESC;
match (keanu:Person {name: "Keanu Reeves"})-[:ACTED_IN]->(movie)
<-[:ACTED_IN]-(actor), (actor)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)
where NOT ((keanu)-[:ACTED_IN]->(movie)<-[:ACTED_IN]-(other)) and
other <>keanu return other.name, count(other) as count order by count DESC;
唯一的区别是我指定了'movie'变量。我只想查看那些没有和基努一起比赛的演员,但最常和他的合作演员一起玩过。结果是相同的,除非我指定一个“电影”变量,新的演员被添加到结果的顶部(最常见的是与基努的合作演员合作)。该actor在第一个查询结果中根本不显示,但仅在第二个查询结果中显示。
答案 0 :(得分:1)
第一个变体包含
where NOT ((keanu)-[:ACTED_IN]->()<-[:ACTED_IN]-(other))
第二个
where NOT ((keanu)-[:ACTED_IN]->(movie)<-[:ACTED_IN]-(other))
因此,第一个过滤掉keanu
与任何电影中的other
一起行动的所有路径。第二个过滤掉keanu
与此影片中的other
一起行动的所有路径。