NOT 运算符无法按密码查询中的预期进行过滤

NOT operator fails to filter as expected in cypher query

我无法让 NOT 运算符在我的密码查询中工作。

以下查询有效并且 returns 结果:

MATCH p=(a)<-[*]-(b:WorkOrderNode)
WHERE ID(a)=107
AND b.action_code='INS'
AND NONE(x in nodes(p) WHERE exists(x.action_code) AND x.action_code='PULL')
RETURN b

但是,这个查询对我的业务逻辑不是那么有效,因为可以有任意数量的操作,所以我真正想要的是排除任何可能存在具有工作操作的节点的路径 other than 'MV' or 'SPT' (work action is not 'MV' or 'SPT').

因此,我将代码更新为:

MATCH p=(a)<-[*]-(b:WorkOrderNode)
WHERE ID(a)=107
AND b.action_code='INS'
AND NONE(x in nodes(p) WHERE exists(x.action_code) AND NOT x.action_code IN ['MV', 'SPT'])
RETURN b

但问题是此查询没有返回任何结果。

这两个语句在逻辑上应该是等价的吧? x.action_code='PULL' ==(?) NOT x.action_code IN ['MV', 'SPT']

我也试过以下方法,但还是不行。我显然遗漏了一些东西:

MATCH p=(a)<-[*]-(b:WorkOrderNode)
WHERE ID(a)=107
AND b.action_code='INS'
AND NONE(x in nodes(p) WHERE exists(x.action_code) AND (x.action_code <> 'MV' OR x.action_code <> 'SPT'))
RETURN b

好吧,傻我。

问题不在于两个语句(x.action_code='PULL'NOT x.action_code IN ['MV', 'SPT'])之间的逻辑等价。

这是由于WHERE b.action_code='INS'NOT x.action_code IN ['MV', 'SPT']之间的冲突。由于我感兴趣的路径由具有 INS 工作操作的 WorkOrderNodes 组成,如果不将它们包含在操作列表中将删除在先前条件中找到的所有路径。

这是解决方案:

MATCH p=(a)<-[*]-(b:WorkOrderNode)
WHERE ID(a)=107
AND b.action_code='INS'
AND NONE(x in nodes(p) WHERE exists(x.action_code) AND NOT x.action_code in ['MV', 'SPT', 'INS'])
RETURN b

如果要确保路径 (b) 的最终节点始终具有 b.action_code='INS' 并且其他节点的 none 具有 'INS' , 也许更好的方法是使用

NONE(x in nodes(p)[..-1]    .....  NOT x.action_code in ['MV', 'SPT'])

而不是

NONE(x in nodes(p) ...