Cypher - myNode<>之间的差异是什么? NULL和myNode是不是NULL?

时间:2017-05-22 13:50:16

标签: neo4j cypher

我有两个测试查询

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,&#34;&lt;&gt;&#34;是不平等的运营商。所以我的理解是&#34; a&lt;&gt; NULL&#34;并且&#34;一个IS NOT NULL&#34;相当于Cypher。至少,我希望&#34;一个IS NOT NULL&#34;成为更可靠的过滤器(因为它是自己的专用比较运算符)。这似乎可能是在同一事务中创建和删除节点的边缘案例错误,但IS NOT NULL上的文档并没有说明(隐含)&#34;它是一个运算符&#34; ,如果有微妙的尊重,这可能是有意的。

那么为什么a <> NULLa IS NOT NULL不起作用时才会发挥作用? AKA,这两个比较之间的差异是什么?

我正在使用Cypher 3.1版和Neo4j 3.1.1版

1 个答案:

答案 0 :(得分:3)

在Cypher中,NULL用于表示缺失或未定义的值。因此,涉及NULL的相等测试也将始终未定义 - 被视为false。有关详细信息,请参阅https://neo4j.com/docs/developer-manual/current/cypher/syntax/working-with-null/

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

在第二个示例中,检查为a IS NOT NULL,这是真的。 a是指已从图表中删除的节点。因此评估了RETURN a条款。

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