Neo4j-“不存在”子句的解释是什么?

时间:2019-02-05 16:30:24

标签: neo4j

我是Neo4j的新手,正在阅读他们的入门教程,我对使用“不存在”子句感到有些困惑。本教程显示了一个示例,其中他们希望返回编写电影的人的所有“人”节点,而排除导演该电影的人。他们对此的查询是:

MATCH (p:Person)-[:WROTE]->(m:Movie) WHERE NOT exists( (p)-[:DIRECTED]->() ) RETURN p.name, m.title

返回:

p.name m.title "Aaron Sorkin" "A Few Good Men" "Jim Cash" "Top Gun" "David Mitchell" "Cloud Atlas"

我对此的查询是:

MATCH (p:Person)-[:WROTE]->(m:Movie) WHERE NOT exists( (p)-[:DIRECTED]->(m) ) RETURN p.name, m.title

返回:

p.name m.title "Aaron Sorkin" "A Few Good Men" "Jim Cash" "Top Gun" "Nora Ephron" "When Harry Met Sally" "David Mitchell" "Cloud Atlas" "Lana Wachowski" "V for Vendetta" "Lilly Wachowski" "V for Vendetta"

我检查了“ Nora Ephron”,“ Lana Wachowski”和“ Lilly Wachowski”(不在查询结果中)的图形关系,发现他们写并制作了电影(但没有导演)。根据我的理解,两个查询应返回相同的结果。我想知道为什么他们返回不同的结果。对于解释这些差异的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这些查询彼此不同,它们在询问不同的事物并返回不同的结果。

MATCH (p:Person)-[:WROTE]->(m:Movie)
 WHERE NOT exists( (p)-[:DIRECTED]->() )
 RETURN p.name, m.title

上述查询中的WHERE子句可确保p人没有指挥任何事情(他们没有来自p节点的:DIRECTED关系)。

MATCH (p:Person)-[:WROTE]->(m:Movie)
 WHERE NOT exists( (p)-[:DIRECTED]->(m) )
 RETURN p.name, m.title

上面的查询中的WHERE子句有所不同,因为模式中存在m,该模式引用与MATCH中的电影相同的电影。此查询可确保正在为该人考虑的电影是由p编写的,而不是由p导演的。 p可能还执导了其他电影,也许他们都写了并执导了其他电影,但是对于这部电影m,他们只写了电影,没有导演。