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

时间:2016-08-31 02:17:04

标签: neo4j cypher boolean-logic boolean-operations

我正在尝试编写一个查询来从我的Neo4J数据库中提取数据。让我们说有五个条件决定我是否要从我的数据库中拉出_____:A,B,C,D和E.确定这个的布尔表达式是:

A && B && (C || D || E)

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

1 个答案:

答案 0 :(得分:4)

  

我无法明确定义顺序,也就是使用括号

不要那么肯定。 ;)

首先,总是一个关联或分组,即使它们是顺序执行的,也是隐含的。让我们来看一个重要的案例。

MATCH (n) RETURN CASE WHEN false AND true OR true THEN 'and' ELSE 'or' END

(只要数据库中至少有一个节点,这将有效。)

必须等同于((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

上面的查询将在第一种情况下返回“和”,在第二种情况下返回“或”,以显示首先执行的内容。它返回“和”,因为它们按顺序分组。

MATCH (n) RETURN CASE WHEN ((false AND true) OR true) THEN 'and' ELSE 'or' END

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

MATCH (n) RETURN CASE WHEN (false AND (true OR true)) THEN 'and' ELSE 'or' END

但这会返回“或”。

这是一个非常冗长的方式,说添加括号确实是答案。

为了好玩,我试图确定优先级,看起来Neo确实有优先权:

MATCH (n) RETURN CASE WHEN true or true and false THEN 'and' ELSE 'or' END

如果首先将其分组:

(true or true) and false => true and false => false

如果并且首先分组:

true or (true and false) => true or false => true

上面的查询返回'和',表示隐式分组的构造总体上被评估为真(因此,尽管最后按顺序出现,但仍先分组)。