0

我有一个节点,我们称它为 X。我想找到最接近 X 的节点,我们将其命名为 Y,并且 Y 必须有一个特定的标签。如果有多个这样的 Y 节点到 X 的距离相同,我希望它们都被返回

假设我们有某个标签的节点 A 和 B。从 X 到 A 的最小路径长度是 3,从 X 到 B 是 5。我希望它返回 A,并且只返回 A。如果最小路径长度相等,我希望它返回它们(A 和二)

这是我到目前为止所拥有的:

MATCH p=shortestPath((selectedNode {name:'X'})-[*]-(y:GivenLabel))
WITH y.name as y, length(p)=min(length(p)) AS l
RETURN y

这个查询的问题是它在上面的例子中返回了 A 和 B,不管它们的最小路径是什么。我考虑过使用 LIMIT 1 并订购它们,但它只会显示其中一个,即使它们每个的最小路径长度相等

提前致谢!

4

2 回答 2

0

如果您有 APOC 程序,则可以使用路径扩展程序之一来找到给定标签的最短路径并对其进行限制。不幸的是,您需要第二次调用才能在相同距离处获取标签的多个节点。

// assume we've already MATCHed to selectedNode
...
CALL apoc.path.expandConfig(selectedNode, {labelFilter:'/GivenLabel', limit:1}) YIELD path
WITH selectedNode, length(path) as pathLength
CALL apoc.path.subgraphNodes(selectedNode, {labelFilter:'/GivenLabel', maxLevel:pathLength}) YIELD node
RETURN node

在标签过滤器中,前缀 of/表示标签将用于终止过滤器,一旦找到第一次出现,它将停止扩展,并使用该节点作为结果。

默认情况下,路径扩展器 procs 使用广度优先扩展,因此它将是从您的起始节点到给定标签的节点的最短路径。

limit:1确保我们在找到第一个结果后返回(如果没有给定标签的这样的节点,或者如果它很远,这可能会非常昂贵,因此您可以考虑提供 amaxLevel作为上限)。

我们使用之前找到的路径长度作为我们的 maxLevel 进行类似的路径扩展器调用(subgraphNodes(),因为我们不再需要路径,只需要末尾的节点),这将返回具有给定标签的所有节点距离。

于 2021-04-22T14:27:45.193 回答
0

collect函数将允许您返回包含值列表的单行。

MATCH p=shortestPath((selectedNode {name:'X'})-[*]-(y:GivenLabel))
RETURN length(p) AS l, collect(y.name) as targets
ORDER BY l
LIMIT 1

如果要将值作为单独的记录而不是列表返回,则可以使用UWIND

MATCH p=shortestPath((selectedNode {name:'X'})-[*]-(y:GivenLabel))
WITH length(p) AS l, collect(y.name) as targets
ORDER BY l
LIMIT 1
UNWIND targets as target
RETURN l, target
于 2021-04-21T17:31:48.720 回答