gpt4 book ai didi

neo4j - Cypher - myNode <> NULL 和 myNode IS NOT NULL 之间的区别是什么?

转载 作者:行者123 更新时间:2023-12-04 19:51:08 32 4
gpt4 key购买 nike

我有两个测试查询

CREATE (a:TEST)
DELETE a
WITH a
WHERE a <> NULL
RETURN (a:TEST)

哪个返回

Added 1 label, created 1 node, deleted 1 node, statement completed in 0 ms.

CREATE (a:TEST)
DELETE a
WITH a
WHERE a IS NOT NULL
RETURN (a:TEST)

返回

Node with id 1738 has been deleted in this transaction

根据documentation , "<>"是不等式运算符。所以我的理解是“a <> NULL”和“a IS NOT NULL”在 Cypher 中是等价的。至少,我希望“a IS NOT NULL”成为更可靠的过滤器(因为它是自己专用的比较运算符)。这看起来可能是在同一事务中创建和删除节点的边缘案例错误,但 IS NOT NULL 上的文档除了(暗示)“它是一个运算符”之外没有说任何其他内容,所以这可能是故意的,如果有一种微妙的尊重。

那么为什么 a <> NULL工作时a IS NOT NULL不是吗?也就是,这两个比较之间的区别是什么?

我使用的是 Cypher 3.1 版和 Neo4j 3.1.1 版

最佳答案

在 Cypher 中,NULL 用于表示缺失或未定义的值。因此,涉及 NULL 的相等性测试也将始终是未定义的——这被视为 false。参见 https://neo4j.com/docs/developer-manual/current/cypher/syntax/working-with-null/了解详情。

在您的示例中,标识符 a 继续引用节点,即使在 DELETE a 之后也是如此。它不是空的。在第一个示例中,您将非 NULL 标识符与 NULL 进行比较,NULL 始终未知,因此为假。因此,RETURN a 永远不会被评估,您只会看到有关创建和删除的输出。

在第二个例子中,检查是a IS NOT NULL,这是真的。 a 指代已从图中删除的节点。因此子句 RETURN a 被评估。

您收到错误 Node with id 1738 has been deleted in this transaction 因为节点的渲染试图从图中读取节点,它已被删除。值得商榷的是,节点表示仍然应该返回而不是错误。标识符 a 继续引用节点的论点是有道理的。然而,此时,Neo4j 不提供实现此目的所需的那种隔离,我认为 OpenCypher 小组对它是否应该以这种方式工作没有立场。

关于neo4j - Cypher - myNode <> NULL 和 myNode IS NOT NULL 之间的区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44114629/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com