【发布时间】:2018-09-17 13:01:45
【问题描述】:
我目前正在使用 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;}
}
提前致谢,欢迎随时提问。
【问题讨论】:
-
对不起,我不明白您查询的结果是什么,以及您想要什么结果。你能更准确地描述一下吗?
-
当前查询返回橙色线,但我希望它在到达名为 B 的第一个节点时返回。我回家后会更新图像以包含我想要的内容。
-
所以它应该只触及一个名为“B”的节点作为路径的最后一个节点?
-
它不应该返回最后一个 B,因为它已经通过了一个名为 B 的节点。它应该返回 (a)-()-()-()-(b) 而不是 (a )-()-()-()-(b)-(b)
-
@Liam 您现在的查询正在按预期工作,因此为了排除第二个“B”节点,您需要更新过滤器逻辑以说明该路径为何无效.因此,正确答案取决于您需要添加的确切限制是什么。听起来您不希望中间节点也具有名称“B”。不知道上图中空白节点的故事是什么,所以不知道是不是真的。如果我理解正确,您需要将
AND (x = e OR x.name <> "B")添加到您的过滤器中,以便只有最后一个节点被命名为“B”