Graph 在neo4j中获取间接路由,考虑它们在路由中出现的顺序

Graph 在neo4j中获取间接路由,考虑它们在路由中出现的顺序,graph,neo4j,shortest-path,Graph,Neo4j,Shortest Path,所以我试图在我的neo4j图中得到间接路由,它由stop和route节点组成 这是我的关系数据库的ER图 我的模型由具有每个站点名称的站点节点(图片中的蓝色节点)组成 我有多条路由,它们与停止节点有关系(STOPS_AT)。这些关系指向公共汽车沿着特定路线行驶时所经过的各个站点 停止点关系具有以下属性 fare_bt_站-它有本站和上一站之间的车费。 顺序-公共汽车在车站停靠的顺序。原点为0 这就是我的关系的样子 为了得到A到C之间的最短距离,我运行这个查询来获得A到C之间的路线 MATC

所以我试图在我的neo4j图中得到间接路由,它由stop和route节点组成

这是我的关系数据库的ER图

我的模型由具有每个站点名称的站点节点(图片中的蓝色节点)组成

我有多条路由,它们与停止节点有关系(STOPS_AT)。这些关系指向公共汽车沿着特定路线行驶时所经过的各个站点

停止点关系具有以下属性

fare_bt_站-它有本站和上一站之间的车费。 顺序-公共汽车在车站停靠的顺序。原点为0

这就是我的关系的样子

为了得到A到C之间的最短距离,我运行这个查询来获得A到C之间的路线

MATCH (a:Stop {name:'A'}), (d:Stop {name:'C'})
MATCH p = allShortestPaths((a)-[:STOPS_AT*..12]-(d))
RETURN EXTRACT(x IN NODES(p) | CASE WHEN x:Stop THEN 'Stop ' + x.name
                                    WHEN x:Route THEN 'Route ' + x.name
                                    ELSE '' END) AS itinerary
它给出了输出<代码>[站点12,路线4,站点13,路线5,站点14]

但是,我如何查询这个模型以获得票价最低的路径呢。我见过其他例子,但在这些例子中,节点是直接连接的,而在我的例子中,节点是通过路由节点连接的

另外,如何根据stop_order属性验证路线,例如路线
A到B
先在A处停车,然后在B处停车,而路线
C到B
先在C处停车,然后在B处停车,因此应该没有任何方法从A到C,但此查询也不处理此特定情况。所以现在我在我的代码中处理这个问题,我认为这不是最好的方法


在过去的两天里,我一直在讨论这个问题,因此如果能得到任何帮助,我将不胜感激。

问题中没有足够的关于车型的信息来回答票价部分

关于订单问题,如果
路线
有方向,那么它与
站的关系也应该有方向

(c:Stop {name: 'C'})-[:STOPS_AT]->(c_to_b:Route)-[:STOPS_AT]->(b:Stop {name: 'B'})
除了关系类型现在没有意义之外,您可以使用两种不同的类型:

(c:Stop {name: 'C'})-[:IS_ORIGIN]->(c_to_b:Route)-[:IS_DESTINATION]->(b:Stop {name: 'B'})
现在,如果在同一方向上遵循这两种类型,则遵循实际路线(如果存在):


问题中没有足够的模型信息来回答票价部分

关于订单问题,如果
路线
有方向,那么它与
站的关系也应该有方向

(c:Stop {name: 'C'})-[:STOPS_AT]->(c_to_b:Route)-[:STOPS_AT]->(b:Stop {name: 'B'})
除了关系类型现在没有意义之外,您可以使用两种不同的类型:

(c:Stop {name: 'C'})-[:IS_ORIGIN]->(c_to_b:Route)-[:IS_DESTINATION]->(b:Stop {name: 'B'})
现在,如果在同一方向上遵循这两种类型,则遵循实际路线(如果存在):


在我看来,您太依赖关系数据库中的表格建模了。您正在使用NeN4J,因此您将不得不考虑将表格模型转换成良好模型并允许图形模型中的丰富查询的最佳方法。在这种转换中,不需要关系数据库中的大部分管道,而且在开始时很难识别和看到

一种方法是删除中间节点,而不是简单地使用每个站点之间的关系

例如,如果我们将一条路由分类为:具有相同编号的路由关系的路径,则可以相当轻松地创建路由。它可以建模如下:

(:Bus{ID:1, color:"green", number:"5"})-[:AssignedTo]->(:BusRoute{number:1}, departureTime:xxx})-[:Start]->(:Stop{name:"a"})-[:Route{number:1, fare:"10", duration:"20"]->(:Stop{name:"b"})-[:Route{number:1, fare:"20", duration:"30", finalStop:true}]->(:Stop{name:"d"})

(:Bus{ID:2, color:"red", number:"7"})-[:AssignedTo]->(:BusRoute{number:2}, departureTime:xxx})-[:Start]->(:Stop{name:"d"})-[:Route{number:2, fare:"10", duration:"20"]->(:Stop{name:"c"})-[:Route{number:2 fare:"20", duration:"30"}]->(:Stop{name:"b"}) ...
这使你的路线清晰明了。还要注意:分配给路线的:总线是清晰的,并且容易更改,因为总线与路线的关联在一个位置

例如,查找路线1的路线将使用以下查询:

MATCH (bus:Bus)-[:AssignedTo]->(busRoute:BusRoute)-[:Start]->(first:Stop)
WHERE busRoute.number = 1
WITH bus, busRoute, first
MATCH (first)-[r:Route*]->(:Stop)
WHERE ALL(route in r | route.number = br.number)
AND LAST(r).finalStop = true
RETURN bus, busRoute, NODES(r) as stops
对于查询从任何站点到任何其他站点的最短路径(票价作为权重),您可以使用Cypher自己执行此操作,也可以使用APOC过程调用为您执行此操作

首先,简单的方法。如果安装,则可以进行以下查询:

MATCH (here:Stop), (destination:Stop)
WHERE here.name = xxx AND destination.name = xxx
WITH here, destination
CALL apoc.algo.dijkstra(here, destination, 'Route>', 'fare') YIELD path, weight
RETURN RELS(path) as rides, weight as cost
如果你想自己做,你可以这样做(给你的变量路径深度增加一个合理的限制)


在我看来,您太依赖关系数据库中的表格建模了。您正在使用NeN4J,因此您将不得不考虑将表格模型转换成良好模型并允许图形模型中的丰富查询的最佳方法。在这种转换中,不需要关系数据库中的大部分管道,而且在开始时很难识别和看到

一种方法是删除中间节点,而不是简单地使用每个站点之间的关系

例如,如果我们将一条路由分类为:具有相同编号的路由关系的路径,则可以相当轻松地创建路由。它可以建模如下:

(:Bus{ID:1, color:"green", number:"5"})-[:AssignedTo]->(:BusRoute{number:1}, departureTime:xxx})-[:Start]->(:Stop{name:"a"})-[:Route{number:1, fare:"10", duration:"20"]->(:Stop{name:"b"})-[:Route{number:1, fare:"20", duration:"30", finalStop:true}]->(:Stop{name:"d"})

(:Bus{ID:2, color:"red", number:"7"})-[:AssignedTo]->(:BusRoute{number:2}, departureTime:xxx})-[:Start]->(:Stop{name:"d"})-[:Route{number:2, fare:"10", duration:"20"]->(:Stop{name:"c"})-[:Route{number:2 fare:"20", duration:"30"}]->(:Stop{name:"b"}) ...
这使你的路线清晰明了。还要注意:分配给路线的:总线是清晰的,并且容易更改,因为总线与路线的关联在一个位置

例如,查找路线1的路线将使用以下查询:

MATCH (bus:Bus)-[:AssignedTo]->(busRoute:BusRoute)-[:Start]->(first:Stop)
WHERE busRoute.number = 1
WITH bus, busRoute, first
MATCH (first)-[r:Route*]->(:Stop)
WHERE ALL(route in r | route.number = br.number)
AND LAST(r).finalStop = true
RETURN bus, busRoute, NODES(r) as stops
对于查询从任何站点到任何其他站点的最短路径(票价作为权重),您可以使用Cypher自己执行此操作,也可以使用APOC过程调用为您执行此操作

首先,简单的方法。如果安装,则可以进行以下查询:

MATCH (here:Stop), (destination:Stop)
WHERE here.name = xxx AND destination.name = xxx
WITH here, destination
CALL apoc.algo.dijkstra(here, destination, 'Route>', 'fare') YIELD path, weight
RETURN RELS(path) as rides, weight as cost
如果你想自己做,你可以这样做(给你的变量路径深度增加一个合理的限制)


您应该在问题中描述您的模型,而不是链接到GrapheneDB实例(它似乎不再存在)。这样它在将来仍然有用。你应该在问题中描述你的模型,而不是链接到一个GrapheneDB实例(它似乎已经不存在了)。这样以后它仍然有用。嘿,对不起,我没有真正理解你想说的话。你能详细说明你的答案吗。我应该用不同的模式吗?我仍然不知道如何在两条路线之间共享站点,我只能