Как преобразовать Gremlin GraphSON в виде дерева в пользовательский формат дерева JSON в CosmosDB? - PullRequest
1 голос
/ 23 июня 2019

У меня есть следующие запросы Gremlin, которые успешно выполнялись в CosmosDB:

g.addV('person').property(id, 'grand_father').property('name', 'Grand Father')
g.addV('person').property(id, 'father').property('name', 'Father')
g.addV('person').property(id, 'child').property('name', 'Child')
g.V('grand_father').addE('father_of').to(V('father'))
g.V('father').addE('father_of').to(V('child'))

Я выполнил запрос g.V('grand_father').repeat(out()).emit().tree(), который генерирует следующий вывод:

[
  {
    "grand_father": {
      "key": {
        "id": "grand_father",
        "label": "person",
        "type": "vertex",
        "properties": {
          "name": [
            {
              "id": "2b687c65-6490-4846-a5ef-1b7d67e51916",
              "value": "Grand Father"
            }
          ]
        }
      },
      "value": {
        "father": {
          "key": {
            "id": "father",
            "label": "person",
            "type": "vertex",
            "properties": {
              "name": [
                {
                  "id": "c1f75463-8aa5-4c15-854d-88be0ec9cdc9",
                  "value": "Father"
                }
              ]
            }
          },
          "value": {
            "child": {
              "key": {
                "id": "child",
                "label": "person",
                "type": "vertex",
                "properties": {
                  "name": [
                    {
                      "id": "d74d6286-5fa9-4b90-9619-1f173d5da53e",
                      "value": "Child"
                    }
                  ]
                }
              },
              "value": {}
            }
          }
        }
      }
    }
  }
]

Я хочу преобразоватьприведенное выше дерево GraphSON снова, чтобы сгенерировать пользовательское иерархическое дерево следующего формата.

{
   "person":{
      "name":"Grand Father"
   },
   "children":[
      {
         "person":{
            "name":"Father"
         },
         "children":[
            {
               "person":{
                  "name":"Child"
               }
            }
         ]
      }
   ]
}

Какие изменения мне нужно внести в g.V('grand_father').repeat(out()).emit().tree() для достижения результата?

1 Ответ

1 голос
/ 27 июня 2019

Я думаю, что следующее довольно близко к тому, что вы спрашиваете:

gremlin> g.V('grand_father').
......1>   repeat(out()).
......2>     emit().
......3>   tree().
......4>     by(group().
......5>          by(label).
......6>          by(valueMap('name').by(unfold())).
......7>        unfold().unfold())
==>[person={name=Grand Father}:[person={name=Father}:[person={name=Child}:[]]]]

Обратите внимание, что tree() использует модулятор by(), который применяет анонимный обход, данный ему в качестве аргумента, к каждому элементу дерева. Я не запечатлел лист «детей» в вашем выводе JSON, но, возможно, это достаточно приблизит вас к цели, не привлекая больше сложности. Обратите внимание, что CosmosDB может еще не поддерживать трюк valueMap('name').by(unfold()), и в этом случае вы можете удалить by(unfold()) и остаться с List, заключающим значение, заменить его на project('name').by('name') или заменить его «старым» способом разворачивается valueMap(), показанный ниже:

gremlin> g.V('grand_father').
......1>   repeat(out()).
......2>     emit().
......3>   tree().
......4>     by(group().
......5>          by(label).
......6>          by(valueMap('name').
......7>             unfold().
......8>             group().
......9>               by(select(keys)).
.....10>               by(select(values).unfold())).
.....11>        unfold().unfold())
==>[person={name=Grand Father}:[person={name=Father}:[person={name=Child}:[]]]]
...