我试图找到两个节点之间的最短路径,但我需要从路径中排除一些节点。我正在尝试的密码是
START a=node(1), b=node(2), c=node(3,4)
MATCH p=a-[rel:RELATIONSHIP*]-b
WHERE NOT (c in nodes(p))
RETURN p
ORDER BY length(p) LIMIT 1
但这给了我一条包含c。
中一个节点的路径有没有办法进行不包含某些节点的遍历?
由于
答案 0 :(得分:3)
MATCH ... WHERE
部分应该没问题,但您的START
条款可能无法达到预期效果。执行以下操作并考虑结果
START a=node(1), b=node(2), c=node(3,4)
RETURN ID(a), ID(b), ID(c)
你回来了
==> +-----------------------+
==> | ID(a) | ID(b) | ID(c) |
==> +-----------------------+
==> | 1 | 2 | 3 |
==> | 1 | 2 | 4 |
==> +-----------------------+
这意味着查询的其余部分执行两次,一次从路径中排除(3)
,一次排除(4)
。但这也意味着它运行一次而不是排除它们中的每一个,这意味着你确实可以获得路径上存在这些节点的结果。
如果要从路径中排除这两个节点,请尝试收集它们并使用NONE
或NOT ANY
或类似方式进行过滤。我认为这样的事情应该做到(目前无法进行测试)。
START a=node(1), b=node(2), c=node(3,4)
WITH a, b, collect (c) as cc
MATCH p=a-[rel:RELATIONSHIP*]-b
WHERE NONE (n IN nodes(p) WHERE n IN cc)
RETURN p
ORDER BY length(p) LIMIT 1