我正在迁移到 Neo4j 1.9 并根据弃用迁移指南更新密码查询,特别是:
这 !Cypher 表达式中的属性运算符,例如 node.property!= "value" 已被弃用,请改用 has(node.property) AND node.property = "value"。
问题是当将HAS子句与NOT结合使用时,我无法获得预期的结果。例如:
当 status 属性存在并且设置为“DONE”以外的值时:
AND not(n.status! = "DONE")
评估为真(如预期)
AND not(has(n.status) AND n.status = "DONE")
评价为假???
当状态属性不存在时
AND not(n.status! = "DONE")
评估为假
AND not(has(n.status) AND n.status = "DONE")
由于节点不存在而引发异常,肯定应该阻止这种情况吗?就好像将检查包装在NOT中会阻止执行HAS检查。
这可以通过neo4j 文档网站上的实时查询示例使用以下查询进行复制:
MATCH n
WHERE NOT (n.name! = 'Peter')
RETURN n
这将返回所有 (3) 个没有名称或名称不是“Peter”的节点。这是我想要重现但不使用现在已弃用的“!”的结果 操作员。
MATCH n
WHERE NOT (HAS (n.name) AND n.name = 'Peter')
RETURN n
抛出未找到节点异常,因为一个节点没有名称属性。:/
MATCH n
WHERE (HAS (n.name) AND n.name = 'Peter')
RETURN n
正确返回名称为“Peter”的节点。
我已经尝试以几种替代方式重写查询,但似乎无法可靠地获得与已弃用的匹配的结果!操作员。也许只是太晚了,我错过了一些明显的东西?:)
任何帮助表示赞赏!
谢谢,马克。