首页 > 解决方案 > 优化此查询以使用 gremlin 在图中获取谱系图

问题描述

我在 cosmos DB gremlin API 中设置了我的数据。我正在尝试编写一个可以从给定顶点开始的查询,为所有边提供两个方向的标签和属性,以及顶点及其属性,循环计数为 2。我正在运行以下查询。

要设置的数据

g.addV('item').property('id','1').property('name', 'item1')
g.addV('item').property('id','2').property('name', 'item2')
g.addV('item').property('id','3').property('name', 'item3')
g.addV('item').property('id','4').property('name', 'item4')
g.addV('item').property('id','5').property('name', 'item5')
g.addV('item').property('id','6').property('name', 'item6')
g.addV('item').property('id','7').property('name', 'item7')

g.addV('report').property('id','8').property('name', 'report1')
g.addV('report').property('id','9').property('name', 'report2')
g.addV('folder').property('id','10').property('name', 'folder1')
g.addV('server').property('id','11').property('name', 'server1')

g.V('1').addE('hasParent').to(g.V('2'))
g.V('1').addE('hasParent').to(g.V('3'))
g.V('2').addE('hasParent').to(g.V('4'))
g.V('5').addE('hasParent').to(g.V('6'))
g.V('4').addE('hasParent').to(g.V('5'))
g.V('7').addE('hasParent').to(g.V('5'))

g.V('8').addE('hasParent').to(g.V('9'))
g.V('8').addE('hasParent').to(g.V('9'))
g.V('8').addE('belongsTo').to(g.V('10'))
g.V('10').addE('belongsTo').to(g.V('11'))

询问:g.V('id','1').repeat(bothE().dedup().otherV()).times(2).path()

回复:

[
  {
    "labels": [
      [],
      [],
      [],
      [],
      []
    ],
    "objects": [
      {
        "id": "1",
        "label": "item",
        "type": "vertex",
        "properties": {
          "name": [
            {
              "id": "1|name",
              "value": "item1"
            }
          ]
        }
      },
      {
        "id": "a6b02073-68f8-4d53-8af0-54739eaaeaa0",
        "label": "hasParent",
        "type": "edge",
        "inVLabel": "item",
        "outVLabel": "item",
        "inV": "2",
        "outV": "1"
      },
      {
        "id": "2",
        "label": "item",
        "type": "vertex",
        "properties": {
          "name": [
            {
              "id": "2|name",
              "value": "item2"
            }
          ]
        }
      },
      {
        "id": "c8722748-3899-4a2c-afe4-6f13b6c1f8d5",
        "label": "hasParent",
        "type": "edge",
        "inVLabel": "item",
        "outVLabel": "item",
        "inV": "4",
        "outV": "2"
      },
      {
        "id": "4",
        "label": "item",
        "type": "vertex",
        "properties": {
          "name": [
            {
              "id": "4|name",
              "value": "item4"
            }
          ]
        }
      }
    ]
  },
  {
    "labels": [
      [],
      [],
      [],
      [],
      []
    ],
    "objects": [
      {
        "id": "1",
        "label": "item",
        "type": "vertex",
        "properties": {
          "name": [
            {
              "id": "1|name",
              "value": "item1"
            }
          ]
        }
      },
      {
        "id": "a6b02073-68f8-4d53-8af0-54739eaaeaa0",
        "label": "hasParent",
        "type": "edge",
        "inVLabel": "item",
        "outVLabel": "item",
        "inV": "2",
        "outV": "1"
      },
      {
        "id": "2",
        "label": "item",
        "type": "vertex",
        "properties": {
          "name": [
            {
              "id": "2|name",
              "value": "item2"
            }
          ]
        }
      },
      {
        "id": "a6b02073-68f8-4d53-8af0-54739eaaeaa0",
        "label": "hasParent",
        "type": "edge",
        "inVLabel": "item",
        "outVLabel": "item",
        "inV": "2",
        "outV": "1"
      },
      {
        "id": "1",
        "label": "item",
        "type": "vertex",
        "properties": {
          "name": [
            {
              "id": "1|name",
              "value": "item1"
            }
          ]
        }
      }
    ]
  },
  {
    "labels": [
      [],
      [],
      [],
      [],
      []
    ],
    "objects": [
      {
        "id": "1",
        "label": "item",
        "type": "vertex",
        "properties": {
          "name": [
            {
              "id": "1|name",
              "value": "item1"
            }
          ]
        }
      },
      {
        "id": "2f0c5890-3fa5-4d7d-8ada-910e5419750f",
        "label": "hasParent",
        "type": "edge",
        "inVLabel": "item",
        "outVLabel": "item",
        "inV": "3",
        "outV": "1"
      },
      {
        "id": "3",
        "label": "item",
        "type": "vertex",
        "properties": {
          "name": [
            {
              "id": "3|name",
              "value": "item3"
            }
          ]
        }
      },
      {
        "id": "2f0c5890-3fa5-4d7d-8ada-910e5419750f",
        "label": "hasParent",
        "type": "edge",
        "inVLabel": "item",
        "outVLabel": "item",
        "inV": "3",
        "outV": "1"
      },
      {
        "id": "1",
        "label": "item",
        "type": "vertex",
        "properties": {
          "name": [
            {
              "id": "1|name",
              "value": "item1"
            }
          ]
        }
      }
    ]
  }
]

这给了我想要的输出,但是有很多重复,我猜是因为它会在遍历时打印路径。如何修改此查询以返回尽可能小的 json 输出?只需返回一次顶点和边。如果这有什么不同,我正在使用 cosmosDB gremlin API。

需要的响应:只是绘制此图所需的顶点和边的列表。

标签: azure-cosmosdbgremlintinkerpop3azure-cosmosdb-gremlinapi

解决方案


您的示例原样不会产生与我在您的问题中看到的相同的输出 - 我只得到一条路径:

gremlin> g.V('id','1').repeat(bothE().dedup().otherV()).times(2).path()
==>[v[1],e[11][1-hasParent->2],v[2],e[13][2-hasParent->4],v[4]]

我不确定这是否是您的数据脚本中的一些错误,但我想我从输出中得到了您所要求的要点。emit()我可以通过在repeat()输出中包含所有路径来重新创建重复的情况:

gremlin> g.V('id','1').repeat(bothE().dedup().otherV()).emit().times(2).path()
==>[v[1],e[11][1-hasParent->2],v[2]]
==>[v[1],e[12][1-hasParent->3],v[3]]
==>[v[1],e[11][1-hasParent->2],v[2],e[13][2-hasParent->4],v[4]]

现在我在结果输出中有一些重复的顶点/边。如果您只想要所有这些对象的唯一列表,只需unfold()每个Pathand dedup()

gremlin> g.V('id','1').repeat(bothE().dedup().otherV()).emit().times(2).path().unfold().dedup()
==>v[1]
==>e[11][1-hasParent->2]
==>v[2]
==>e[12][1-hasParent->3]
==>v[3]
==>e[13][2-hasParent->4]
==>v[4]

从某种意义上说,这是一种有趣的模式,因为它提供了一种简单的方法来为 Gremlin 语言变体和不支持subgraph()step 的图系统生成子图。


推荐阅读