Добавить или получить вершину в API графа БД Azure Cosmos - PullRequest
0 голосов
/ 15 мая 2018

Используя Gremlin, я могу создать вершину в графе БД Azure Cosmos, введя

g.addV('the-label').property('id', 'the-id')

и затем найдите его, используя

g.V('the-label').has('id', 'the-id')

Однако я не нашел способа выдачи запроса, который вставит узел, если он отсутствует, и просто получит ссылку на него, если он уже существует. Есть ли способ?


Мой конкретный вариант использования заключается в том, что я хочу добавить ребро между двумя узлами, независимо от того, существуют ли эти узлы (или ребро, если на то пошло) уже или нет, в одном запросе. Я попробовал этот подход к наступлению , но очевидно, что Cosmos DB не поддерживает замыкания Groovy, поэтому он не будет работать.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

«Модель восходящего течения» относительно хорошо определена и принята на данный момент.Это описано здесь .Если вы хотите расширить это, чтобы также добавить ребро, это также возможно:

g.V().has('event','id','1').
  fold().
  coalesce(unfold(),
           addV('event').property('id','1')).as('start').
  coalesce(outE('link').has('id','3'),
           coalesce(V().has('event','id','2'), 
                    addV('event').property('id','2')).
                    addE('link').from('start').property('id','3'))

Если это выглядит немного сложным, вы определенно можете упростить с Gremlin DSL (хотя яне уверен, что CosmosDB поддерживает байт-код Gremlin на этом этапе).Вот пример с еще более сложной логикой восстановления, упрощенной с помощью DSL.Это обсуждается в этом блоге более подробно.

0 голосов
/ 15 мая 2018

Пожалуйста, посмотрите на это.

http://tinkerpop.apache.org/docs/current/reference/#coalesce-step

Вы можете попробовать

g.Inject (0) .coalesce (__. V (). Has ('id', 'the-id'), addV ('the-label'). property ('id', 'the-id'))

кстати, вы не сможете найти вершину, используя gV ('the-label').has ('id', 'the-id').

gV () принимает идентификатор вершины в качестве параметров, а не метки вершины.

...