Azure Космический граф вершина ребра в свойстве вершины - PullRequest
1 голос
/ 05 апреля 2020

У меня есть две вершины:

1) Вершина 1: { id: 1, name: “john” }

2) Вершина 2: { id: 2, name: “mary” }

Существует ребро от 1 до 2 с именем «children».

Можно ли вернуть 2 вложенных в 1, используя gremlin, как это?

  { 
    id: 1, 
    name: “john”,
    children: { id: 2, name: “mary” }
  }

Спасибо!

Мое решение с удивительной помощью @ noam621 ---------------------------------


g.V(1)
.union( valueMap(true),
        project('children').by( coalesce( out('children').valueMap(true).fold() , constant([]))),
        project('parents').by( coalesce( out('parents').valueMap(true).fold() , constant([])))
)
.unfold().group().by(keys).by(select(values))

Возвращает следующий объект:

{ 
    id: 1, 
    name: [ “john” ],
    children: [ { id: 2, name: [ “mary” ] } ],
    parents: []
}

. Союз с проектом - это ключ для объединения всех объектов в один объект. valueMap (true) .fold () является фундаментальным для получения всех объектов в ребре, а объединение помогает со значением по умолчанию, если ребро не возвращает какую-либо вершину.

Из-за некоторых Azure ограничения Cosmos gremlin возможно получить значения только в виде значений массива. Таким образом, я завершил форматирование объекта в коде приложения. Пока все нормально.

Спасибо!

1 Ответ

4 голосов
/ 05 апреля 2020

Вы можете сделать это, используя шаг project для обеих вершин:

g.V(1).project('id', 'name', 'children').
    by(id).
    by('name').
    by(out('children').
      project('id', 'name').by(id).
        by('name'))

пример: https://gremlify.com/3j


запрос с valueMap:

g.V(1).union(
    valueMap().
      with(WithOptions.tokens).by(unfold()),
    project('children').
      by(out('children').
        valueMap().
          with(WithOptions.tokens).by(unfold()))
  ).unfold().
  group().by(keys).
    by(select(values))

, если valueMap().with(WithOptions.tokens) не поддерживается в Космосе, используйте valueMap(true) вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...