Neo4j Graph Traversal不包括节点

时间:2014-04-10 08:57:58

标签: neo4j cypher

我试图找到两个节点之间的最短路径,但我需要从路径中排除一些节点。我正在尝试的密码是

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。

中一个节点的路径

有没有办法进行不包含某些节点的遍历?

由于

1 个答案:

答案 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)。但这也意味着它运行一次而不是排除它们中的每一个,这意味着你确实可以获得路径上存在这些节点的结果。

如果要从路径中排除这两个节点,请尝试收集它们并使用NONENOT 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