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