WHERE NOT子句,用于在Neo4j中无法正常工作的关系

时间:2018-08-03 10:35:12

标签: neo4j cypher

我有一个neo4j数据库,其中两个用户试图交易许多卡。 每个交易节点对交易涉及的两个用户都有两个传出关系, 以及正在交易的卡。 如果未达成协议,则创建后续交易,该交易指向具有PREVIOUS关系的上一个交易。 如果达成协议,则贸易链的最后一个节点将标记为success:true属性。

enter image description here

下图显示了两个用户之间的交易示例。

我正在尝试获取ID为10和20的两个用户之间的所有最后交易节点。 最后一个贸易节点是没有传入关系的贸易节点。

我的尝试是这样:

MATCH (u:User)<--(t:Trade)-->(n:User)
WHERE (ID(u)=10 AND ID(n)=20) OR (ID(u)=20 AND ID(n)=10) 
AND NOT (t)<-[:PREVIOUS]-()
RETURN t

但是,以上返回所有3个交易节点。实际上,第三行似乎没有 查询结果的差异。

那是为什么?我还能如何实现我的目标?

1 个答案:

答案 0 :(得分:1)

我认为问题在于布尔值评估的顺序。

也就是说,AND是在OR之前(但在括号之后)求值的,所以您拥有的(简化后)是:

WHERE (<id check 1>) OR (<id check 2>) AND <not pattern>

首先对AND分组进行评估,因此其行为类似于:

WHERE (<id check 1>) OR ((<id check 2>) AND <not pattern>)

只要第一个id检查结果为true,那么整个WHERE子句就会显示为true。

要解决此问题,请添加括号以包围ID谓词,如下所示:

WHERE ((ID(u)=10 AND ID(n)=20) OR (ID(u)=20 AND ID(n)=10))
AND NOT (t)<-[:PREVIOUS]-()
相关问题