#arangodb #aql #random-walk
#arangodb #aql #случайное блуждание
Вопрос:
Я работаю над графической базой данных в ArangoDB и пытаюсь найти пути для случайного блуждания. Моя цель — начиная с начальной вершины V, я получаю, например, 4 случайных пути с заданной глубиной.
На данный момент я нашел следующий код, который работает :
FOR vertex, edge, path IN 4..4 ANY 'Vertex/417438' edge_collection OPTIONS {bfs: TRUE, uniqueVertices : True, uniqueEdges : True}
SORT RAND()
LIMIT 3
FILTER IS_SAME_COLLECTION('Vertex', vertex)
RETURN path
Это действительно дает мне 3 пути с глубиной 4, но это занимает довольно много времени из-за СОРТИРОВКИ RAND() в начале. Я предполагаю, что сначала он случайным образом сортирует все возможные решения, а затем возвращает решение.
Как вы думаете, есть ли способ получить случайные решения, которые требуют меньше времени?
Спасибо за ваше время и за ваши будущие ответы
Ответ №1:
Я только что обсуждал это с кем-то из команды разработчиков Arango. Получение случайного узла в AQL на данный момент невозможно. Однако это есть в дорожной карте.
Однако я нашел способ выполнить случайное блуждание в ArangoDB.
Давайте возьмем v
, начальную вершину.
-
Запросите количество соседей
N
изv
с помощью этой команды :FOR clip, edge, path IN ANY '${vertex}' hasClipped OPTIONS {bfs: TRUE, uniqueVertices : True, uniqueEdges : True} COLLECT WITH COUNT INTO len RETURN len
-
Затем выберите случайное число
rd
между 0 иN
и выполните следующий запрос :FOR obj IN ANY '${vertex}' hasClipped OPTIONS {bfs : true, uniqueVertices : 'path'} LIMIT ${rd}, 1 RETURN obj
Этот запрос вернет случайного соседа среди существующих.
-
Выполните итерацию, чтобы получить случайное блуждание с нужной глубиной.