Neo4j密码查询:WHERE子句中未考虑括号吗?

问题描述 投票:1回答:1

我正在尝试像这样运行查询:

MATCH (n:Type1)-[:relation1]->(:Type1)<-[:relation2]-(:Type2) WHERE
((n.prop1="A" and n.prop2 in [42, 34]) OR
 (n.prop1="B" and n.prop2 in [67])     OR
 (n.prop1="C" and n.prop2 in [51, 43]) OR
 (n.prop1="D" and n.prop2 in [56, 42])) 
RETURN DISTINCT id(n) as node_id, n.prop3 as node_prop3, n.prop1 as prop1, n.prop2 as prop2;

这给出了混合结果,即prop1="D"prop2=51匹配,这显然不在预期条件下。好像括号在条件句的形成中没有发言权。当我在WHERE子句中运行不带括号的查询时,结果是相同的。

尽管,如果我查询类似的内容:

MATCH (n:Type1)-[:relation1]->(:Type1)<-[:relation2]-(:Type2) WHERE
((n.prop1="A" and n.prop2=42) OR
 (n.prop1="A" and n.prop2=34) OR
 (n.prop1="B" and n.prop2=67) OR
 (n.prop1="C" and n.prop2=51) OR
 (n.prop1="C" and n.prop2=43) OR
 (n.prop1="D" and n.prop2=56) OR
 (n.prop1="D" and n.prop2=42)) 
RETURN DISTINCT id(n) as node_id, n.prop3 as node_prop3, n.prop1 as prop1, n.prop2 as prop2;

为了避免重复对IN进行字符串比较,在示例1中用prop1替换示例2中的单独条件时,我是否缺少某些东西?

neo4j nosql cypher graph-databases
1个回答
0
投票

我相信IN会按预期工作。

设置样本数据。

(:Type1 {prop1:"A", prop2:34}),
(:Type1 {prop1:"B", prop2:67}),
(:Type1 {prop1:"C", prop2:51}),
(:Type1 {prop1:"C", prop2:43}),
(:Type1 {prop1:"D", prop2:56}),
(:Type1 {prop1:"D", prop2:42}),
(:Type1 {prop1:"D", prop2:51}),
(:Type1 {prop1:"B", prop2:42});

MATCH (t:Type1)
MERGE (t)-[:relation1]->(:Type1)<-[:relation2]-(:Type2);

现在运行查询。

MATCH (n:Type1)-[:relation1]->(:Type1)<-[:relation2]-(:Type2) WHERE
((n.prop1="A" and n.prop2 in [42, 34]) OR
 (n.prop1="B" and n.prop2 in [67])     OR
 (n.prop1="C" and n.prop2 in [51, 43]) OR
 (n.prop1="D" and n.prop2 in [56, 42])) 
RETURN DISTINCT id(n) as node_id, n.prop3 as node_prop3, n.prop1 as prop1, n.prop2 as prop2;

该语句返回七个记录,并且结果不包括prop1 = D且prop2 = 51的节点。

如果省略括号,请参见this answer以获取有关布尔运算符优先级的信息。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.