密码:WHERE ALL无法正常工作

时间:2018-07-26 14:52:45

标签: neo4j cypher

所以我的查询是针对“发现超路径问题”的。

这里的相关节点是

路线:总体路径对象

tlroutesegment::路由和不同网段(组成完整路径)之间的逻辑链接(ps:我知道使用关系可以更好地表示这一点,但是数据库是就是这样:S)

oms :物理路径会对其进行分段

validochpath :与该问题或多或少无关。顶级路线实体

接着我遇到的实际问题;下面是上面的一种工作解决方案,但是,我想通过减少此处第四行中要搜索的路由的数量来稍微优化查询。

MATCH (vp:validochpath {"some ID HERE"})-->(ort:route)<-- 
(rs:tlroutesegment)-->(oms:oms)
WITH collect(oms) AS omsNodes

MATCH (ort:route)
WHERE ALL(x in omsNodes WHERE (ort)<--(:tlroutesegment)-->(x))
WITH ort

MATCH (ort)--(vp:validochpath)

RETURN *

这是新查询的外观,如您所见,我使用该关系过滤掉了许多路由节点。

MATCH (vp:validochpath {onepID:"some ID HERE"})-->(ort:route)<-- 
(rs:tlroutesegment)-->(oms:oms)<--(rs2:tlroutesegment)

WITH rs2, collect(oms) AS omsNodes

MATCH (rs2)-->(ort2:route)
WHERE ALL(x in omsNodes WHERE (x)<--(:tlroutesegment)-->(ort2))

MATCH (ort2)--(vp:validochpath)

RETURN *

问题是,此查询似乎并未使用WHERE ALL过滤掉任何节点,而仅返回所有内容。

1 个答案:

答案 0 :(得分:0)

在第二个查询中,WHERE子句接受所有匹配项。

从第一个MATCH子句中,我们知道rs2tlroutesegment,并且omsNodes中的所有节点都与rs2相关。从第二个MATCH子句中,我们还知道ort2rs2相关。您的WHERE子句正在检查omsNodes中的所有节点是否都与{{​​1}}也相关的tlroutesegment相关。由于ort2rs2,因此此测试始终会成功。

如果要使用tlroutesegmenttlroutesegment不同的rs2节点测试路径的存在,请尝试以下WHERE子句:

WHERE ALL(x in omsNodes WHERE
  SIZE([(x)<--(y:tlroutesegment)-->(ort2) WHERE y <> rs2 | y]) > 0)