Cypher查询条件总是返回true

问题描述 投票:0回答:2
MATCH (c:OBJ {dummy:false})
where [{param} is null or [(c)-[]->(p:PRO {dummy:false}) WHERE p.val ={param} | true ] ]
return c

我有一个很大的问题,有一个简单的部分。但

[{param} is null or [(c)-[]->(p:PRO {dummy:false}) WHERE  p.val = {param} | true] ]

即使p.val ={param}是假的,部分总是返回true。我在这做错了什么?语法对我来说很好。

neo4j cypher
2个回答
1
投票

这里有几件事情要发生。请注意cybersam的答案,因为它涉及到内部的模式理解。

但是,更大的问题是WHERE子句最终将评估列表,而不是布尔值!

通过使用方括号作为整个WHERE子句,这意味着您正在创建一个列表,其内容将是内部的任何内容。里面的东西将评估为布尔值,因此这意味着有两种可能性:

WHERE [true]

要么

WHERE [false]

在这些情况下,这些都不是布尔值,而是单元素列表,其中列表中唯一的元素是布尔值!

在像这样的列表上使用WHERE将始终评估为true。无论列表中的内容如何。无论列表中有多少元素。无论列表是否为空。如果列表本身存在,它将被评估为true,并且WHERE子句成功。

因此,要解决所有这些问题,请不要使用方括号作为划分布尔逻辑的一些方法。请改用括号,并且仅在您确实需要它们时使用:

MATCH (c:OBJ {dummy:false})
WHERE ( {param} is null or (c)-->(:PRO {dummy:false, val:{param}}) )
RETURN c

在上面,实际上并不需要使用WHERE子句时使用的括号,但如果您愿意,可以使用它们。

这也应该是表达所需谓词的更好方法。在这种情况下,我们根本不需要模式理解。足以说我们要么需要{param}参数为null,要么必须存在这种模式(其中一个属性是{param}参数)。

如果你真的最终需要模式理解,请遵循cybersam的建议,并确保你正在测试理解产生的列表是空的还是非空的。


2
投票

pattern comprehension将始终返回一个列表,即使它是空的。

所以,以下永远不会等同于falseNULL

[(c)-[]->(p:PRO {dummy:false}) WHERE  p.val = {param} | true]

此查询(测试内部理解结果的大小)可能适合您:

MATCH (c:OBJ {dummy:false})
WHERE [$param IS NULL or SIZE([(c)-->(p:PRO {dummy:false}) WHERE p.val = $param | true]) > 0 ]
RETURN c
© www.soinside.com 2019 - 2024. All rights reserved.