ArangoDB: GRAPH_NEIGHBORS выдает ошибку [1909] слишком много итераций

Некоторая справочная информация: у меня есть сайт вопросов и ответов с большим количеством сообщений и пользователей. Данные хранятся в базе данных MSSQL. Мне интересно, как графическая база данных может помочь получить интересные результаты для пользователей, например, предложить похожих пользователей или предложить соответствующие сообщения.

Мне удалось импортировать все сообщения и пользователей (только их идентификаторы), а также отношения «сообщение для публикации» и «сообщение для пользователя» из тестовой базы данных в базу данных ArangoDB, и в итоге я получил 4 коллекции:

  1. сообщений: Сборник документов, 9833 записи
  2. Пользователи: Коллекция документов, 1264 записи
  3. parentToChildPosts: коллекция Edge, хранящая отношение родительского сообщения к дочернему, 4978 записей.
  4. postToUsers: Коллекция Edge, хранящая отношение сообщения к пользователю-владельцу, 9833 записи.

Затем я построил граф «postGraph» с двумя ребрами и создал AQL-запрос, пытаясь реализовать простой алгоритм «похожих пользователей», основанный на отношениях «сообщения пользователей» и «публикаций сообщений». Вот поисковый запрос 10 самых популярных похожих пользователей для пользователя с _id "users / 1":

FOR e in GRAPH_NEIGHBORS('postGraph', 'users/1', 
{ edgeCollectionRestriction: ['parentToChildPosts', 'postToUsers'], 
    vertexCollectionRestriction: 'users', 
    minDepth: 3, 
    maxDepth: 3 })
FILTER e.vertex._key != '1'
COLLECT userid = e.vertex._key INTO g
SORT LENGTH(g) DESC
LIMIT 10
RETURN userid

Визуально я начал поиск с пользователя users / 1 и нашел пути к другим пользователям следующим образом:

пользователь => сообщение => родительский / дочерний пост => пользователь.

Таким образом, глубина обхода равна 3. Затем я исключаю самого пользователя (ФИЛЬТР), группирую по пользовательским ключам, подсчитываю количество результатов и беру первые 10.

Я проверил запрос, и он работал для большинства пользователей, но не удался для некоторых активных пользователей с ошибкой:

[1909] слишком много итераций

Запрос выполняется довольно быстро (в течение одной секунды) и выдает ошибку. У одного из неудачливых активных пользователей 727 сообщений (на мой взгляд, не так много).

Я также пробовал 2 других способа реализовать алгоритм:

  1. Напишите 3 запроса GRAPH_NEIGHBORS, имитирующие 3 шага одного обхода: намного медленнее. При первом запуске требуется около 3 секунд.
  2. Использовать соединение (без использования каких-либо графических функций): довольно быстро.

Из документации ArangoDB предлагает использовать графические функции для такого рода ситуаций. Так что я не сторонник использования Join (дает мне ощущение, что я могу сделать это и в SQL, так зачем использовать графовую базу данных).

Любое предложение, как заставить GRAPH_NEIGHBORS работать быстро без ошибок? Или любое другое предложение, как построить граф, например, насколько велик может вырасти граф?


person ydou    schedule 14.11.2014    source источник


Ответы (1)


Привет, вы совершенно правы, функция GRAPH_NEIGHBORS создана именно для этого. Существует параметр maxIterations, ограничивающий количество вершин, которые будут затронуты одним обходом (где отображается GRAPH_NEIGHBORS), и ваша структура графа может достичь там значения по умолчанию (10000). Мы реализовали это значение, чтобы предотвратить бесконечное зацикливание. Чтобы исправить это, вы просто увеличиваете это значение. Также у меня есть еще один совет по производительности: * Если ваш Graph содержит только две edgeCollections, вам не нужно устанавливать их для ограничения. Так что мы можем сохранить там чек. (Не будет иметь большого значения)

Вот обновленный запрос:

FOR e in GRAPH_NEIGHBORS('postGraph', 'users/1', 
  { maxIterations: 1000000, 
    vertexCollectionRestriction: 'users', 
    minDepth: 3, 
    maxDepth: 3 })
FILTER e.vertex._key != '1'
COLLECT userid = e.vertex._key INTO g
SORT LENGTH(g) DESC
LIMIT 10
RETURN userid

Для получения дополнительной информации, пожалуйста, придерживайтесь информации в документации по AQL Traversal. Все, что там доступно, также доступно для GRAPH_NEIGHBORS https://docs.arangodb.com/Aql/GraphOperations.html

person mchacki    schedule 14.11.2014
comment
Привет! Спасибо вам большое за ваш ответ. Я не вижу параметр maxIterations в разделе GRAPH_NEIGHBORS. Я действительно искал его и нашел только в параметрах GRAPH_TRAVERSAL. Документ устарел :)? Я просто попробовал ваше предложение, но ошибка все равно возникла. Я пробовал другое число maxIterations (даже всего 10), но он все равно вызывает ту же ошибку. - person ydou; 14.11.2014
comment
Есть проблема с опцией maxIterations, она не задокументирована и не пропущена. я исправлю это в следующем выпуске (2.3.1) - person florian; 18.11.2014