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