Некоторая справочная информация: у меня есть сайт вопросов и ответов с большим количеством сообщений и пользователей. Данные хранятся в базе данных MSSQL. Мне интересно, как графическая база данных может помочь получить интересные результаты для пользователей, например, предложить похожих пользователей или предложить соответствующие сообщения.
Мне удалось импортировать все сообщения и пользователей (только их идентификаторы), а также отношения «сообщение для публикации» и «сообщение для пользователя» из тестовой базы данных в базу данных ArangoDB, и в итоге я получил 4 коллекции:
- сообщений: Сборник документов, 9833 записи
- Пользователи: Коллекция документов, 1264 записи
- parentToChildPosts: коллекция Edge, хранящая отношение родительского сообщения к дочернему, 4978 записей.
- 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 других способа реализовать алгоритм:
- Напишите 3 запроса GRAPH_NEIGHBORS, имитирующие 3 шага одного обхода: намного медленнее. При первом запуске требуется около 3 секунд.
- Использовать соединение (без использования каких-либо графических функций): довольно быстро.
Из документации ArangoDB предлагает использовать графические функции для такого рода ситуаций. Так что я не сторонник использования Join (дает мне ощущение, что я могу сделать это и в SQL, так зачем использовать графовую базу данных).
Любое предложение, как заставить GRAPH_NEIGHBORS работать быстро без ошибок? Или любое другое предложение, как построить граф, например, насколько велик может вырасти граф?