1

我有两个顶点:

1)顶点1:{ id: 1, name: “john” }

2)顶点2:{ id: 2, name: “mary” }

从 1 到 2 有一条边,名为“children”。

是否可以像这样使用 gremlin 返回嵌套在 1 中的 2?

  { 
    id: 1, 
    name: “john”,
    children: { id: 2, name: “mary” }
  }

谢谢!

在@noam621 的帮助下我的解决方案 ---------------------------------


g.V(1)
.union( valueMap(true),
        project('children').by( coalesce( out('children').valueMap(true).fold() , constant([]))),
        project('parents').by( coalesce( out('parents').valueMap(true).fold() , constant([])))
)
.unfold().group().by(keys).by(select(values))

它返回以下对象:

{ 
    id: 1, 
    name: [ “john” ],
    children: [ { id: 2, name: [ “mary” ] } ],
    parents: []
}

.union 与 project 是将所有对象合并到一个对象中的关键。valueMap(true).fold() 是获取边缘中所有对象的基础,如果边缘不返回任何顶点,则合并有助于使用默认值。

由于某些 Azure Cosmos gremlin 限制,只能将值作为数组值获取。因此,我在我的应用程序代码中最终确定了对象格式。现在没关系。

谢谢!

4

1 回答 1

2

您可以通过project对两个顶点使用步骤来做到这一点:

g.V(1).project('id', 'name', 'children').
    by(id).
    by('name').
    by(out('children').
      project('id', 'name').by(id).
        by('name'))

示例: https ://gremlify.com/3j


查询valueMap

g.V(1).union(
    valueMap().
      with(WithOptions.tokens).by(unfold()),
    project('children').
      by(out('children').
        valueMap().
          with(WithOptions.tokens).by(unfold()))
  ).unfold().
  group().by(keys).
    by(select(values))

如果valueMap().with(WithOptions.tokens)Cosmos 不支持,请valueMap(true)改用

于 2020-04-05T07:50:10.077 回答