所以我的查询是针对“发现超路径问题”的。
这里的相关节点是
路线:总体路径对象
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过滤掉任何节点,而仅返回所有内容。
答案 0 :(得分:0)
在第二个查询中,WHERE
子句接受所有匹配项。
从第一个MATCH
子句中,我们知道rs2
是tlroutesegment
,并且omsNodes
中的所有节点都与rs2
相关。从第二个MATCH
子句中,我们还知道ort2
与rs2
相关。您的WHERE
子句正在检查omsNodes
中的所有节点是否都与{{1}}也相关的tlroutesegment
相关。由于ort2
是rs2
,因此此测试始终会成功。
如果要使用tlroutesegment
与tlroutesegment
不同的rs2
节点测试路径的存在,请尝试以下WHERE
子句:
WHERE ALL(x in omsNodes WHERE
SIZE([(x)<--(y:tlroutesegment)-->(ort2) WHERE y <> rs2 | y]) > 0)