我有一个火车网络的gremlin图结构。 顶点是工作站,工作站ID和名称为属性。 边缘是具有路线,公里数和停车顺序的轨道。
大约有840个站点和24条路线连接它们。 可以想象,这些站点是通过路线连接的,任意两个站点都可以通过一条以上的路线连接。也有循环路线,即在同一站开始和停止。有些站点既是不同路线的起点,也是目的地。
我想问的问题是,如果给定的停靠点超出了提成,我如何获得受影响的来源和目的地。即获取经过的路线,并获取给定路线的来源和目的地。
似乎是一个简单的问题,但是我不知道gremlin足以回答这个问题。 :)
到目前为止,下面的是我最接近的答案。给定车站,路线和最终终点站,我可以使它们之间的所有车站都得到。
理想的情况是,在给定站点的情况下,给出所有受影响的路线,到达最终目的地的路线以及从源头出发的路线。
我无法根据边的属性连接顶点。就像基于路线连接顶点而没有给出值。同样,在叶节点处终止重复。即没有其他可连接的目的地。如果我可以删除直到hasID,那将是一个胜利。 :)
g.V().has("id", "17892")
.repeat(outE().has("route","3-96-mjp-1").inV())
.until(hasId("6147"))
.path()
下面的示例结构:
g.V().has("id", "17892").outE().path() -->> "objects": [
{
"id": "17892",
"label": "stop",
"type": "vertex",
"properties": {
"stop_id": [
{
"id": "f2eb562e-e362-427c-91ef-02769cfda721",
"value": "17892"
}
],
"stop_name": [
{
"id": "b873d980-8d07-44e7-aa45-5be1afad4a63",
"value": "10-Albert St/Nicholson St (East Melbourne)"
}
]
}
},
{
"id": "242fa97f-134d-439a-b8ab-0b4d8b8da9bc",
"label": "nextStop",
"type": "edge",
"inVLabel": "stop",
"outVLabel": "stop",
"inV": "17893",
"outV": "17892",
"properties": {
"distance": 125,
"route": "3-35-mjp-1",
"stopSeq": 17
}
}
]
我正在Azure CosmosDB图形中执行此操作。
答案 0 :(得分:0)
没有示例图,我实际上只是想做出一个很好的猜测:
g.V().has("id", "17892").
bothE("nextStop").as("e").outV().
until(__.not(inE("nextStop").
where(eq("e")).by("route").
where(lt("e")).by("stopSeq"))).
repeat(inE("nextStop").
where(eq("e")).by("route").
where(lt("e")).by("stopSeq").as("e").outV()).as("origin").
outE("nextStop").as("e").inV().
until(__.not(outE("nextStop").
where(eq("e")).by("route").
where(gt("e")).by("stopSeq"))).
repeat(outE("nextStop").
where(eq("e")).by("route").
where(gt("e")).by("stopSeq").as("e").inV()).
path().
from("origin").
by("stop_id").
by("distance")
该遍历应该找到所有原点,然后从那里遍历到最终目的地站点并发出这些路径。