Neo4j 带中间节点的密码匹配路径

Neo4j 带中间节点的密码匹配路径,neo4j,cypher,shortest-path,Neo4j,Cypher,Shortest Path,下面的图表显示了停止(红色)和连接(绿色)节点 我想使用Connection上的cost属性找到从A到C的最短路径 我希望避免建立连接关系,因为这样我就失去了Foo的包含关系 我可以像这样跳一跳 MATCH p=(:Stop {name:'A'})<-[:BEGINS_AT]-(:Connection)-[:ENDS_AT]->(:Stop {name:'B'}) RETURN p 请注意,连接是单向的,因此不能从C转到A 没有任何Neo4j插件,有没有办法做到这一点?如果你想计

下面的图表显示了
停止
(红色)和
连接
(绿色)节点

我想使用
Connection
上的cost属性找到从
A
C
的最短路径

我希望避免建立
连接
关系,因为这样我就失去了
Foo的
包含
关系

我可以像这样跳一跳

MATCH p=(:Stop {name:'A'})<-[:BEGINS_AT]-(:Connection)-[:ENDS_AT]->(:Stop {name:'B'}) RETURN p
请注意,连接是单向的,因此不能从
C
转到
A


没有任何Neo4j插件,有没有办法做到这一点?

如果你想计算加权最短路径,那么使用GDS甚至APOC插件是最简单的。您可能可以使用cypher创建最短加权路径函数,但它不会得到优化。我只能考虑找到两个节点之间的所有路径并求和权重。在下一步中,您将使用最小权重和过滤路径。不过,这并不能很好地扩展


至于你问题的第二部分,我需要更多的信息,因为我不知道你到底想要什么。

这应该得到所有可用的路径(没有插件):

要获得最短路径,请执行以下操作:

WITH ['BEGINS_AT', 'ENDS_AT'] AS types
MATCH p=(a:Stop)-[:BEGINS_AT|ENDS_AT*]-(b:Stop)
WHERE a.name = 'A' AND b.name = 'B' AND
  ALL(i IN RANGE(0, LENGTH(p)-1) WHERE TYPE(RELATIONSHIPS(p)[i]) = types[i%2])
RETURN p
ORDER BY LENGTH(p)
LIMIT 1;


谢谢通过查看均匀/不均匀关系类型来确保正确方向的技巧非常巧妙。我添加了这样的成本优化
REDUCE(total=0,节点中的n(p)| total+COALESCE(n.cost,0))作为totalCost
WITH ['BEGINS_AT', 'ENDS_AT'] AS types
MATCH p=(a:Stop)-[:BEGINS_AT|ENDS_AT*]-(b:Stop)
WHERE a.name = 'A' AND b.name = 'B' AND
  ALL(i IN RANGE(0, LENGTH(p)-1) WHERE TYPE(RELATIONSHIPS(p)[i]) = types[i%2])
RETURN p
WITH ['BEGINS_AT', 'ENDS_AT'] AS types
MATCH p=(a:Stop)-[:BEGINS_AT|ENDS_AT*]-(b:Stop)
WHERE a.name = 'A' AND b.name = 'B' AND
  ALL(i IN RANGE(0, LENGTH(p)-1) WHERE TYPE(RELATIONSHIPS(p)[i]) = types[i%2])
RETURN p
ORDER BY LENGTH(p)
LIMIT 1;
WITH ['BEGINS_AT', 'ENDS_AT'] AS types
MATCH p=shortestpath((a:Stop)-[:BEGINS_AT|ENDS_AT*]-(b:Stop))
WHERE a.name = 'A' AND b.name = 'B' AND
  ALL(i IN RANGE(0, LENGTH(p)-1) WHERE TYPE(RELATIONSHIPS(p)[i]) = types[i%2])
RETURN p