2017-10-05 4 views
1

Ich habe Daten so organisiert:Arangodb AQL-Abfrage

enter image description here

Es gibt 1k von Lehrern, 10k von Schülern, jeder Schüler hat ~ 100 Hausaufgaben.

Ich brauche alle Hausaufgaben von Schülern, die mit einem Lehrer über Klassen verbunden sind, oder durch direkte Verbindung zwischen ihnen. Alle Ecken und Kanten haben einige Attribute, und angenommen, alle erforderlichen Indizes sind bereits erstellt, oder wir können sie etwas später diskutieren.

Ich kann alle erforderlichen Schüler-IDs durch solche schnell genug Abfrage erhalten:

$query1 = "FOR v1 IN 1..1 INBOUND @teacherId teacher_pupil FILTER v1.deleted == false RETURN DISTINCT v1._id"; 
$query2 = "FOR v2 IN 2..2 INBOUND @teacherId OUTBOUND teacher_class, INBOUND pupil_class FILTER v2.deleted == false RETURN DISTINCT v2._id"; 
$queryUnion = "FOR x IN UNION_DISTINCT (($query1), ($query2)) RETURN x"; 

Dann schrieb ich folgendes:

$query = " 
LET pupilIds = ($queryUnion) 

FOR pupilId IN pupilIds 
    LET homeworks = (
     FOR homework IN 1..1 ANY pupilId pupil_homework 
      return [homework._id, pupilId] 
    ) 
RETURN homeworks"; 

Ich habe meine Hausaufgaben, und ich kann sogar versuchen, sie filtern, aber die Abfrage ist zu langsam - das ist ein falscher Weg, glaube ich.

Frage 1 Wie kann ich es tun, ohne alle Homeworks riesige Menge an Speicher auf einmal (LIMIT oder was auch immer), Sortieren und Filtern von Homeworks von Vertex 'Attribute schnell und effizient? Ich bin mir sicher, dass das Einschränken von Pupillen oder Schüler-bezogenen Hausaufgaben in der Abfrage/Unterabfrage FOR zu falscher Sortierung/Paginierung führt.

Ich habe eine andere versuchen mit reinem Graph AQL-Abfrage:

$query1 = "FOR v1 IN 2..2 INBOUND @teacherId pupil_teacher, OUTBOUND pupil_homework RETURN v1._id"; 
$query2 = "FOR v2 IN 3..3 INBOUND @teacherId teacher_class, pupil_class, OUTBOUND pupil_homework RETURN v2._id"; 
$query = "FOR x IN UNION_DISTINCT (($query1), ($query2)) LIMIT 500, 500 RETURN x"; 

Es ist nicht viel schneller ist, und ich weiß nicht, wie Filter Lehrer Ecken durch Attribute.

Frage 2 Welcher Ansatz eignet sich am besten zum Erstellen solcher AQL-Abfragen, wie kann ich auf Scheitelpunkte eines Diagramms zugreifen, das alle Teile des Pfads nach Attributen filtert? Kann ich das Ergebnis paginieren, um Speicherplatz zu sparen und die Abfrage zu beschleunigen? Wie kann ich es überhaupt beschleunigen?

Vielen Dank!

Antwort

1

Lehrer und Schüler Unter der Annahme, sind miteinander über Klassen (2 ausgehende Links) oder direkt (Einzel Outbound-Link) und ohne andere Weise mit Ihnen so etwas wie dieses

FOR v IN 1..2 OUTBOUND "teacher_id" GRAPH "graph_name" 
    FILTER LIKE(v._id, "pupil_collection_name/%") 
    FOR homeworks IN 1 OUTBOUND v GRAPH "graph_name" 
     LIMIT lowerLimit,numberOfItems 
      RETURN homeworks 

Aber wenn es tun die Möglichkeit, dass ein Lehrer und Schüler können mit etwas anderem als einer Klasse miteinander in Beziehung gesetzt werden wir auch sehen wir

FOR v IN 1..2 OUTBOUND "teacher_id" GRAPH "graph_name" 
    FILTER LIKE(v._id, "pupil_collection_name/%") && (e.name == "ClassPupil" || e.name == "TeacherPupil") 
    FOR homeworks IN 1 OUTBOUND v GRAPH "graph_name" 
     LIMIT lowerLimit,numberOfItems 
      RETURN homeworks 

Beachten Sie, dass seit dem gleichen te müssten unsere Abfrage in Bezug auf die Kante filtern acher kann sowohl direkt als auch über eine Klasse mit einem Schüler verbunden sein, wir können nicht eindeutige Hausaufgaben haben. Daher wird die Verwendung eines RETURN DISTINCT homeworks vorgeschlagen. Aber wenn Duplikate kein Problem sind, sollte die obige Abfrage funktionieren

+0

Vielen Dank für die Antwort: Die Abfrage ist sehr schnell. Was ist, wenn ich nach Hausaufgabenattribut filtern möchte? Nur das Hinzufügen ... FÜR HomeWorks- IN 1 OUTBOUND v GRAFIK "graph_name" ** FILTER homeworks.attr1 == 'value1' ** LIMIT UnteresLimit, numberOfItems RETURN HomeWorks- ... ist zu langsam, und wie ich weiß, verwendet ArangoDB, wie ich weiß, keine Scheitelpunktattribut-Indizes. – anton

+0

Wenn Sie nur die Hausaufgaben nach Hausaufgabenattribut filtern möchten, können Sie die Hausaufgabensammlung einfach einlesen, ohne eine Grafikabfrage verwenden zu müssen. 'FOR hw in home_work_collection_name FILTER hw.attr1 == 'Wert1' return hw'. Darüber hinaus wird vorgeschlagen, dass Sie Ihre Sammlung mit dem Attribut "attr1" indizieren. Sobald Sie Ihre gefilterten Hausaufgaben haben, können Sie die Grafik durchlaufen und die Informationen von Lehrer oder Klassen entsprechend erhalten. Umgekehrt (vorgeschlagen) können Sie einen Filter in der Abfrage hinzufügen, die in der obigen Antwort ist. Direkt über der Zeile LIMIT lowerLimit, numberOfItems – Prasanna