2016-06-14 19 views
0

Gibt es eine Möglichkeit, eine Datensatzanzahl für jede Grafikklasse (V, E und ihre Unterklassen) zu erhalten?OrientDB wählt Datensatzanzahl aus allen Grafikklassen aus

Ich versuchte Abfrage in SQL-Format für aktuellen Fall zu bauen:

SELECT @class, count(*) FROM V GROUP BY @class 
SELECT @class, count(*) FROM E GROUP BY @class 

Aber mit count() + GROUP BY ist extrimply langsam Kombination.

Während Konsolenbefehl list classes schnell arbeitet und Werte für die Anzahl der Datensätze in jeder Klasse (Feld RECORDS) zurückgibt, wie diese Zahlen über SQL-Abfrage (oder über OrientJS API) extrahiert werden?

+0

Hallo, könnten Sie ein Beispiel für Ihr Schema veröffentlichen? und welche Version verwendest du? –

+0

Hallo ich tride Ihren Fall und Ihre Abfrage funktioniert, wenn das Problem die Langsamkeit ist, können Sie einen Index verwenden –

+0

Das Hauptproblem ist die Geschwindigkeit des Erhalts von Zählwert, während 'case() '+' group by' verwendet. Während "Listenklassen" verwendet werden (ich muss Zählinformationen von Klassen mit Milliarden Datensätzen erhalten, in einem Schema gespeichert ~ 700 Klassen), funktioniert es viel schneller. –

Antwort

0

Die Hauptidee ist es, einen Weg finden, um:

  1. Get Liste aller Klassen, wenn Datenbank
  2. Get Anzahl der Datensätze, die

Technische Details in jeder Klasse gespeichert

In OrientDB-Funktionen haben Sie Zugriff auf orient Variable, die .getDatabase() Methode haben. Und diese Methode gibt JAVA ODatabaseDocumentTx Klasseninstanz zurück. Diese Klasse stellt die Methode .countClass(className) bereit, die die Anzahl der Datensätze der Klasse className (method documentation) zurückgibt, und sie funktioniert sehr schnell.

Lösung

erstellen Funktion in Orientdb Studio mit dem Namen "getClassCounts" Sprache "javascript", idempotent: 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; 

Executing:

  • via SQL: SELECT getClassCounts()
0

Ich denke, es ist nicht möglich, weil auch wäre es nicht so schnell wie in der Konsole

+0

Entschuldigung für Missinformation. Ich verwende OrientDB v.2.1.15 und versuche, diese Zählwerte über OrientJS v.2.2.0 (auf dem node.js-Server) zu erhalten. Und es unterstützt nicht den Befehl 'list classes', wenn es als Abfrage verwendet wird. Ich habe versucht zu finden, wo Zählerwerte für Klassen gespeichert (oder alternative schneller Weg, um es anstelle von "count (*)" -Funktion zu bekommen). –

Verwandte Themen