首页 文章

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

提问于
浏览
2

我有两个测试查询

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上的文档没有说明(隐含)"it is an operator"之外的任何内容,所以如果存在细微的尊重,这可能是有意的 .

So why does a <> NULL work when a IS NOT NULL doesn't? AKA, What is the deference between these two comparisons?

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

1 回答

  • 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小组对它是否应该以这种方式工作有一个立场 .

相关问题