Ein Teil meines Diagramms ist mit einem riesigen Join zwischen zwei großen Sammlungen erstellt, und ich benutze es jedes Mal, wenn ich Dokumente zu einer Sammlung hinzufüge. Die Abfrage basiert auf einem older post.ArangoDB: Einfügen als Funktion der Abfrage anhand eines Beispiels
FOR fromItem IN fromCollection
FOR toItem IN toCollection
FILTER fromItem.fromAttributeValue == toItem.toAttributeValue
INSERT { _from: fromItem._id, _to: toItem._id, otherAttributes: {}} INTO edgeCollection
Dies dauert etwa 55.000 Sekunden für meinen Datensatz. Ich würde absolut begrüßen, Vorschläge, um das schneller zu machen.
Aber ich habe zwei verwandten Themen:
- Ich brauche einen Upsert. Normalerweise wäre
upsert
in Ordnung, aber in diesem Fall, da ich keine Möglichkeit habe, den Schlüssel im Voraus zu kennen, würde es mir nicht helfen. Um den Schlüssel in den Vordergrund zu bringen, müsste ich anhand eines Beispiels den Schlüssel der ansonsten identischen vorhandenen Kante abfragen. Das scheint vernünftig zu sein, solange es meine Leistung nicht tötet, aber ich weiß nicht, wie ich in AQL meine Abfrage bedingt so gestalten soll, dass sie eine Kante einfügt, wenn die äquivalente Kante noch nicht existiert, aber nichts tut, wenn die äquivalente Kante existiert. Wie kann ich das machen? - Ich muss dies jedes Mal ausführen, wenn Daten zu beiden Sammlungen hinzugefügt werden. Ich brauche eine Möglichkeit, dies nur mit den neuesten Daten auszuführen, so dass es nicht versucht, die gesamte Sammlung zu verbinden. Wie kann ich AQL schreiben, die es mir erlaubt nur den neu eingefügten Datensätzen beizutreten? Sie werden mit Arangoimp hinzugefügt und ich kann nicht garantieren, in welcher Reihenfolge sie aktualisiert werden. Daher kann ich die Kanten nicht gleichzeitig mit der Erstellung der Knoten erstellen. Wie kann ich nur den neuen Daten beitreten? Ich möchte nicht jedes Mal 55k Sekunden ausgeben, wenn ein Datensatz hinzugefügt wird.
Ich habe Abfragen in anderen Datenbanken mit der gleichen Herausforderung, wie Sie die Größe des Datensatzes reduzieren, wenn Sie es neu verknüpfen. Die Lösung, die für mich funktionierte, besteht darin, ein Feld namens "linked = false" in den Kollektionen fromKollection und toCollection hinzuzufügen. –
... Wenn Sie dann neue Dokumente in eine der beiden Sammlungen einfügen, setzen Sie 'linked' immer auf' false'. Wenn Sie die Dokumente verknüpfen, gehen Sie auch zurück und setzen "verlinkt" auf "wahr". Um es zu beschleunigen, sollten Sie auch einen Index auf "verlinkt" setzen. Sie werden feststellen, dass dies Ihre Verarbeitung erheblich beschleunigt, obwohl es beim ersten Mal noch langsam ist, da alles den Wert "linked = false" haben wird. –
Sie könnten eine Foxx-App schreiben, um es für Sie zu tun, ich dokumentierte eine Beispiel-Foxx-App für die Frage eines anderen, sie ist [hier] verfügbar (http://stackoverflow.com/questions/39897954/arangodb-aql-recursive-graph- Traversal) auf StackOverflow. Es lohnt sich, sich etwas Zeit zu nehmen, um Foxx zu lernen, denn es kann schön und schnell sein und eine Funktion wie das, was Sie beschreiben, ist ein perfekter Anwendungsfall. Die Funktion benötigt nicht einmal irgendwelche Parameter, sie läuft nur und sie scannt nur diese Datensätze mit 'linked = false'. –