Как выполнить эффективное случайное блуждание в arangodb?

#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 , начальную вершину.

  1. Запросите количество соседей N из v с помощью этой команды :

     FOR clip, edge, path IN ANY '${vertex}' hasClipped OPTIONS {bfs: TRUE, uniqueVertices : True, uniqueEdges : True}
                            COLLECT WITH COUNT INTO len
                            RETURN len
      
  2. Затем выберите случайное число rd между 0 и N и выполните следующий запрос :

     FOR obj IN ANY '${vertex}' hasClipped OPTIONS {bfs : true, uniqueVertices : 'path'}
                            LIMIT ${rd}, 1
                            RETURN obj
      

    Этот запрос вернет случайного соседа среди существующих.

  3. Выполните итерацию, чтобы получить случайное блуждание с нужной глубиной.