Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Der joinOrder
SPARQL Abfragehinweis
Wenn Sie eine SPARQL Anfrage einreichen, untersucht die Amazon Neptune Neptune-Abfrage-Engine die Struktur der Abfrage. Sie ordnet Teile der Abfrage neu an und versucht, den für die Auswertung erforderlichen Aufwand und die Reaktionszeit der Abfrage zu reduzieren.
Beispielsweise wird eine Folge verbundener Triple-Muster in der Regel nicht in der angegebenen Reihenfolge ausgewertet. Sie wird mittels Heuristik und Statistik neu angeordnet, beispielweise der Selektivität der einzelnen Muster und der Art ihrer Verbindung mittels gemeinsamer Variablen. Wenn Ihre Abfrage außerdem komplexere Muster wie Unterabfragen oder komplexe OPTIONAL oder MINUS Blöcke enthältFILTERs, ordnet die Neptune-Abfrage-Engine diese nach Möglichkeit neu an, um eine effiziente Bewertungsreihenfolge zu erreichen.
Für komplexere Abfragen ist die Reihenfolge, in der Neptune die Abfrage bewertet, möglicherweise nicht immer optimal. Beispielsweise übersieht Neptune möglicherweise spezifische Instance-Dateneigenschaften (z. B. Power-Knoten im Diagramm), die während der Auswertung der Abfrage auftauchen.
Wenn Sie die genauen Merkmale der Daten kennen und die Reihenfolge der Abfrageausführung manuell festlegen möchten, können Sie den Neptune-Abfragehinweis joinOrder
verwenden, um anzugeben, dass die Abfrage in der angegebenen Reihenfolge ausgewertet werden soll.
joinOrder
SPARQLHinweis-Syntax
Der joinOrder
Abfragehinweis wird als Dreifachmuster angegeben, das in einer SPARQL Abfrage enthalten ist.
Die folgende Syntax verwendet das Präfix hint
, das in der Abfrage definiert und eingefügt ist, zur Angabe des Neptune-Abfragehinweis-Namespace:
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
scope
hint:joinOrder "Ordered" .
Verfügbare Bereiche
hint:Query
hint:Group
Weitere Informationen zu Bereichen von Abfragehinweisen finden Sie unter Umfang der SPARQL Abfragehinweise in Neptune.
joinOrder
SPARQLBeispiel für einen Hinweis
Dieser Abschnitt zeigt eine mit und ohne den Abfragehinweis joinOrder
geschriebene Abfrage und die entsprechenden Optimierungen.
In diesem Beispiel wird davon ausgegangen, dass der Datensatz die folgenden Elemente enthält:
Eine einzelne Person mit dem Namen
John
, die 1.000 Personen mit:likes
markiert hat, darunterJane
.Eine einzelne Person mit dem Namen
Jane
, die 10 Personen mit:likes
markiert hat, darunterJohn
.
Kein Abfragehinweis
Die folgende SPARQL Abfrage extrahiert alle Paare von PersonenJane
, die benannt John
wurden und sich beide mögen, aus einer Reihe von Daten aus sozialen Netzwerken:
PREFIX : <https://example.com/> SELECT ?john ?jane { ?person1 :name "Jane" . ?person1 :likes ?person2 . ?person2 :name "John" . ?person2 :likes ?person1 . }
Die Abfrage-Engine von Neptune wertet die Anweisungen möglicherweise in einer anderen Reihenfolge als geschrieben aus. Sie könnte sie beispielsweise in der folgenden Reihenfolge auswerten:
Suche nach allen Personen mit dem Namen
John
.Suche nach allen mit
John
über das Edge:likes
verbundenen Personen.Filtern dieses Satzes nach Personen mit dem Namen
Jane
.Filtern dieses Satzes nach mit
John
über das Edge:likes
verbundenen Personen.
Entsprechend dem Datensatz ergibt die Auswertung in der Reihenfolge 1.000 Entitäten, die im zweiten Schritt extrahiert werden. Der dritte Schritt engt dies auf den einzelnen Knoten Jane
ein. Im letzten Schritt wird ermittelt, dass Jane
den Knoten John
auch mit :likes
markiert hat.
Abfragehinweis
Es wäre günstiger, mit dem Knoten Jane
zu beginnen, da dieser nur 10 ausgehende :likes
Edges besitzt. Dies reduziert den Aufwand während der Auswertung der Abfrage, da das Extrahieren der 1.000 Entitäten im zweiten Schritt vermieden wird.
Im folgenden Beispiel wird mithilfe des joinOrderAbfragehinweises sichergestellt, dass der Jane
Knoten und seine ausgehenden Kanten zuerst verarbeitet werden, indem alle automatischen Neuanordnungen von Verknüpfungen für die Abfrage deaktiviert werden:
PREFIX : <https://example.com/> PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> SELECT ?john ?jane { hint:Query hint:joinOrder "Ordered" . ?person1 :name "Jane" . ?person1 :likes ?person2 . ?person2 :name "John" . ?person2 :likes ?person1 . }
Ein reales Szenario wäre etwa eine Social-Network-Anwendung, bei der Personen im Netzwerk als Influencer mit zahlreichen Verbindungen oder als normale Nutzer mit wenigen Verbindungen klassifiziert würden. In einem solchen Szenario könnten Sie dafür sorgen, dass in einem Beispiel wie dem obigen der normale Benutzer (Jane
) vor dem Influencer (John
) verarbeitet würde.
Abfragehinweis und Neuanordnung
Sie können mit diesem Beispiel einen Schritt weiter gehen. Wenn Sie wissen, dass das :name
-Attribut für einen Knoten eindeutig ist, könnten Sie die Abfrage durch Neuanordnung und Verwendung des Abfragehinweises joinOrder
beschleunigen Dieser Schritt stellt sicher, dass die eindeutigen Knoten zuerst extrahiert werden.
PREFIX : <https://example.com/> PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> SELECT ?john ?jane { hint:Query hint:joinOrder "Ordered" . ?person1 :name "Jane" . ?person2 :name "John" . ?person1 :likes ?person2 . ?person2 :likes ?person1 . }
In diesem Fall können Sie die Abfrage auf die folgenden einzelnen Aktionen in jedem Schritt reduzieren:
Suchen des Einzelpersonknotens mit
:name
Jane
.Suchen des Einzelpersonknotens mit
:name
John
.Prüfen, ob der erste Knoten über eine
:likes
-Edge mit dem zweiten verbunden ist.Prüfen, ob der zweite Knoten über eine
:likes
-Edge mit dem ersten verbunden ist.
Wichtig
Wenn Sie die falsche Reihenfolge wählen, kann der Abfragehinweis joinOrder
zu erheblichen Leistungseinbußen führen. Das vorangehende Beispiel wäre beispielsweise ineffizient, wenn die :name
-Attribute nicht eindeutig wären. Hätten alle 100-Knoten den Namen Jane
und alle 1.000-Knoten den Namen John
, würde die Abfrage 1.000 * 100 (100.000) Paare für :likes
-Edges prüfen.