Neo4J通过更多点查找路线

Neo4J通过更多点查找路线,neo4j,Neo4j,我正在为几个城市之间的交通创建简单的图形数据库。我的结构是: 站点=物理站点 Stop=根据时间和线路ID,每个站点有几个站点 行驶=停车间的连接 我需要找到从城市A到城市C的路线,但我没有直接的站点连接,但它们是通过城市B连接的。请参见,作为新用户,我无法向问题发布图像 我怎样才能从A城通过1号站连接1号站到2号站的路由器 2号站由同一城市B连接至3号站,最终由3号站由RIDE2连接至4号站(城市C) 多谢各位 更新 Vince的解决方案是可以的,但我需要设置过滤器来停止节点的离开时间,比

我正在为几个城市之间的交通创建简单的图形数据库。我的结构是:

  • 站点=物理站点
  • Stop=根据时间和线路ID,每个站点有几个站点
  • 行驶=停车间的连接
我需要找到从城市A到城市C的路线,但我没有直接的站点连接,但它们是通过城市B连接的。请参见,作为新用户,我无法向问题发布图像

我怎样才能从A城通过1号站连接1号站到2号站的路由器 2号站由同一城市B连接至3号站,最终由3号站由RIDE2连接至4号站(城市C)

多谢各位

更新

Vince的解决方案是可以的,但我需要设置过滤器来停止节点的离开时间,比如

MATCH p=shortestPath((a:City{name:'a'})-[*{departuretime>xxx}]-(c:City{name:'c'}))返回p


在没有迭代的情况下,是否可以执行“所有匹配项”集合?因为它会变慢。

如果您只是在两个节点之间寻找一条路由,此密码查询将返回两个城市节点a和C之间的最短路径

MATCH p=shortestPath((a:City {name:'A'})-[*]-(c:City {name:'C'})) RETURN p
通常,如果图形中有许多潜在路径,则应适当限制搜索深度:

MATCH p=shortestPath((a:City {name:'A'})-[*..4]-(c:City {name:'C'})) RETURN p
如果要返回所有可能的路径,可以省略shortestPath子句:

MATCH p=(a:City {name:'A'})-[*]-(c:City) {name:'C'}) RETURN p
同样的警告也适用。有关详细信息,请参阅

更新 在你随后的评论之后

我不确定time属性的确切用途是什么,但似乎您实际上想要基于某个最小时间成本在两个节点之间创建最短加权路径。当然,这与最短路径不同,因为它只最小化了遍历的边的数量,而不是这些边的成本

您通常会在边上而不是节点上对遍历成本进行建模,但图形仅在停止节点上有时间(例如在行驶边或城市节点上没有时间)。要使最短加权路径查询在这里工作,我们还需要将时间建模为所有节点和边上的属性。如果进行此更改,并将不相关的所有节点/边的值设置为0,那么下面的Cypher查询将执行我认为需要的操作

MATCH p=(a:City {name: 'A'})-[*]-(c:City {name:'C'})
RETURN p AS shortestPath, 
   reduce(time=0, n in nodes(p) | time + n.time) AS m,
   reduce(time=0, r in relationships(p) | time + r.time) as n 
   ORDER BY m + n ASC
   LIMIT 1
在您的示例图中,这将生成a和C之间的最小成本路径:

(A)->(STOP1)-(STOP2)->(B)->(STOP5)->(STOP6)->(C)
最低时间成本为230

这条路径包括两个您指定为“坏”的站点,尽管我真的不明白它们为什么坏,因为它们的遍历成本比其他非“坏”的站点要少

或者,使用Dijkstra


这种简单的密码可能无法在稠密连通图上执行。如果发现性能有问题,应该使用RESTAPI和源节点的路径端点,并使用Dijkstra算法请求到目标节点的最短加权路径。详细信息

Ah好的,如果要求通过图形查找路径,其中每一站的发车时间不早于前一站的发车时间,则该方法应适用于:

MATCH p=(:City {name:'A'})-[*]-(:City {name:'C'})
MATCH (a:Stop) where a in nodes(p)
MATCH (b:Stop) where b in nodes(p)
WITH p, a, b order by b.time
WITH p as ps, collect(distinct a) as as, collect(distinct b) as bs
WHERE as = bs
WITH ps, last(as).time - head(as).time as elapsed 
RETURN ps, elapsed ORDER BY elapsed ASC
这个查询的工作原理是匹配每个可能的路径,然后收集每个匹配路径上的所有站点两次。其中一个站点是按出发时间排序的,而另一个不是。只有当两个集合相等(即数量和顺序)时,才允许路径进入结果。此步骤退出无效路由。最后,路径本身是按第一站和最后一站之间的最短时间排序的,因此最快的路线是列表中的第一条


关于性能等的正常警告。应用:)

如果您可以使用此处共享示例图,则该警告将很好。现在控制台中已准备就绪,谢谢。。。我把第一个匹配放在控制台上是可以的,但是我创建了2个以上的带有坏时间的停止(低于到达时间)我需要一个带有stop.time的过滤查询,因为我有大约30000个停止/44个城市,查询耗时超过10分钟。附录:
match p=(a:City{name:'a'}-->(s1 stop)-[*]->(s2:stop)-->(c:City{name:'c})其中s2.time>100返回s1 s2,p
仍然返回乘坐3的时间不好,当然我不知道需要使用多少个城市地铁站,至少2 IN/out谢谢您的回答,时间我指的是出发时间,而不是重量或成本这条路线。每一站都有到达和离开的时间(在我的例子中只有一次——我的事情并不重要)。当一条从a城市到C城市的路线是值勤路线时,最后一次出发的时间低于到达B城市的时间(STOP2)——所以“坏”的指定乘车(3)意味着这种情况不起作用。谢谢,它工作正常,但速度非常慢。我有21个城市,21个站点,20次从起点到终点的骑行,耗时约12秒。有提高速度的想法吗?对于生产,我将有大约4.5万站,这将是无用的。