Проверьте ребро и создайте ребро в той же инструкции (gremlin python) - PullRequest
0 голосов
/ 26 сентября 2018

Моя первоначальная логика проверки наличия ребра и создания ребра требует запроса.Я пытаюсь проверить и создать ребро в одной инструкции.

Этот запрос, похоже, не работает

ipdb> prop = self._graph.V('pppp').outE('friend').hasId('testEdge').as_('e').inV()
             .hasId('dddd').select('e').
             coalesce(__.property('testedder', 1111).fold().unfold(), 
                __.V('dddd'). as_('to_a').V('pppp').addE('friend').to('to_a')).
             toList()

1) Первая часть объединения - обновление свойства Edges работает нормально

2) Вторая часть объединения либо не вызывается, либо не работает.Это работает как самостоятельный запрос.«Как» не работает в анонимных обходах?

PS: я использую AWS Neptune

1 Ответ

0 голосов
/ 26 сентября 2018

У вас была правильная идея, но вам нужно было некоторое упрощение.Я постараюсь сделать это по шагам.Во-первых, всякий раз, когда я вижу помеченные шаги, я пытаюсь увидеть, есть ли способ избежать их использования.В этом случае они могут быть учтены:

g.V('pppp').outE('friend').
  filter(hasId('testEdge').inV().hasId('dddd')).
  coalesce(__.property('testedder', 1111).fold().unfold(), 
           __.V('dddd'). as_('to_a').V('pppp').addE('friend').to('to_a'))

Читаемость прохождения улучшается в этих первых двух строках, потому что читатель может сразу увидеть, что вы хотите найти ребро с учетом некоторых критериев, которые подразумевались толькошаг маркировки.Затем я посмотрел на coalesce().На самом деле, если filter() не возвращает ребер, то у coalesce() никогда не будет возможности выполнить, и поэтому вторая часть coalesce() никогда не сможет работать на вас.Итак, давайте очистим эту часть:

g.V(1).outE('knows').
  filter(hasId(6).inV().hasId(2)).
  fold().
  coalesce(unfold().property('testedder', 1111),
           V('dddd').as_('to_a').V('pppp').addE('friend').to('to_a'))

Если неясно, почему fold() и unfold() находятся там, где они есть, вы должны проверить мое подробное объяснение подхода здесь .Таким образом, с fold() и unfold(), где они должны быть, coalesce() теперь должен запускать оба условия в зависимости от того, проходит ли ребро filter().Первая часть coalesce() в порядке, но вторая может по-прежнему использовать немного работы, так как я бы снова хотел выделить метки шагов, если они не нужны:

g.V('pppp').outE('friend').
  filter(hasId('testEdge').inV().hasId('dddd')).
  fold().
  coalesce(unfold().property('testedder', 1111),
           addE('friend').from(V('pppp')).to(V('dddd')))

выше Гремлин предполагает, что вы знаете, что вершина "pppp" существует.Если вы этого не сделаете, вы можете попробовать (как предложено Дэниелом Куппицем):

g.V('pppp').
  not_(outE('friend').hasId('testEdge').
       filter(inV().hasId('dddd')).
         property('testedder', 1111)).as('p').
  V('dddd').
    addE('friend').from('p')
...