2015-10-07 11 views
2

У меня есть график с деревом папок как структура, и я хочу, чтобы все вершины были листами от конкретной начальной точки в графике. Я использовал следующий AQL запрос:Извлечь вершины из GRAPH_NEIGHBORS AQL-запроса

FOR V in 
     GRAPH_NEIGHBORS("FolderTree", 
         { "folderpath" : "/Cabinet 000001"}, 
         { direction : 'outbound', 
         maxDepth : 20, 
         vertexCollectionRestriction : 'Document'}) 
return V 

Запрос работает нормально, но я только получить внутреннюю ручку ID в результаты:

["Document/4592118051","Document/4598606115","Document/4588185891",....] 

Я хотел бы иметь в результате список записей в коллекции вместо внутренний идентификатор. Все внутренние идентификаторы принадлежат к одной коллекции. Мне интересно, можно ли использовать подзапрос. Я не понимаю, что может быть синтаксисом.

С уважением

ответ

1

Вы должны пройти includeData -Option из GRAPH_NEIGHBORS в true.

FOR V in 
    GRAPH_NEIGHBORS("FolderTree", 
        {"folderpath" : "/Cabinet 000001"}, 
        { direction : 'outbound', 
        maxDepth : 20, 
        vertexCollectionRestriction : 'Document', 
        includeData: true} 
    ) 
return V 

Поведение GRAPH_NEIGHBORS изменилось с выходом 2.6, предыдущие версии сделали включать в себя все атрибуты документа в результате, может быть, вы укусила этого изменения.

+0

Спасибо, что это хорошо работает. Я новичок в Arango.Anyway, это немного медленнее. Я, наконец, нашел другой способ сделать это – seb34

0

Спасибо Tom за ваш вклад, он работает нормально, но исполнение немного медленное. Я новичок в Arango, я оцениваю продукт для проекта, но я начинаю влюбляться в DB Arango, это очень полная БД, и на данный момент это здорово.

Для моего первоначального вопроса я нашел другой способ сделать это, используя временный массив. Он применяется только в том случае, если результат ограничен. В моем случае у меня есть около 1000 записей:

LET docs = (FOR V in GRAPH_NEIGHBORS("FolderTree",{"folderpath" : "/Cabinet 000001"},{direction : 'outbound', maxDepth : 10,vertexCollectionRestriction : 'Document'}) RETURN V) 
FOR docid in docs 
    FOR doc in Document 
    FILTER doc._id==docid 
    return doc 

Это один занимает 5 секунд, чтобы загрузить 1000 записей, а другие 25 сек.

+0

Это, кажется, «не оптимальная» оптимизация с помощью внутреннего механизма запросов ArangoDB. Запрос делает то же самое, поэтому они должны быть одинаково быстрыми. Я изучу его, чтобы улучшить его;) – mchacki

+0

Не совсем то же самое. В одном случае вы запрашиваете в коллекции Document для каждой вершины, которую вы найдете в графике, и в моем случае мне нужно только один раз просмотреть коллекцию документов и фильтровать. Я полагаю, что алгоритм, использующий «vertexCollectionRestriction», пытается получить данные «на лету» и не ждет, чтобы получить все результаты, это хорошее решение, чтобы не потреблять слишком много памяти, если у вас есть большой результат, но менее эффективный. Если мы используем «vertexCollectionRestriction», было бы интересно иметь своего рода параметр «размер партии», позволяющий загружать данные с помощью пакета, а не «на лету». – seb34