【问题标题】:Neo4j - What is the explanation for 'WHERE NOT exists' clause?Neo4j - 'WHERE NOT exists' 子句的解释是什么?
【发布时间】:2019-02-05 16:30:23
【问题描述】:

我是 Neo4j 的新手,正在阅读他们的介绍教程,我对“WHERE NOT exists”子句的使用有点困惑。该教程显示了一个示例,他们希望返回所有写电影的人的 Person 节点,并排除导演该电影的人。他们对此的查询是:

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”(不在他们的查询结果中)的图表关系,发现他们编写和制作了电影(但不是导演的)。根据我的理解,这两个查询都应该返回相同的结果。我想知道为什么他们会返回不同的结果。任何解释差异的帮助将不胜感激。

【问题讨论】:

    标签: neo4j


    【解决方案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,他们只写了,没有导演。

    【讨论】:

    • 感谢您的解释。现在说得通了。我很困惑,因为他们写了“这是一个示例,我们要返回写电影的人的所有 Person 节点:”然后添加“接下来,我们修改此查询以排除导演该电影的人。”我没有意识到他们不想包括任何导演任何电影的人。
    猜你喜欢
    • 2013-04-17
    • 2019-05-18
    • 1970-01-01
    • 2021-05-26
    • 2017-03-01
    • 2016-01-09
    • 2012-05-16
    • 2012-06-29
    • 2013-02-10
    相关资源
    最近更新 更多