我尝试基于Neo4j数据库中的数据开发多模式路由系统。 我的想法如下:
停止: 代表公共汽车站,铁路站,乘车分享优惠,汽车租赁或汽车共享站等的节点。
时间表: 此停靠点的服务时间表。 在公共交通方面,它包括工作日的出发时间。在汽车租赁的情况下,它包括例如开放时间。对于乘车分享,它包括出发日期和时间。
优惠: 此止损的相应移动性报价。如果当前止损属于公共交通,则这只是服务项目的标记和其他一些信息。在乘车共享的情况下,它包含有关此的其他信息。
connected_by: 节点通过此边缘连接,如果它是相同的运输模式(停止时没有变化等) 属性是:距离,旅行时间,价格
switch_to(也可以称为connected_by,但具有不同的属性): 如果节点是不同的运输模式,则通过此边缘连接节点(需要停止更改) 属性是:切换时间
scheduled_by: 节点和时间表通过此边缘连接。
offered_by: 时间表和优惠通过此边缘连接。
如果用户要求从A点到B点的连接,我该如何计算? 我的第一个想法是这样的:
MATCH (from {name: 'test'}),(to {name: 'test3'}), p = (from)-[:connected_by*]-(to)
RETURN p AS shortestPath, reduce(cost=0, rel in relationships(p) | cost + rel.cost) AS totalCost
ORDER BY totalCost ASC
但我真正想要的是:
从A点到B点的所有节点,相应的报价,总价,所需的开关(改变运输方式)和总的行驶时间。特别是旅行时间很难,因为必须考虑:
此外,价格很难,因为它可能是一个连接(乘车份额,铁路)的价格,时间取决于价格(汽车共享,每小时/每天)或公共交通票(对多个连接有效但是只是某段时间和某个区域。)
有没有办法通过cypher声明实现这一目标?也许如果我简化数据结构(信息必须相同)?如果没有,获取此信息的最佳方式是什么(Java程序?)。
以下是一个例子:
在该示例中,您可以看到从A点到目的地的一个人的计算。因此,该人必须步行,乘坐公共汽车并使用乘车分享。