#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 ! Пожалуйста, не забудьте отметить мой пост как ответ.