我目前正在使用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来解决问题,但我需要使用名称。
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将找到每个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