Gremlin查询-对边条件重复

时间:2018-10-28 08:11:52

标签: cypher graphql graph-theory gremlin gremlinjs

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

1 个答案:

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

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