#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
шаг, чтобы прекратить попытки найти все возможные результаты, поскольку их может быть много.