我有两个测试查询
CREATE (a:TEST)
DELETE a
WITH a
WHERE a <> NULL
RETURN (a:TEST)
Run Code Online (Sandbox Code Playgroud)
哪个返回
Added 1 label, created 1 node, deleted 1 node, statement completed in 0 ms.
Run Code Online (Sandbox Code Playgroud)
和
CREATE (a:TEST)
DELETE a
WITH a
WHERE a IS NOT NULL
RETURN (a:TEST)
Run Code Online (Sandbox Code Playgroud)
哪个返回
Node with id 1738 has been deleted in this transaction
Run Code Online (Sandbox Code Playgroud)
根据文档,“<>”是不等运算符。所以我的理解是“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 进行比较,NULL 始终未知,因此为 false。因此,RETURN a永远不会评估,您只能看到有关创建和删除的输出。
在第二个示例中,检查为a IS NOT NULL,这是 true。a指已从图中删除的节点。所以该条款RETURN a被评估。
您收到错误Node with id 1738 has been deleted in this transaction是因为节点的渲染尝试从图表中读取已被删除的节点。有争议的是,仍然应该返回节点表示而不是错误。a标识符继续引用节点的论点是有道理的。然而,目前 Neo4j 并未提供实现此目的所需的隔离,并且我不认为 OpenCypher 小组对于是否应该以这种方式工作有立场。
| 归档时间: |
|
| 查看次数: |
5206 次 |
| 最近记录: |