Гремлин: получение пустого результата для объединения с использованием идентификатора

#gremlin

Вопрос:

Я выполняю следующий запрос, который возвращает пустой список:

 g
  .V("user-11")
  .outE("validate_phone")
  .union(__.identity(), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e"))    
  .toList()
 

Что странно, так phone-29e78c7c18a8bb33c608dbc233bc155e как является допустимым узлом в графике.

Пытаясь разобраться в проблеме, я понял, что у узла user-11 нет ребра validate_phone , которое, по-видимому, вызвало бы проблему, я попробовал с другим узлом, для которого identity() функция привела бы к непустому списку, и обнаружил, что в этом случае v[phone-29e78c7c18a8bb33c608dbc233bc155e] возвращается.

Другими словами

 g.V("user-11").outE("validate_phone").toList() // returns an empty list
g.V("user-347883719").outE("validate_phone").toList() // returns a non empty list
 

и

 g.V("user-347883719").outE("validate_phone").union(__.identity(), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e")).toList() // works just fine
g.V("user-11").outE("validate_phone").union(__.identity(), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e")).toList() // should return at least one vertex, but doesn't
  
 

Моя первая мысль заключается в том, что эфир union или identity не ведут себя так, как ожидалось, при объединении пустых результатов запроса, но я могу что-то упустить.

Любая помощь будет признательна!

Ответ №1:

Это поможет, если вы представите Гремлинов, выполняющих ваши шаги обхода.

Вот почему следующий обход не возвращает никаких результатов.

 g.V("user-11").outE("validate_phone").union(__.identity(), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e"))
 

g.V("user-11") помещает Гремлина на v[пользователь-11]
outE("validate_phone") просит этого Гремлина перейти к исходящему краю «validate_phone». И поскольку текущая вершина не имеет исходящего ребра «validate_phone», Гремлин не может выполнить этот шаг и умирает.
Для выполнения этого шага не осталось гремлинов union . Таким образом, обход возвращает пустой результат.

Ваш другой обход

 g.V("user-347883719").outE("validate_phone").union(__.identity(), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e"))
 

возвращает результат, потому что Гремлин может выполнить этот outE шаг и не умирает.

Вот обход, который всегда будет возвращать результат независимо от того, имеет ли ваша пользовательская вершина исходящее ребро «validate_phone» или нет.

 g.V("user-11").union(__.outE("validate_phone"), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e"))
 

g.V("user-11") помещает Гремлина на v[пользователь-11]
union Шаг просит этого Гремлина породить двух гремлинов-детей.
Первый дочерний Гремлин выполнит первый вложенный обход outE("validate_phone") . И либо вернет край, если он существует, либо умрет.
Второй дочерний Гремлин выполнит вложенный обход V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e") , который вернет телефонную вершину.

Комментарии:

1. Это имеет большой смысл и на самом деле помогло мне понять и переработать мой код, большое спасибо!

2. Спасибо @MarceloRydel ! Пожалуйста, не забудьте отметить мой пост как ответ.