У меня есть график, отображающий уровни в игре. Вот некоторые примеры типов узлов: «Уровень», «Комната», «Стул». Типы представлены VertexCollections, где одна коллекция называется «Level» и т. Д. Они связаны ребрами из отдельных EdgeCollections, например «Level» -roomEdge-> «Room» -chairEdge-> «Chair». Комнаты могут также содержать комнаты и т. Д., Поэтому глубина неизвестна.
Я хочу начать с произвольной вершины уровня, пройти через все поддерево и найти все стулья, принадлежащие уровню.
Я пытаюсь понять, будет ли ArangoDB работать лучше, чем OrientDB, для меня, в OrientDB я использую запрос:
SELECT FROM (TRAVERSE out() FROM startNode) WHERE @class = 'Chair'
Я пробовал запрос AQL:
FOR v IN 1..6 OUTBOUND @startVertex GRAPH 'testDb' FILTER IS_SAME_COLLECTION('Chair', v) == true RETURN v;
Однако, похоже, что он выполняется намного медленнее по сравнению с запросом OrientDB (~ 1 секунда против ~ 0,1 секунды).
Код, который я использую для запроса, следующий:
String statement = "FOR v IN 1..6 OUTBOUND @startVertex GRAPH 'testDb' FILTER IS_SAME_COLLECTION('Chair', v) == true RETURN v";
timer.start();
ArangoCursor<BaseDocument> cursor = db.query(statement, new MapBuilder().put("startVertex", "Level/"+startNode.getKey()).get(), BaseDocument.class);
timer.saveTime();
Оба решения работают на одном и том же оборудовании без какой-либо оптимизации, обе базы данных используются "из коробки". В обоих случаях используются одни и те же данные (~ 1 миллион вершин) и возвращаются одинаковые результаты.
Так что мой вопрос в том, правильно ли я делаю свои запросы в AQL или есть ли лучший способ сделать это? Я неправильно понял концепцию VertexCollections и как они используются?