Как получить все узлы в виде иерархического дерева с запросом Гремлин? - PullRequest
1 голос
/ 20 сентября 2019

Ниже представлены сложные отношения членов семьи, представленные узлами и ребрами.

  1. Член, представленный как person узел
  2. Узел marriage представляет брак между двумяperson узлы
  3. son_of и daughter_of соединяют человека с marriage узлом.
  4. root_person - это первое поколение
  5. john и Brenda - второе поколение
  6. mark - третье поколение
  7. mary - четвертое поколение
  8. john имеет бывшую жену и жену
  9. mark и его бывшая жена mark_ex_wife двоюродные братья.Это потому, что отец mark и мать mark_ex_wife являются братьями и сестрами.

Мое требование - получить все узлы в формате иерархического дерева.Начиная с root_person, его сын john и его жена и дочь brenda 'и ее муж должны быть возвращены.Затем следующее поколение и так далее ...

Пожалуйста, ответьте, достижимо ли мое требование с этой моделью, или измените эту модель, чтобы получить все узлы.JSON с key и value, возвращаемыми обозревателем данных CosmosDB, является началом.Затем я могу проанализировать JSON, возвращенный запросом, чтобы создать иерархическое дерево родителей и детей в произвольном формате, который более прост для понимания и распечатки.

g.V().drop()
g.E().drop()
g.addV('person').property(id, 'root_person').property('name', 'Root Person').property('title', 'male')
g.addV('person').property(id, 'root_person_wife').property('name', 'root_person_wife').property('title', 'female')
g.addV('person').property(id, 'john').property('name', 'john').property('title', 'male')
g.addV('person').property(id, 'john_wife').property('name', 'john_wife').property('title', 'female')
g.addV('person').property(id, 'john_ex_wife').property('name', 'john_ex_wife').property('title', 'female')
g.addV('person').property(id, 'brenda').property('name', 'brenda').property('title', 'female')
g.addV('person').property(id, 'brenda_husband').property('name', 'brenda_husband').property('title', 'male')
g.addV('person').property(id, 'mark').property('name', 'mark').property('title', 'male')
g.addV('person').property(id, 'mark_ex_wife').property('name', 'mark_ex_wife').property('title', 'female')
g.addV('person').property(id, 'mark_wife').property('name', 'mark_wife').property('title', 'female')
g.addV('person').property(id, 'mary').property('name', 'mary').property('title', 'female')
g.addV('person').property(id, 'mary_husband').property('name', 'mary Husband').property('title', 'male')
g.addV('marriage').property(id, 'root_person-root_person_wife').property('marriage_name', 'root_person-root_person_wife')
g.addV('marriage').property(id, 'john-john_wife').property('marriage_name', 'john-john_wife')
g.addV('marriage').property(id, 'john-john_ex_wife').property('marriage_name', 'john-john_ex_wife')
g.addV('marriage').property(id, 'brenda-brenda_husband').property('marriage_name', 'brenda-brenda_husband')
g.addV('marriage').property(id, 'mark-mark_ex_wife').property('marriage_name', 'mark-mark_ex_wife')
g.addV('marriage').property(id, 'mark-mark_wife').property('marriage_name', 'mark-mark_wife')
g.addV('marriage').property(id, 'mary-mary_husband').property('marriage_name', 'mary-mary_husband')

g.V('root_person').addE('married_in').to(g.V('root_person-root_person_wife'))
g.V('root_person_wife').addE('married_in').to(g.V('root_person-root_person_wife'))
g.V('john').addE('married_in').to(g.V('john-john_wife'))
g.V('john_wife').addE('married_in').to(g.V('john-john_wife'))
g.V('john').addE('married_in').to(g.V('john-john_ex_wife'))
g.V('john_ex_wife').addE('married_in').to(g.V('john-john_ex_wife'))
g.V('brenda').addE('married_in').to(g.V('brenda-brenda_husband'))
g.V('brenda_husband').addE('married_in').to(g.V('brenda-brenda_husband'))
g.V('mark').addE('married_in').to(g.V('mark_#mark_wife'))
g.V('mark_wife').addE('married_in').to(g.V('mark-mark_wife'))
g.V('mark').addE('married_in').to(g.V('mark-mark_ex_wife'))
g.V('mark_ex_wife').addE('married_in').to(g.V('mark-mark_ex_wife'))
g.V('mary').addE('married_in').to(g.V('mary-mary_husband'))
g.V('mary_husband').addE('married_in').to(g.V('mary-mary_husband'))

g.V('john').addE('son_of').to(g.V('root_person-root_person_wife')).property('son_of', 'john--root_person-root_person_wife')
g.V('brenda').addE('daughter_of').to(g.V('root_person-root_person_wife')).property('daugter_of', 'brenda--root_person-root_person_wife')
g.V('mark').addE('son_of').to(g.V('john-john_wife')).property('son_of', 'mark--john-john_wife')
g.V('mark_ex_wife').addE('daughter_of').to(g.V('brenda-brenda_husband')).property('daugter_of', 'mark_ex_wife--brenda-brenda_husband')
g.V('mary').addE('daughter_of').to(g.V('mark-mark_wife')).property('daugter_of', 'mary--mark-mark_wife') }

ОБНОВЛЕНИЕ:

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

g.V('root_person').repeat(out('married_in')).emit().repeat(__.in('son_of', 'daughter_of')).emit().tree()

Запрос выдал следующий json.Вы заметите, что он остановился на втором поколении.

[
  {
    "root_person": {
      "key": {
        "id": "root_person",
        "label": "person",
        "type": "vertex",
        "properties": {
          "name": [
            {
              "id": "f1e8327e-add4-454b-bbb2-6f076a29ea49",
              "value": "Root Person"
            }
          ],
          "title": [
            {
              "id": "42fc9c2b-b613-4011-9a0a-183d907a96ac",
              "value": "male"
            }
          ]
        }
      },
      "value": {
        "root_person-root_person_wife": {
          "key": {
            "id": "root_person-root_person_wife",
            "label": "marriage",
            "type": "vertex",
            "properties": {
              "marriage_name": [
                {
                  "id": "30f428a9-e657-4284-b59a-b836d9f04887",
                  "value": "root_person-root_person_wife"
                }
              ]
            }
          },
          "value": {
            "john": {
              "key": {
                "id": "john",
                "label": "person",
                "type": "vertex",
                "properties": {
                  "name": [
                    {
                      "id": "64e4653d-6298-479d-ba0f-eb3a9ede2383",
                      "value": "john"
                    }
                  ],
                  "title": [
                    {
                      "id": "b99dacb3-e38d-4da8-b087-42860d2b28c0",
                      "value": "male"
                    }
                  ]
                }
              },
              "value": {}
            },
            "brenda": {
              "key": {
                "id": "brenda",
                "label": "person",
                "type": "vertex",
                "properties": {
                  "name": [
                    {
                      "id": "1d88e8a5-7340-4b6d-a2b9-8b3c325e7bf6",
                      "value": "brenda"
                    }
                  ],
                  "title": [
                    {
                      "id": "9b856caa-0b84-413c-8229-8e2c1e0cb0d3",
                      "value": "female"
                    }
                  ]
                }
              },
              "value": {}
            }
          }
        }
      }
    }
  }
]

1 Ответ

2 голосов
/ 21 сентября 2019

Дерево будет представлять вершины в той же иерархии, в которой они хранятся в графе.Таким образом, супруги не будут появляться на одном уровне в дереве.Я могу ошибаться, но я думаю, что вам нужен список людей в каждом поколении ..?

gremlin> g.V("root_person").
           union(identity(),
                 out("married_in").in("married_in")).dedup().
           aggregate("x").
           group("m").
             by(constant(-1)).
             by(id).
           repeat(out("married_in").
                  union(__.in("married_in"),
                        __.in("daughter_of","son_of").
                           union(identity(), 
                                 out("married_in").in("married_in"))).dedup().
                  where(without("x")).
                  aggregate("x").
                  group("m").
                    by(loops()).
                    by(id)).
           cap("m").unfold().
           order(local).
             by(keys).
           select(values)
==>[root_person,root_person_wife]
==>[brenda,brenda_husband,john,john_wife,john_ex_wife]
==>[mark_ex_wife,mark,mark_wife]
==>[mary,mary_husband]
...