Извлечение свойств и мета-свойств в JSON-подобную структуру с Gremlin - PullRequest
1 голос
/ 12 октября 2019

Моя вершина клиента имеет 4 свойства и 2 мета-свойства (каждое из которых содержит список). Задача состоит в том, чтобы вернуть данные клиента в структуре 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()))

, который, к сожалению, группирует адрес и содержимое учетной записи, поэтому я могу видеть только последний адрес / учетную запись:

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

Есть лиспособ перечислить все элементы мета-свойств?

1 Ответ

3 голосов
/ 13 октября 2019

Для приведенного выше примера,

Если вы добавите fold().unfold(), он будет учитывать все свойства:

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