【发布时间】:2016-10-06 10:19:53
【问题描述】:
我正在尝试查找包含其他子模式的模式。
我有一个包含 Stop 和 Stoptime 节点以及 4 种不同类型关系的图表:WALK_TO、GET_ON_THE_BUS、CONTINUE 和 GET_OFF_THE_BUS。 WALK_TO 具有 distance 和 speed 属性。其他关系具有time 属性,我使用这些属性来计算最短路径,而不是路径的长度。
xStop 是一个物理实体:公共汽车站或火车站。 xStoptime 有车辆到相关站点的路线信息、到达和离开时间。
我正在尝试查找从出发点到目的地点的路径。我将路径分成几个模式;
start=(dep:xStop {name:'Departure'})-[:WALK_TO]->(:xStop)-[:GET_ON_THE_BUS]->(s:xStoptime)
end = (dest:xStop {name:'Destination'})<-[:WALK_TO]-(:xStop)<-[:GET_OFF_THE_BUS]-(e:xStoptime)
这使我能够过滤行程的起点和终点之间的关系。
现在,行程中间可以是直接行程或间接行程。如果是直飞的话:
direct=(:xStoptime)-[:CONTINUE*]->(:xStoptime)
问题在于间接行程:您必须转移到另一辆车。我有 2 种不同的传输模式:
t1=(:xStoptime)-[:GET_OFF_THE_BUS]->(a:xStop)-[:WALK_TO]->(b:xStop)-[:Dp]->(:xStoptime)
t2=(c:xStoptime)-[:GET_OFF_THE_BUS]->(:xStop)-[:GET_ON_THE_BUS]->(d:xStoptime) where not c.name=d.name
我想找到路径m
m=(s)-[*]->(e)
其中 m 遵循模式:direct, zero or more transfers with t1 or t2 , direct。
我不使用 Cypher 的最短路径的原因是所有关系都有属性,我想根据这些属性计算多个成本。
有人可以帮忙吗?我该如何为此编写 Cypher 查询?
【问题讨论】:
-
你能更完整地描述你的数据模型吗?例如,
D、A、R和Dp关系的目的是什么?否则这个问题很难理解。您可能还应该更改这些关系类型的名称(至少在提出这个问题时),以便更容易理解这些模式。 -
当然。我正在编辑我的帖子以包括对关系的解释。
-
如果您要允许任一传输模式多次重复(基本上是零、一或多于一个),那么 Cypher 不会太多帮助;它可以做单一关系类型的可变长度路径,但不能做可变长度迭代模式(目前)。
-
@cybersam 我更新了关系的名称并稍微解释了图模型。
-
@ToreEschliman 您有什么建议,比如调整图形模型或其他什么?我可以用不同的视角来解决问题。