Neo4j ShortestPath重复属性

问题描述 投票:1回答:1

我目前正在使用Neo4j的内置最短路径算法。

MATCH p = shortestpath((s:Node {Name: "A"})-[Link*1..500]->(e:Node {Name: "B"})) 
WHERE ALL(x in relationships(p) WHERE x.Value = true)
RETURN p

问题是,当我运行算法时,尽管通过第一个“B”(橙色线),它仍然可以返回第二个“B”。我怎么才能让它返回“B”的第一个实例?

我知道我可以通过使用唯一的Id来解决问题,但我需要使用名称。

enter image description here

public class Node
{
   public long Id {get;set;}
   public string Name {get;set;}
   public long X {get;set;}
   public long Y {get;set;}
}

public class Link {
   public bool Value {get;set;}
   public long Length {get;set;}
}

提前致谢,随时提出问题。

neo4j cypher
1个回答
1
投票

使用您的查询,neo4j将找到每个A节点和每个B节点,然后找到从每个A到每个B的所有最短路径。在控制台UI中呈现的是来自该查询的所有结果节点以及连接每个节点的每个关系。如果单击查询窗口左侧的_Text_按钮,将会更清楚地发生了什么。对于A dn B节点之间匹配的每条最短路径,您将看到一条谨慎的行。

在阅读了你的问题之后,我希望你所追求的是一个与特定A节点匹配的查询,然后遍历它直到遇到B节点。

apoc路径扩展过程调用可能更适合您的需求。如果你可以在B节点上添加标签B,那么你可以使用apoc.path.expand找到你正在寻找的路径。

您可以使用以下命令设置B标签。

MATCH (n:Node {Name: 'B'}
SET n:B

以下是使用apoc.path.expand的示例查询,该查询应在遇到的第一个B节点处停止。

MATCH (a:Node {Name: 'A'})
WITH a
CALL apoc.path.expand(a, 'Link', '+Node|/B', 1, 500) YIELD path
RETURN path
© www.soinside.com 2019 - 2024. All rights reserved.