1

我正在迁移到 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”的节点。

我已经尝试以几种替代方式重写查询,但似乎无法可靠地获得与已弃用的匹配的结果!操作员。也许只是太晚了,我错过了一些明显的东西?:)

任何帮助表示赞赏!

谢谢,马克。

4

1 回答 1

6

我认为引发异常的第二个查询是一个错误。

您可以做的是使用德摩根定律来转换谓词:

MATCH n 
WHERE NOT (HAS (n.name)) OR (n.name <> 'Peter') 
RETURN n
于 2013-06-24T19:32:45.973 回答