为什么Neo4j中的这些查询会返回不同的结果?

时间:2015-08-22 18:35:47

标签: database neo4j cypher graph-databases

我在安装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在第一个查询结果中根本不显示,但仅在第二个查询结果中显示。

1 个答案:

答案 0 :(得分:1)

第一个变体包含

where NOT ((keanu)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)) 

第二个

where NOT ((keanu)-[:ACTED_IN]->(movie)<-[:ACTED_IN]-(other))

因此,第一个过滤掉keanu任何电影中的other一起行动的所有路径。第二个过滤掉keanu影片中的other一起行动的所有路径。