Фильтрация обхода Гремлин по краю - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь использовать Gremlin, чтобы пройти от исходного узла ко всем подключенным узлам в пределах X степеней соединения.Направление соединения не имеет значения, поэтому я использую функцию both().Я также хочу быть в состоянии предотвратить пересечение краев с определенными метками.Вот примерный график.

gremlin> g.addV().property(id,1).as('1').
......1>   addV().property(id,2).as('2').
......2>   addV().property(id,3).as('3').
......3>   addV().property(id,4).as('4').
......4>   addV().property(id,5).as('5').
......5>   addV().property(id,6).as('6').
......6>   addV().property(id,7).as('7').
......7>   addE('edge1').from('1').to('2').
......8>   addE('edge2').from('1').to('3').
......9>   addE('edge2').from('2').to('4').
.....10>   addE('edge3').from('3').to('5').
.....11>   addE('edge3').from('4').to('6').
.....12>   addE('edge4').from('7').to('6').iterate()

Обход, который у меня пока есть, выглядит следующим образом:

gremlin> g.V(1).
......1>   repeat(both().filter(not(inE('edge3')))).
......2>   times(4).
......3>   emit().
......4>   simplePath().
......5>   dedup()

Однако это не совсем то, что я ищу.Я хочу что-то, что фактически предотвратит попадание траверсера в вершину, если он должен пересечь заданное ребро.Моя текущая реализация фильтрует вершины, у которых есть входящее ребро, но в некоторых случаях я все еще могу захотеть, чтобы эта вершина появлялась в результатах, если для прохождения туда пересекатель пересек другое ребро.

Имеет ли это смысл?Короче говоря, я пытаюсь специально фильтровать по ребру, а не по отношению вершины к ее ребрам.

1 Ответ

0 голосов
/ 17 октября 2018

Я думаю, что следовал тому, что вы говорили, вы не могли бы просто использовать bothE() и фильтровать эти края, проходя их:

gremlin> g.V(1).
......1>   repeat(bothE().not(hasLabel('edge3')).otherV()).
......2>     times(4).
......3>     emit().
......4>   simplePath().
......5>   dedup()
==>v[2]
==>v[3]
==>v[4]
...