0

我有一个火车网络的 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 Graph 中执行此操作。

4

1 回答 1

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")

这种遍历应该找到所有的起点,然后从那里遍历到最终目的地站点并发出这些路径。

于 2018-10-29T18:26:38.877 回答