使用 Gremlin 将属性和元属性提取到 JSON 类结构中

Extracting properties and meta-properties into JSON-like structure with Gremlin

我的客户顶点有 4 个属性和 2 个元属性(每个包含一个列表)。任务是return JSON 结构中的客户数据。我能够提出这个查询:

g.V('customerId')
    .project('customer', 'addresses', 'accounts')
    .by(properties().not(hasLabel('addresses', 'accounts')).group().by(key()).by(value()))
    .by(properties('addresses').valueMap().fold())
    .by(properties('accounts').valueMap().fold())

产生结果

{
  "customer": {
    "firstName": "Carl",
    "middleName": "Friedrich",
    "lastName": "Gauss",
    "age": 77
  },
  "addresses": [
    {
      "streetName": "View",
      "streetNumber": "43",
    },
    {
      "streetName": "Market",
      "streetNumber": "11",
    }
  ],
  "accounts": [
    {
      "accountNumber": "1234"
    },
    {
      "accountNumber": "4321"
    }
  ]
}

我真正需要的是这样的结构:

{
  "firstName": "Carl",
  "middleName": "Friedrich",
  "lastName": "Gauss",
  "age": 77,
  "addresses": [
    {
      "streetName": "View",
      "streetNumber": "43",
    },
    {
      "streetName": "Market",
      "streetNumber": "11",
    }
  ],
  "accounts": [
    {
      "accountNumber": "1234"
    },
    {
      "accountNumber": "4321"
    }
  ]
}

我能得到的最接近的是这个查询:

g.V('customerId')
    .properties()
    .group()
    .by(key)
    .by(choose(hasLabel('addresses','accounts'), valueMap().fold(), value()))

不幸的是,它对地址和帐户内容进行了分组,所以我实际上只能看到最后一个 address/account:

{
  "firstName": "Carl",
  "middleName": "Friedrich",
  "lastName": "Gauss",
  "age": 77,
  "addresses": [
    {
      "streetName": "Market",
      "streetNumber": "11",
    }
  ],
  "accounts": [
    {
      "accountNumber": "4321"
    }
  ]
}

有没有办法列出所有元属性元素?

对于上面的例子,

如果您添加 fold().unfold() 它将考虑所有属性:

g.V('c81e3753-1eaa-453b-85bc-818174de70c1')
    .properties()
    .group()
    .by(key)
    .by(fold().unfold().choose(hasLabel('addresses','accounts'), value().fold(), value()))