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à.
Come vengono elaborate le query Gremlin in Neptune
In Amazon Neptune, attraversamenti più complessi possono essere rappresentati da una serie di modelli che creano una relazione basata sulla definizione di variabili denominate che possono essere condivise tra modelli per creare join. Questo viene mostrato nell'esempio seguente.
Domanda: cos'è il quartiere a due hop del vertice v1
?
Gremlin code: g.V(‘v1’).out('knows').out('knows').path() Pattern: (?1=<v1>, <knows>, ?2, ?) X Pattern(?2, <knows>, ?3, ?) The pattern produces a three-column relation (?1, ?2, ?3) like this: ?1 ?2 ?3 ================ v1 v2 v3 v1 v2 v4 v1 v5 v6
Condividendo la variabile ?2
tra i due modelli (nella posizione O del primo modello e nella posizione S del secondo modello), si crea un join dai primi quartieri hop ai secondi quartieri hop. Ogni soluzione Neptune ha associazioni per le tre variabili denominate, che possono essere utilizzate per ricreare TinkerPopun
Il primo passo nell'elaborazione delle query di Gremlin consiste nell'analizzare la query in un oggetto Traversal, composto da una TinkerPop serie di passaggi. TinkerPop .V()
è sia rappresentato che eseguito da. TinkerPop GraphStep
Poiché questi off-the-shelf TinkerPop passaggi sono eseguibili, un TinkerPop Traversal di questo tipo può eseguire qualsiasi interrogazione Gremlin e produrre la risposta corretta. Tuttavia, se eseguiti su un grafico di grandi dimensioni, TinkerPop i passaggi a volte possono essere molto inefficienti e lenti. Anziché usarle, Neptune cerca di convertire l'attraversamento in un formato dichiarativo composto da gruppi di modelli, come descritto in precedenza.
Neptune non supporta attualmente tutti gli operatori Gremlin (passaggi) nel motore di query nativo. Pertanto, tenta di comprimere il maggior numero di fasi possibili in una singola NeptuneGraphQueryStep
, che contiene il piano di query logico dichiarativo per tutte le fasi che sono state convertite. Idealmente, tutte le fasi vengono convertite. Ma quando viene rilevato un passaggio che non può essere convertito, Neptune interrompe l'esecuzione nativa e rinvia tutta l'esecuzione delle query da quel momento in avanti ai passaggi. TinkerPop Non tenta di intrufolarsi nell'esecuzione nativa.
Dopo che i passaggi vengono tradotte in un piano di query logico, Neptune esegue una serie di ottimizzatori di query che riscrivono il piano di query in base all'analisi statica e alle cardinalità stimate. Questi ottimizzatori eseguono operazioni come riordinare operatori in base a conteggi di intervalli, eliminare operatori superflui o ridondanti, riordinare i filtri, eseguire il push di operatori in gruppi diversi e così via.
Dopo aver prodotto un piano di query ottimizzato, Neptune crea una pipeline di operatori fisici che eseguono il lavoro di esecuzione della query. Ciò include la lettura dei dati dagli indici di dichiarazione, l'esecuzione di join di vari tipi, il filtraggio, l'ordinamento e così via. La pipeline produce un flusso di soluzioni che viene poi riconvertito in un flusso di oggetti Traverser. TinkerPop
Serializzazione dei risultati delle query
Amazon Neptune attualmente si affida ai serializzatori TinkerPop dei messaggi di risposta per convertire i risultati delle query TinkerPop (Traversers) in dati serializzati da inviare via cavo al client. Questi formati di serializzazione tendono a essere piuttosto dettagliati.
Ad esempio, per serializzare il risultato di una query del vertice quale g.V().limit(1)
, il motore di query Neptune deve eseguire una singola ricerca per produrre il risultato della query. Tuttavia, il serializzatore GraphSON
eseguirà un numero elevato di ricerche aggiuntive per creare un pacchetto del vertice nel formato di serializzazione. Deve eseguire una ricerca per ottenere l'etichetta, una per ottenere le chiavi di proprietà e una ricerca per chiave di proprietà per il vertice per ottenere tutti i valori per ogni chiave.
Alcuni dei formati di serializzazione sono più efficienti, ma tutti richiedono ricerche aggiuntive. Inoltre, i TinkerPop serializzatori non cercano di evitare ricerche duplicate, spesso con il risultato che molte ricerche vengono ripetute inutilmente.
Questo rende molto importante scrivere le query in modo da richiedere specificamente solo le informazioni necessarie. Ad esempio, g.V().limit(1).id()
restituisce solo l'ID del vertice ed elimina tutte le ricerche di serializzatore aggiuntive. Gremlin profile API in Neptune consente di vedere quante chiamate di ricerca vengono effettuate durante l'esecuzione della query e durante la serializzazione.