OrientDB выбрать количество записей из всех классов графа
Любой способ получить количество записей для каждого класса графа (V, E и их подклассы)?
Я попытался построить запрос в формате SQL для текущего случая:
SELECT @class, count(*) FROM V GROUP BY @class
SELECT @class, count(*) FROM E GROUP BY @class
Но используя count()
+ GROUP BY
это чрезвычайно медленная комбинация.
Пока консольная команда list classes
работает быстро и возвращает значения для подсчета записей в каждом классе (поле RECORDS
), как извлечь это количество с помощью SQL-запроса (или через OrientJS API)?
2 ответа
Основная идея - найти способ:
- Получить список всех классов, если база данных
- Получить количество записей, которые хранятся в каждом классе
Технические детали
В функциях OrientDB у вас есть доступ к orient
переменная, которая имеет .getDatabase()
метод. И этот метод возвращает экземпляр класса JAVA ODatabaseDocumentTx. Этот класс предоставляет метод .countClass(className)
который возвращает количество записей класса className
( метод документации), и это работает очень быстро.
Решение
Создать функцию в OrientDB Studio с именем "getClassCounts", языком "javascript", идемпотентным: true:
var db = orient.getDatabase();
var classesRawInfo = db.getMetadata().getImmutableSchemaSnapshot().getClasses().toArray();
var classesList = {};
var i = classesRawInfo.length;
while(--i) {
var className = classesRawInfo[i].name;
classesList[className] = db.countClass(className);
}
return classesList;
Выполнение:
- через SQL:
SELECT getClassCounts()
Я думаю, что это невозможно, также потому, что это не так быстро, как в консоли