在 Gremlin 中合并地图

Merging maps in Gremlin

我正在尝试编写一个查询来满足响应对象中的两个要求:

  1. 必须包含顶点的 所有 属性,而无需在查询中指定各个字段。

  2. 必须在对象的同一级别展平结果。

作为单独的查询,我可以这样做:

1。 valueMap查询

g.V(1)
.valueMap().by(unfold()).fold()

回复:

{
  "property1": "value1",
  "property2": "value2"
}

2。 project查询

g.V(1)
.project("projectedProperty")
.by(out("X").valueMap().by(unfold()).fold())

回复:

{
  "projectedProperty": "value",
}

组合查询

我尝试使用并集来组合这些结果:

g.V(1)
.union(
  valueMap().by(unfold()).fold(), // Query 1
  project("projectedField").by(out("X").valueMap().by(unfold()).fold()) // Query 2
).fold()

回复:

{
  [
    {
      "property1": "value1",
      "property2": "value2"
    },
    {
      "projectedProperty": "value"
    }
  ]
}

这种联合方法依赖于我在末尾放置一个折叠,这反过来又不能正确地 merge/flatten 两个地图。预期的响应是:

{
  "property1": "value1",
  "property2": "value2",
  "projectedProperty": "value"
}

是否有更好的方法来完成响应对象中 merging/flattening 两个映射的任务?

典型的 patternunfold() 您的映射到条目 (keys/values),然后 group() 它们重新组合为一个:

gremlin> g.V().has('person','name','marko').
......1>   union(project('count').by(outE().count()), elementMap()).
......2>   unfold().
......3>   group().by(keys).by(select(values))
==>[count:3,name:marko,label:person,id:1,age:29]