Cosmos DB: Graph - запрашивать все вложенные вершины и ребра

Я использую Cosmos DB - Graph для хранения данных и разработки API для запроса графа db и возврата результатов запроса в формате ниже. API может принимать любой тип узла и идентификатор в качестве параметра и проходить через входящие и исходящие ребра, чтобы вернуть вложенные вершины и ребра.

{
    "nodes":[
        {"id":"1","name":"A"},
        {"id":"2","name":"B"},
        {"id":"3","name":"C1"},
        {"id":"4","name":"C2"},
        {"id":"5","name":"C3"},
        {"id":"6","name":"D1"},
        {"id":"7","name":"D2"},
        {"id":"8","name":"D3"}
    ],
    "edges":[
        {"source":"1","target":"2"},
        {"source":"2","target":"3"},
        {"source":"2","target":"4"},
        {"source":"2","target":"5"},
        {"source":"3","target":"6"},
        {"source":"4","target":"7"},
        {"source":"5","target":"8"}
    ]
}

Пример графика:

Образец графика

Я новичок в запросе графа гремлина и столкнулся с проблемой прохождения через граф. У меня есть несколько образцов для входа и выхода ребер и поиска вершинного запроса. Я планирую выполнить 4 запроса для создания указанного выше формата:

Для кромок

g.V().has('name', 'A').repeat(__.bothE().where(without('e')).store('e').otherV()).cap('e')
g.V().has('name', 'A').repeat(__.inE().where(without('e')).store('e').outV()).cap('e')

Для узлов

g.V().has('name', 'A').repeat(out()).until(outE().count().is(0)).simplePath()

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


person Brijen Shah    schedule 05.12.2019    source источник


Ответы (2)


Этот единственный запрос дает вам нужный результат:

g.V().has("name","C1").emit().repeat(bothE("e").simplePath()
  .sideEffect(project("source","target")
    .by(outV().id())
    .by(inV().id()).store("edges"))
  .otherV())
  .valueMap(true, "name").store("nodes").cap("nodes","edges")
person Kfir Dadosh    schedule 05.12.2019
comment
Спасибо за вопрос. Это дает мне весь узел независимо от текущего узла, например. если текущий узел - C1 или C2, он всегда возвращает все узлы и ребра, что, если мне нужен только входящий путь, например. если текущий узел - C1, он должен вернуть A- ›B-› C1- ›D1 (не C2-› D2, C3- ›D3). - person Brijen Shah; 06.12.2019

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

g.V().has("name","C1").
  aggregate("n").
  union(outE().emit().repeat(inV().aggregate("n").outE()),
        inE().emit().repeat(outV().aggregate("n").inE())).
  project("source","target").
    by(outV().id()).
    by(inV().id()).fold().
  project("nodes","edges").
    by(select("n").
         by(unfold().
            project("id","name").
              by(id).
              by("name").
            fold())).
    by()

Результатом выполнения этого запроса на вашем примере графика будет:

gremlin> g.V().has("name","C1").
......1>   aggregate("n").
......2>   union(outE().emit().repeat(inV().aggregate("n").outE()),
......3>         inE().emit().repeat(outV().aggregate("n").inE())).
......4>   project("source","target").
......5>     by(outV().id()).
......6>     by(inV().id()).fold().
......7>   project("nodes","edges").
......8>     by(select("n").
......9>          by(unfold().
.....10>             project("id","name").
.....11>               by(id).
.....12>               by("name").
.....13>             fold())).
.....14>     by().next()
==>nodes=[{id=3, name=C1}, {id=6, name=D1}, {id=2, name=B}, {id=1, name=A}]
==>edges=[{source=3, target=6}, {source=2, target=3}, {source=1, target=2}]
person Daniel Kuppitz    schedule 08.12.2019
comment
Спасибо Даниэлю за запрос. Я попытался подключиться к Cosmos Db, но он не завершился с ошибкой: Ошибка выполнения запроса Gremlin: Проект Автор: Далее: Предоставленный переходник ключевого идентификатора не сопоставляется ни с чем. Выдает ошибку в строке 11: by (id ). - person Brijen Shah; 10.12.2019
comment
это by(id), а не by("id"). id относится к T.id (tinkerpop .apache.org / javadocs / current / core / org / apache / tinkerpop /). - person Daniel Kuppitz; 10.12.2019