ArangoDB: Как получить все возможные пути между двумя вершинами?

Как получить все возможные пути между 2 вершинами (например, X и Y) с maxDepth = 2?

Я пробовал с TRAVERSAL но выполнение занимает около 10 секунд. Вот запрос:

FOR p IN TRAVERSAL(locations, connections, "X", "outbound", { minDepth: 1, maxDepth: 2, paths: true }) 
FILTER p.destination._key == "Y" 
RETURN p.path.vertices[*].name

Коллекция местоположений (вершин) содержит 23753 документа, а коллекция соединений (ребер) содержит 123414 документов.

1 ответ

Решение

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

Таким образом, в вашем запросе вы хотите соответствовать только целевой вершине "Y", и все остальные вершины должны быть пропущены, но не включены в результат, exclude,

Это делает более поздний ФИЛЬТР устаревшим. Прямо сейчас внутренний оптимизатор не может сделать это автоматически, но это волшебство находится в нашей дорожной карте.

Это запрос, содержащий оптимизацию:

FOR p IN TRAVERSAL(locations, connections, "X", "outbound", { minDepth: 1, maxDepth: 2, paths: true, filterVertices: [{_key: "Y"}], vertexFilterMethod: ["exclude"]})
RETURN p.path.vertices[*].name
Другие вопросы по тегам