Il suggerimento per la query joinOrder SPARQL - Amazon Neptune

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Il suggerimento per la query joinOrder SPARQL

Quando invii una SPARQL query, il motore di query di Amazon Neptune esamina la struttura della query. Riordina le parti della query e tenta di ridurre al minimo la quantità di lavoro richiesta per la valutazione e il tempo di risposta della query.

Ad esempio, una sequenza di modelli di tripla collegati non viene generalmente valutata nell'ordine specificato. Viene riordinato utilizzando l'euristica e le statistiche come la selettività dei singoli modelli e il modo in cui sono collegati tramite variabili condivise. Inoltre, se la query contiene modelli più complessi come sottoquery o complessi OPTIONAL or MINUS blocchiFILTERs, il motore di query Neptune li riordina ove possibile, con l'obiettivo di un ordine di valutazione efficiente.

Per richieste più complesse, l'ordine nel quale Neptune sceglie di valutare la query potrebbe non essere sempre ottimale. Ad esempio, è possibile che Neptune non consideri caratteristiche specifiche dei dati dell'istanza (come la possibilità di raggiungere nodi di potenza nel grafo) che emergono durante la valutazione delle query.

Se conosci le caratteristiche esatte dei dati e desideri indicare manualmente l'ordine di esecuzione della query, utilizza l'hint di query Neptune joinOrder per specificare che la query deve essere valutata nell'ordine specificato.

joinOrderSPARQLsintassi hint

Il suggerimento per la joinOrder query è specificato come un triplo schema incluso in una query. SPARQL

Per chiarezza, la sintassi seguente utilizza un prefisso hint definito e incluso nella query per specificare lo spazio dei nomi dell'hint di query Neptune:

PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> scope hint:joinOrder "Ordered" .
Ambiti disponibili
  • hint:Query

  • hint:Group

Per ulteriori informazioni sugli ambiti dei suggerimenti di query, consulta Ambito dei suggerimenti di SPARQL interrogazione in Neptune.

joinOrderSPARQLesempio di suggerimento

Questa sezione mostra una query scritta con e senza l'hint di query joinOrder e le ottimizzazioni correlate.

Per questo esempio si presuppone che il set di dati contenga quanto segue:

  • Una sola persona di nome John che :likes 1000 persone, inclusa Jane.

  • Una sola persona di nome Jane che :likes 10 persone, incluso John.

Nessun hint di query

La seguente SPARQL query estrae tutte le coppie di persone nominate John e Jane che si piacciono entrambe da un set di dati di social network:

PREFIX : <https://example.com/> SELECT ?john ?jane { ?person1 :name "Jane" . ?person1 :likes ?person2 . ?person2 :name "John" . ?person2 :likes ?person1 . }

Il motore di query Neptune può valutare le istruzioni in un ordine diverso rispetto a quello scritto. Ad esempio, potrebbe scegliere di valutare nel seguente ordine:

  1. Trova tutte le persone di nome John.

  2. Trova tutte le persone collegate a John con un edge :likes.

  3. Filtra questo set in base alle persone di nome Jane.

  4. Filtra questo set in base alle persone collegate a John con un edge :likes.

In base al set di dati, la valutazione in questo ordine comporta l'estrazione di 1.000 entità nel secondo passaggio. Il terzo passaggio limita ulteriormente la valutazione fino al singolo nodo Jane. Il passaggio finale determina che anche Jane ha specificato :likes per il nodo John.

hint di query

Sarebbe preferibile iniziare con il nodo Jane perché ha solo 10 edge :likes in uscita. Ciò riduce la quantità di lavoro durante la valutazione della query evitando l'estrazione delle 1.000 entità durante il secondo passaggio.

L'esempio seguente utilizza il suggerimento alla joinOrderquery per garantire che il Jane nodo e i relativi bordi in uscita vengano elaborati per primi disabilitando tutti i riordini automatici dei join per la query:

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 . }

Uno scenario applicabile del mondo reale potrebbe essere un'applicazione di social network in cui le persone nella rete sono classificate come influencer con molte connessioni o come utenti normali con poche connessioni. In tale scenario, puoi garantire che l'utente normale (Jane) venga elaborato prima dell'influencer (John) in una query come nell'esempio precedente.

hint di query e riordinamento

Puoi eseguire questo esempio per aumentare le tue conoscenze. Se sai che l'attributo :name è univoco per un singolo nodo, puoi velocizzare la query tramite il riordinamento e utilizzando l'hint di query joinOrder. In questo modo, i nodi univoci vengono estratti per primi.

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 questo caso, puoi limitare la query alle seguenti singole operazioni in ciascuna fase:

  1. Trova il nodo della singola persona con :name Jane.

  2. Trova il nodo della singola persona con :name John.

  3. Controlla che il primo nodo sia collegato al secondo con un edge :likes.

  4. Controlla che il secondo nodo sia collegato al primo con un edge :likes.

Importante

Se scegli l'ordine non corretto, l'hint di query joinOrder può causare una notevole riduzione delle prestazioni. Ad esempio, l'esempio precedente sarebbe inefficiente se gli attributi :name non sono univoci. Se tutti i 100 nodi sono stati denominati Jane e tutti i 1.000 nodi sono stati denominati John, la query finirebbe per controllare 1.000 * 100 (100.000) coppie di edge :likes.