gpt4 book ai didi

Neo4j 公交线路应用建模

转载 作者:行者123 更新时间:2023-12-04 13:32:02 26 4
gpt4 key购买 nike

我的问题是我有一个图表,其中有很多节点代表公交车站。
我应该如何包含总线信息,例如节点之间可用的总线。

我正在考虑在节点之间创建总线关系,该关系将包含两个节点之间所有总线的信息以及两个站点之间的关系属性标记距离。

      buses[500A,182A],distance:500m     buses[121B,542W,222A,111Z],distance:400m

像一个 - - - - - - - - - - - - - - - - - - - - - - - - ------->B----------------------------------------- ------------------>C

那么我将如何找到从 A 到达 M 的公共(public)汽车或公共(public)汽车(如果没有直接路径可用)?

首先,我将找出路径(neo4j 查询),如何从 A 到达 M。

说我的路是
buses[11A],distance:1000m    buses[11A],distance:250m   buses[13B,100A],distance:2000m

A----------------------------->L------ ----------------------------------------->N-------------------- ------------------------------------>M

问题是我如何以编程方式检查到 M 的直接总线是否可用,或者我如何在两者之间交换总线。

根据上述情况,我可以通过 11A 去 A 到 N,然后通过 13B 或 100A 从 N 到 M。

我必须以编程方式做到这一点。

我想检索两个车站之间的所有可能路径以及路径的总距离以及公共(public)汽车信息。

最佳答案

您的模型需要更加图形化。也就是说,我认为您不应该对 Stop 节点与总线信息之间的关系具有数组属性。相反,公共(public)汽车应该是节点本身,具有指示它们停靠在哪些站点的关系。考虑以下示例数据:

CREATE (a:Stop {name:'A'}),
(b:Stop {name:'B'}),
(c:Stop {name:'C'}),
(d:Stop {name:'D'}),

(a)-[:NEXT {distance:1}]->(b),
(b)-[:NEXT {distance:2}]->(c),
(c)-[:NEXT {distance:3}]->(d),

(b1:Bus {id:1}),
(b2:Bus {id:2}),
(b3:Bus {id:3}),

(b1)-[:STOPS_AT]->(a),
(b1)-[:STOPS_AT]->(b),
(b2)-[:STOPS_AT]->(a),
(b2)-[:STOPS_AT]->(b),
(b2)-[:STOPS_AT]->(c),
(b3)-[:STOPS_AT]->(b),
(b3)-[:STOPS_AT]->(c),
(b3)-[:STOPS_AT]->(d);

该图现在看起来像这样:

model

使用此模型,很容易找到一个行程,以最大限度地减少转移次数,并返回所有必要的转移信息(如果适用)。例如,从 A 到 D 的所有最短行程(就转移次数而言最短):
MATCH (a:Stop {name:'A'}), (d:Stop {name:'D'})
MATCH p = allShortestPaths((a)-[:STOPS_AT*]-(d))
RETURN EXTRACT(x IN NODES(p) | CASE WHEN x:Stop THEN 'Stop ' + x.name
WHEN x:Bus THEN 'Bus ' + x.id
ELSE '' END) AS itinerary

找到了 3 条路线,它们都有一个转机:
Stop A, Bus 2, Stop C, Bus 3, Stop D
Stop A, Bus 1, Stop B, Bus 3, Stop D
Stop A, Bus 2, Stop B, Bus 3, Stop D

当然,您可以使用 EXTRACT() 返回此信息。功能。

另一个例子。查找从 A 到 C 的行程:
MATCH (a:Stop {name:'A'}), (c:Stop {name:'C'})
MATCH p = allShortestPaths((a)-[:STOPS_AT*]-(c))
RETURN EXTRACT(x IN NODES(p) | CASE WHEN x:Stop THEN 'Stop ' + x.name
WHEN x:Bus THEN 'Bus ' + x.id
ELSE '' END)

找到了一条路线,但没有转机:
Stop A, Bus 2, Stop C

如果这回答了您的问题,请告诉我。

编辑:要获得距离:
MATCH (a:Stop {name:'A'}), (d:Stop {name:'D'})
MATCH route = allShortestPaths((a)-[:STOPS_AT*]-(d)),
stops = (a)-[:NEXT*]->(d)
RETURN EXTRACT(x IN NODES(route) | CASE WHEN x:Stop THEN 'Stop ' + x.name
WHEN x:Bus THEN 'Bus ' + x.id
ELSE '' END) AS itinerary,
REDUCE(d = 0, x IN RELATIONSHIPS(stops) | d + x.distance) AS distance


itinerary distance
Stop A, Bus 1, Stop B, Bus 3, Stop D 6
Stop A, Bus 2, Stop B, Bus 3, Stop D 6
Stop A, Bus 2, Stop C, Bus 3, Stop D 6

关于Neo4j 公交线路应用建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27664760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com