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

#gremlin #gremlinpython

#гремлин #гремлинпитон

Вопрос:

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

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

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

например,

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

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

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

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

Ответ №1:

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

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

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

 >>> p=__.identity()
>>> g.V('3').optional(p).next()
v[3]
 

Ответ №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 вершину.

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

1. Большое спасибо, это работает. Одна странная проблема, с которой я столкнулся здесь, когда я выполняю отладку в IDE, она не перенастраивает какой-либо результат, если я сначала ставлю точку останова, т.Е. g.V (‘test’) в примере. Но если я выполняю ЗАПУСК, он работает правильно. Означает ли отложенная инициализация, будет ли она выполняться, если выполнение займет время при отладке? заранее благодарю вас

2. Отложенная оценка означает, что пока вы не добавите шаг терминала, такой как ToList(), обход не будет выполняться. В случае gv(‘test’) возвращаемым значением будет GraphTraversalSource, а не результаты этой части обхода. Вам нужно вручную выполнить итерацию каждой части, если вы хотите увидеть результаты подраздела обхода, добавив шаг терминала