在我看来,你太依赖关系数据库中的表格建模了。您正在使用Neo4j,因此您将不得不考虑将表格模型转换为模型并在图形模型中实现丰富查询的最佳方法。在这种转换中,关系数据库中的许多管道工作将不再需要,而且一开始就很难识别和查看。你可能要改造这个
一种方法是删除您的中间节点,而不是简单地使用每个站之间的关系
因此,举例来说,如果我们将其归类的路线作为一个路径:与路由关系相同的号码,你可以很容易地创建你的路线。它可能是这样的模型:
(: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过程调用为您执行此操作。
首先,简单的方法。如果你安装了APOC Procedures library,可以让这个查询:
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
如果你想自己做,你可以做这样的(添加一个理智的限制你的变量路径深度)
MATCH (here:Stop), (destination:Stop)
WHERE here.name = xxx AND destination.name = xxx
WITH here, destination
MATCH (here)-[rides:Route*..12]->(destination)
WITH rides, REDUCE(cost = 0, ride in rides | cost + ride.fare) AS cost
ORDER BY cost ASC LIMIT 1
RETURN rides, cost
您应该在问题中描述您的模型,而不是链接到GrapheneDB实例(似乎不再存在)。这样它在未来仍然有用。 –