Neo4j中不起作用的入职关系的WHERE NOT条款
我有一个neo4j数据库,其中两个用户试图交易多张卡。 每个交易节点对交易涉及的两个用户有两个传出关系, 以及正在交易的卡片。 如果未达成协议,则会创建一个后续交易,指向具有Neo4j中不起作用的入职关系的WHERE NOT条款,neo4j,cypher,Neo4j,Cypher,我有一个neo4j数据库,其中两个用户试图交易多张卡。 每个交易节点对交易涉及的两个用户有两个传出关系, 以及正在交易的卡片。 如果未达成协议,则会创建一个后续交易,指向具有先前关系的前一交易。 如果达成协议,贸易链的最后一个节点将标记为success:true属性 下图显示了两个用户之间的交易示例 我正在尝试获取ID为10和20的两个用户之间的所有最后交易节点。 最后一个交易节点是没有传入关系的节点 我的尝试是: MATCH (u:User)<--(t:Trade)-->(n:U
先前关系的前一交易。
如果达成协议,贸易链的最后一个节点将标记为success:true
属性
下图显示了两个用户之间的交易示例
我正在尝试获取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
匹配(u:用户)(n:用户)
其中(ID(u)=10且ID(n)=20)或(ID(u)=20且ID(n)=10)
而不是(t)我认为问题在于布尔求值的顺序
也就是说,并在或之前(但在括号之后)进行计算,因此您(简化了)得到的结果是:
其中()或()和
首先计算AND分组,因此其行为类似于:
WHERE()或(()和)
因此,只要第一个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]-()
式中((ID(u)=10且ID(n)=20)或(ID(u)=20且ID(n)=10))
事实并非如此。我的解释稍微简化了一点。