Neo4j的 - 什么是“WHERE NOT EXISTS”条款的解释?

问题描述 投票:0回答:1

我是新来的Neo4j,并通过他们的入门教程会和我有关使用“WHERE NOT EXISTS”子句的有点糊涂了。本教程介绍了他们想要返回的是谁写的电影人所有的个人节点和排除谁执导这部电影的人的例子。他们对这个查询:

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"

我检查了“诺拉·依弗朗”,“拉娜·沃卓斯基”和“莉莉沃卓斯基”(谁是不符合他们的查询结果)的图形关系,发现他们创作并制作的电影(但不是直接)。根据我的理解这两个查询应返回相同的结果。我很奇怪,为什么他们返回不同的结果。任何帮助,将不胜感激解释的差异。

neo4j
1个回答
1
投票

这些查询都是彼此不同,他们所要求的不同的东西,并返回不同的结果。

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

在上面的查询的WHERE子句确保p人没有任何指示(他们有没有:从p节点引向关系)。

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

在上面的查询的WHERE子句是因为m的该图案中的存在,这是指在同一电影作为在比赛的不同。该查询确保正在考虑电影的这个人是由p写的,而不是由p执导。 p可能指向一些其他的电影,也许他们都自编自导的一些其他电影,但这部电影m,他们只写的,他们并没有直接的。

© www.soinside.com 2019 - 2024. All rights reserved.