【问题标题】:How do I obtain elementMaps of an edge and its two vertices in a single query?如何在单个查询中获取边及其两个顶点的 elementMaps?
【发布时间】:2022-11-25 07:09:07
【问题描述】:

环境:

  • 节点 16
  • 用于 node.js/Javascript 的 Gremlin
  • 亚马逊海王星数据库

目标是列出具有一个标签的所有顶点与另一个标签的所有顶点之间的所有边,提供顶点的 elementMaps()。

以下是我迄今为止实现的最接近的近似值:

g.V().has('Customer', 'name', 'Customer').as('out').outE('HAS').as('edge').inV().hasLabel('Workstream').as('in').select('out', 'edge', 'in').toList()

这会产生以下输出(显示单个项目):

[{
    out: Vertex {
      id: 'bac24101-555a-e70b-66b1-434c5b2bb4fe',
      label: 'Customer',
      properties: undefined
    },
    edge: Edge {
      id: '74c24101-55a9-3421-029b-1ddd68178cfd',
      label: 'HAS',
      outV: [Vertex],
      inV: [Vertex],
      properties: {}
    },
    in: Vertex {
      id: 'b8c24101-5548-f39e-70c9-a9bd126e05b2',
      label: 'Workstream',
      properties: undefined
    }
 }]

这不会给我边或顶点的 elementMap,但它是我可以使用的格式。所需的输出是:

[{
    edge: {
      elementMapOfEdge,
      outV: { elementMapOfOutVertex },
      inV: { elementMapOfInVertex },
     }
 }]

注意

g.V().has('Customer', 'name', 'Customer').dedup().by('name').outE('HAS').as('edge').inV().hasLabel('Workstream').select('edge').elementMap().toList()

给我边的 elementMap 但不是传入或传出顶点。 dedup() 步骤解决了顶点中的重复名称,这是目前的数据卫生问题。

奇怪的是,边的 elementMapping 将顶点标签从“outV”和“inV”更改为“OUT”和“IN”——我假设是因为这些值不再是 Vertex 对象,而是普通的 JS 对象。

关于步骤标签等,我更关心功能而不是样式。目标是实现预期的结果,而不是在这一点上与 Gremlin 完美地惯用——尽管两者都实现会很棒!

【问题讨论】:

    标签: javascript node.js gremlin amazon-neptune


    【解决方案1】:

    这可能不是您正在寻找的格式,但很接近。可能需要对地图列表进行一些额外的处理,以将它们合并到一张地图中,但根据您在应用程序中使用此数据的方式,可能并非完全有必要:

    g.V().has('Customer', 'name', 'Customer').dedup().by('name').
        outE('HAS').as('edge').inV().hasLabel('Workstream').select('edge').
        project('edge').
        by(
            union(
                elementMap(),
                project('outV','inV').
                    by(outV().elementMap()).
                    by(inV().elementMap())
            ).fold()).toList()
    

    【讨论】:

    • 我不能赞成你的回答,但这确实产生了可用的结果,它让我走上了正确的改进之路 - 谢谢。
    • 仅供参考 对于 JS Gremlin,查询必须重写如下(“wsx.__”绑定到“gremlin.process.statics”):g.V().hasLabel('Customer').dedup().by('name' ).outE('HAS').as('edge').inV().hasLabel('Workstream').select('edge').project('edge').by(wsx.__.union(wsx .__.elementMap(),wsx.__.project('outV','inV').by(wsx.__.outV().elementMap()).by(wsx.__.inV().elementMap() )).折叠().toList()
    【解决方案2】:

    按照 Taylor Riggan 提供的示例,我想出了一个类似的答案,执行他提到的按摩并生成我想要的结构:

    g.V().hasLabel('User').as('in').outE().as('edge').inV().as('out').select('in', 'edge', 'out').by(wsx.__.elementMap()).by(wsx.__.elementMap()).by(wsx.__.elementMap()).toList()
    

    注意wsx.__映射到 JS Gremlin 库中的 gremlin.process.statics。

    这会生成如下所示的输出结构:

    [
      {
        in: {
          id: 'user@test.net',
          label: 'User',
          name: 'Test User'
        },
        edge: {
          id: '1cc25300-3a47-8aef-6b40-017ab8592910',
          label: 'ADMINISTRATOR',
          IN: [Object],
          OUT: [Object],
          description: 'Workstream Administrator'
        },
        out: {
          id: '9ec25300-23cb-b316-f893-9f7a37ca4330',
          label: 'Workstream',
          name: 'Test 4',
          description: 'test 4 WS'
        }
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多