Поиск циклических путей с использованием Gremlin наряду с обычными путями

#gremlin

#gremlin

Вопрос:

Я использую NeptuneDB с 2 м ребрами и вершинами. Граф может иметь циклы длиной 3-10 и сильно связан.

При извлечении нисходящего потока для определенного NodeID я выполняю запрос

 g.V(currentNode).repeat(out().simplePath()).until(outE().count().is(0).or().loops().is(12)).path().toList();
 

Проблема здесь в том, что при использовании simplePath() циклические узлы отфильтровываются.

Например: в случае 1->2->3->1, Я получаю только 1-> 2-> 3 в списке путей, но я хочу, чтобы список путей содержал первый узел в случае циклов, т.Е. 1->2->3->1. Я много искал способ моделирования запроса, который вернет мне как циклический, так и нециклический путь для нисходящего потока, но безуспешно.

Я также сталкиваюсь с проблемами тайм-аута памяти из-за шагов simplePath() и Path(), поскольку я знаю, что это дорогостоящая операция, но, похоже, я не могу найти способ обойти это.

Ответ №1:

Если вы хотите найти cyclicPaths , а также нециклические, вместо того, чтобы делать

 g.V(currentNode).
  repeat(out().simplePath()).
  until(outE().count().is(0).or().loops().is(12)).
  path().
  toList();
 

Вы можете попробовать что-то вроде

 g.V(currentNode).
  repeat(out()).
  until(or(__.not(out()),loops().is(12),cyclicPath())).
  path().
  toList();
 

Это будет включать циклические пути в результат. Вы сможете определить их, поскольку первая и последняя вершины в результате пути будут одинаковыми.

В сильно связном графе вам может потребоваться добавить limit шаг, чтобы прекратить попытки найти все возможные результаты, поскольку их может быть много.