Как сделать эффективную случайную прогулку в Арангодб? - PullRequest
0 голосов
/ 24 апреля 2019

Я работаю над базой данных графов на 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, но это занимает довольно много времени из-за SORT RAND () в начале.Я предполагаю, что сначала случайным образом сортируются все возможные решения, а затем возвращается решение.

Как вы думаете, есть способ получить случайные решения, которые стоят меньше времени?

Спасибо за ваше время и заваши будущие ответы

1 Ответ

0 голосов
/ 25 апреля 2019

Я только что поговорил с кем-то из команды разработчиков Аранго. Получение случайного узла в 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. Выполните итерацию, чтобы получить случайную прогулку с нужной глубиной.

...