Neo4j 密码查询语言 - 布尔表达式的操作顺序

mil*_*aan 1 boolean-logic neo4j boolean-operations cypher

我正在尝试编写一个查询来从 Neo4J 数据库中提取数据。假设有五个条件决定我是否想从我的数据库中提取 _____:A、B、C、D 和 E。决定这一点的布尔表达式是:

A && B && (C || D || E)
Run Code Online (Sandbox Code Playgroud)

从网上搜索,我找不到任何关于 Neo4J AND 和 OR 查询遵守的操作顺序的信息(AND 通常在 OR 之前),但从我的观察来看,它们似乎是按顺序执行的。由于我知道没有办法明确定义顺序,也就是使用括号,如何实现 Cypher 查询来满足上面的布尔表达式?

Two*_*ist 5

我知道没有办法明确定义顺序,也就是使用括号

不要那么肯定。;)

首先,总是存在关联或分组,即使在它们按顺序执行时它是隐式的。让我们看一个案例,这很重要。

MATCH (n) RETURN CASE WHEN false AND true OR true THEN 'and' ELSE 'or' END
Run Code Online (Sandbox Code Playgroud)

(只要您的数据库中至少有一个节点,这将起作用。)

必须等于((false and true) or true)(false and (true or true)),但它们有不同的结果。

(false and true) or true => false or true => true
false and (true or true) => false and true => false
Run Code Online (Sandbox Code Playgroud)

上面的查询将在第一种情况下返回“and”,在第二种情况下返回“or”,以显示哪个先执行。它返回“and”,因为它们按顺序分组。

MATCH (n) RETURN CASE WHEN ((false AND true) OR true) THEN 'and' ELSE 'or' END
Run Code Online (Sandbox Code Playgroud)

这也会返回“and”,因为这是您按顺序执行布尔运算符时得到的隐含分组。

MATCH (n) RETURN CASE WHEN (false AND (true OR true)) THEN 'and' ELSE 'or' END
Run Code Online (Sandbox Code Playgroud)

但这会返回“或”。

这是一种非常冗长的说法,即添加括号确实是答案。


只是为了好玩,我试图确定优先级,看来 Neo 确实有 and-precedence:

MATCH (n) RETURN CASE WHEN true or true and false THEN 'and' ELSE 'or' END
Run Code Online (Sandbox Code Playgroud)

如果 or 被首先分组:

(true or true) and false => true and false => false
Run Code Online (Sandbox Code Playgroud)

如果 and 首先分组:

true or (true and false) => true or false => true
Run Code Online (Sandbox Code Playgroud)

上面的查询返回“and”,表示隐式分组构造的整体评估为真(因此,尽管最后出现,但首先分组)。

  • 我刚才又看了一遍,有一个真值表,但没有优先表[在文档中](https://neo4j.com/docs/cypher-manual/current/syntax/operators/#query-operators-boolean)。该页面中没有出现“优先”一词。由于它没有明确提供,但即使是由于实现而意外地存在,您也必须计算出优先级是什么,如上所示。 (2认同)