我有两个测试查询
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 <> NULL
在a IS NOT NULL
不起作用时才会发挥作用? AKA,这两个比较之间的差异是什么?
我正在使用Cypher 3.1版和Neo4j 3.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小组对它是否应该以这种方式工作有立场。