我的问题是我有一个图,其中有很多节点代表公交车站。
我应该如何包含总线信息,例如节点之间可用的总线。
我正在考虑在节点之间创建总线关系,该关系将具有两个节点之间的所有总线的信息以及一个关系属性,该属性标记两个停靠点之间的距离。
buses[500A,182A],distance:500m buses[121B,542W,222A,111Z],distance:400m
像一个 - - - - - - - - - - - - - - - - - - - - - - - - -------> B ----------------------------------------- ------------------> C
那么,我如何找出从A到达M的一条或多条公共(public)汽车(如果没有直接路径可用)?
首先,我将找出路径(neo4j查询),如何从A到达M。
说我的路是
buses[11A],distance:1000m buses[11A],distance:250m buses[13B,100A],distance:2000m
A -----------------------------------------> L ------ -----------------------------> N ------------------- ------------------------> M
问题是我如何以编程方式检查到M的直接总线是否可用,或者我如何在两者之间互换总线。
根据上述情况,我可以通过采用13B或100A从A到N到11A,然后从N到M。
我必须以编程方式执行此操作。
我想检索两个站点之间的所有可能路径以及一条路径的总距离以及公交信息。
最佳答案
您的模型需要更具图形感。也就是说,我认为您不应该在Stop节点与总线信息之间的关系上拥有array属性。相反,公交车本身应该是具有某种关系的节点,以指示公交车停在哪一站。考虑以下示例数据:
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);
该图现在看起来像这样:
使用此模型,很容易找到一条行程,该行程可以最大程度地减少转机次数,并返回所有必要的转机信息(如果适用)。例如,从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
找到了三条路线,每条路线都有一次转移:
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 - Neo4j公交路线应用建模,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27664760/