Gremlin - одновременно ограничить ход итераций и искать свойство ребра - PullRequest
1 голос
/ 11 октября 2019

У меня есть (сломанный) кусок кода Гремлина, чтобы сгенерировать кратчайший путь от данной вершины до той, которая имеет параметр test_parameter. Если этот параметр не найден на ребре, пути не должны возвращаться.

s.V(377524408).repeat(bothE().has('date', between(1554076800, 1556668800)).otherV()) /* date filter on edges */
    .until(or(__.bothE().has('test_property', gt(0)),
           loops().is(4)))                                /* broken logic! */
    .path()                                             
    .local(unfold().filter(__.has('entity_id')).fold())   /* remove edges from output paths*/

Прерванная строка - .until(or(__.outE().has('test_property', gt(0)), loops().is(4))).

В настоящее время - и имеет смысл, почему - он дает все пути, которые являются 4 скачками от начальной вершины.

Я пытаюсь адаптировать его так, чтобы, если ход был в 4 итерации, и если свойство test_property равно не найдено, то оно не должно возвращать никаких путей,Если найден test_property, он должен возвращать только путь (и) к этой вершине.

Я попытался наложить ограничение times(4) и удалить условие loops(), ноне знаю, как иметь ограничение times(4) this и .has('test_property', gt(0)).

Ответы [ 2 ]

3 голосов
/ 12 октября 2019

В ответе Даниэля есть несколько вопросов (см. Комментарии). Этот запрос возвращает правильный результат:

g.V(377524408)
  .repeat(bothE().has('date', between(1554076800, 1556668800)).otherV().simplePath().as("v"))
  .until(and(bothE().has('tp', gt(0)), loops().is(lte(4))))
  .select(all, "v")
  .limit(1)

Требуется simplePath(), поэтому мы не будем идти вперед и назад и избегать кружков.

Повторный цикл выполняется до тех пор, пока не будет выполнено условиеИ мы не достигли максимального прыжка.

limit(1) возвращает только первый (самый короткий) путь. Пропустить все пути.

Обратите внимание, что если график направлен, лучше использовать outE(), а не bothE().

0 голосов
/ 11 октября 2019

Это должно работать:

s.V(377524408).
  repeat(bothE().has('date', between(1554076800, 1556668800)).otherV().as('v')).
    times(4).
  filter(bothE().has('test_property', gt(0))).
  select(all, 'v')

Также обратите внимание, что я заменил ваш local(unfold().filter(__.has('entity_id')).fold()) на что-то гораздо более простое (предполагая, что единственной целью было удаление краев с пути).

...