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

Как получить все возможные пути между двумя вершинами (например, 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 документов.


person bsd    schedule 16.04.2015    source источник
comment
Где документация по этой TRAVERSAL функции. Нигде не могу найти. Не могли бы вы мне помочь? Это для 2.8??   -  person akki    schedule 18.07.2017


Ответы (1)


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

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

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

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

FOR p IN TRAVERSAL(locations, connections, "X", "outbound", { minDepth: 1, maxDepth: 2, paths: true, filterVertices: [{_key: "Y"}], vertexFilterMethod: ["exclude"]})
RETURN p.path.vertices[*].name
person mchacki    schedule 16.04.2015
comment
Это сработало, но выполнение запроса по-прежнему занимает ~ 5 секунд, зная, что мы ограничиваем запрос одним единственным источником (X) и maxDepth, равным 2, я ожидал чего-то более быстрого для таких небольших коллекций. Но большое спасибо за ваше время. С уважением. - person bsd; 17.04.2015
comment
Можете ли вы предоставить нам анонимизированный набор данных? Это поможет нам еще больше оптимизировать запрос. Я также ожидал бы, что этот запрос будет быстрее. Если это возможно, отправьте его по адресу [email protected] Большое спасибо. - person mchacki; 17.04.2015