Гремлин необязательно как пустой

Не могли бы вы помочь мне понять, есть ли какой-либо вариант, в котором мы можем пропустить необязательное в гремлине,

сценарий таков, что мы проходим через граф и имеем необязательный оператор

в зависимости от параметра запроса в запросе, у меня будет путь обхода для необязательного, в противном случае нет пути для необязательного

Например,

if query_parameter:
 path=has('labeltest').inE().outV()

g.V('test').optional(path)

поскольку необязательный путь предназначен для условия доступности параметра query_parameter, это приводит к ошибке и не возвращает результата, если параметр запроса недоступен. Мы не предпочитаем повторять код в g.v () с помощью условий if и else. Любые мысли сообщить необязательный, чтобы ничего не делать, или фиктивные параметры, чтобы вернуть предыдущий путь. Цените ваши мысли, так как я новичок в этом, заранее спасибо

С уважением, Хари


person user1293071    schedule 25.11.2020    source источник


Ответы (2)


Если вы делаете это из Python, используя вариант языка Gremlin (GLV) тогда вы можете добавить необязательную часть запроса только при необходимости. GLV оцениваются лениво, поэтому вы можете условно построить их в коде. Они будут выполняться только при добавлении терминального шага (например, toList()). Это означает, что вы можете построить обход следующим образом:

t=g.V('test')
if query_parameter:
  t=t.has('labeltest').inE().outV()
res=t.toList()

С помощью этого кода необязательный путь обхода будет выполняться только тогда, когда query_parameter имеет значение True, иначе он просто вернет вершину test.

person bechbd    schedule 25.11.2020
comment
Большое спасибо, это работает. Одна странная проблема, с которой я столкнулся здесь, когда я выполняю отладку в среде IDE, она не возвращает никакого результата, если я ставлю точку останова на первое место, то есть g.V ('test') в примере. Но если я выполняю RUN, он работает правильно. Означает ли ленивое инициирование, будет ли оно выполняться, если выполнение займет время при отладке? заранее спасибо - person user1293071; 25.11.2020
comment
Ленивое вычисление означает, что до тех пор, пока вы не добавите конечный шаг, такой как toList (), обход не будет выполняться. В случае g.V ('test') возвращаемое значение будет GraphTraversalSource, а не результатами этой части обхода. Вам нужно вручную перебирать каждую часть, если вы хотите увидеть результаты части обхода, добавив конечный шаг - person bechbd; 26.11.2020

В случае, если вы не хотите, чтобы ничего происходило, вы можете просто установить для переменной path значение identity(). Эффект будет следующим:

gremlin> g.V('3').optional(identity())
==>v[3]

В частности, в Python вы можете сделать это:

>>> p=__.identity()
>>> g.V('3').optional(p).next()
v[3]
person Kelvin Lawrence    schedule 25.11.2020