Почему максимальная глубина запроса Arangodb неверна?

У меня есть нормальный график узловых связей

Чтобы получить все ссылки, я хочу получить узел, связанный с максимальной глубиной x. Но приведенный ниже запрос вернул неверный результат (64 из 81). Но максимальная глубина между ними примерно равна 7. Где я ошибся?

FOR v IN 0..14 ANY "Entity/41591987" EntityRelation 
OPTIONS {uniqueVertices: "global"} return v

Редактировать 1: Добавление опции bfs: true, казалось, решило проблему, но я не понимаю, почему.


Изменить 2: мой полный запрос

   //get all the vertices related to this one id
    FOR v IN 0..9 ANY "EntityProd/58868489" EntityRelationProd 
    OPTIONS  {uniqueVertices: "global",bfs:true}
    //from each of above results, get the incoming and outgoing edges
    FOR vv, c IN ANY v EntityRelationProd RETURN c

Дело в том, что я уже получил правильные результаты, чтобы получить все вершины. Почему "uniqueVertices: global" повлияет на мою вторую часть? Или я должен повторно указать ОПЦИИ?

1 ответ

Я думаю, что проблема в том, OPTIONS {uniqueVertices: "global"}, Это гарантирует, что каждая вершина посещается не более одного раза. Таким образом, если есть два пути к вершине разностной длины, будет пройден только один из них, другой исключен. Без bfs: true результат uniqueVertices: 'global' не является детерминированным.

Позвольте мне проиллюстрировать это следующим примером. У нас есть 6 вершин в алфавитном порядке:

(A) -> (B) -> (C) -> (D) -> (E) -> (F)

А затем у нас есть другая вершина X, добавляющая ярлык:

(A) -> (X) -> (D)

Теперь выполним Обход выше с глубиной 1..3 начинается с (A), В A у нас есть два варианта, либо выбрать B или же X первый. Давайте выберем XТогда мы вернемся X, D, E для этого подграфа. Чем мы вернемся к A и выберите другой вариант. Там у нас есть B, C, Мы не вернемся D как это уже посещали. Итак, в этом случае мы имеем: X, D, E, B, C в следствии.

Если мы выберем другой вариант в A результат будет другим. Сначала мы находим B, C, D, что по-прежнему соответствует другому выбору. Но тогда начинаются неприятности, если мы продолжаем искать в X, Там мы выбираем X и посмотри на D, к несчастью D был уже возвращен, поэтому мы останавливаемся здесь. Отсюда и результат: B, C, D, X и нет E,

Если вы используете bfs: true все пути анализируются по возрастанию глубины. Таким образом, не может быть более короткого пути к любой вершине, которая столкнулась бы с проблемой, с которой мы столкнулись в примере выше. Здесь результат является детерминированным и четко определенным.

Однако вы говорили обо всем links между вашими сущностями. Обратите внимание, если вы говорите: uniqueVertices: 'global' самое большее будет ОДИН край, указывающий на любой из ваших возвращенных объектов (также выбранный на основе порядка обхода). Если вы хотите иметь все грани между вашими сущностями, вы, вероятно, хотите обойтись без uniqueVertex вариант.

Другие вопросы по тегам