Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Apache AGE, supportato da Azure HorizonDB, consente l'elaborazione avanzata dei grafi e l'esecuzione di query. Tuttavia, per ottenere prestazioni ottimali delle query è necessaria una strategia ponderata per l'indicizzazione e il caricamento dei dati. Questa guida illustra alcune procedure consigliate basate sui risultati recenti del benchmarking e sulle informazioni tecniche.
Indice in Apache AGE
L'indicizzazione è fondamentale per migliorare le prestazioni delle query, in particolare nei database a grafo.
Comportamento predefinito
Per impostazione predefinita, Apache AGE non crea indici per i grafici appena creati. Ciò richiede la creazione esplicita di indici in base alla natura delle query e del set di dati.
WHERE - clausola
In Apache AGE le query seguenti vengono valutate in modo diverso:
SELECT * FROM cypher('graph_name',
$$
MATCH (n:Customer {Name:'Alice'}) RETURN n
$$)
AS (n agtype);
SELECT * FROM cypher('graph_name',
$$
MATCH (n:Customer) WHERE n.Name='Alice' RETURN n
$$)
AS (n agtype);
Per sfruttare appieno l'indicizzazione, è necessario comprendere quali tipi di indici vengono utilizzati dalle query con e senza una clausola WHERE.
EXPLAIN in Apache AGE
A differenza di SQL standard, la parola chiave EXPLAIN nelle query cypher richiede un formato di query diverso.
SELECT * FROM cypher('graph_name',
$$
EXPLAIN
MATCH (n:Customer)
WHERE n.Name='Alice'
RETURN n
$$)
AS (plan text);
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Seq Scan on "Customer" n (cost=0.00..418.51 rows=43 width=32)
Filter: (agtype_access_operator(VARIADIC ARRAY[properties, '"Name"'::agtype]) = '"Alice"'::agtype)
Per visualizzare le differenze dei piani di query senza clausola WHERE:
SELECT * FROM cypher('graph_name',
$$
MATCH (n:Customer {Name:'Alice'}) RETURN n
$$)
AS (n agtype);
QUERY PLAN
---------------------------------------------------------------
Seq Scan on "Customer" n (cost=0.00..396.56 rows=9 width=32)
Filter: (properties @> '{"Name": "Alice"}'::agtype)
Tipi di indice comuni
- Indice BTREE: efficace per le corrispondenze esatte e le query di intervallo. Raccomandato per l'utilizzo con colonne come ID, start_id e end_id nelle tabelle di archi e vertici.
- Indice GIN: utile per i campi JSON, consentendo ricerche efficienti di coppie chiave-valore nella colonna delle proprietà.
Usare i comandi seguenti per creare indici per le tabelle dei vertici e dei bordi:
Tabella dei vertici
CREATE INDEX ON graph_name."VLABEL" USING BTREE (id); CREATE INDEX ON graph_name."VLABEL" USING GIN (properties);Tabella Edge:
CREATE INDEX ON graph_name."ELABEL" USING BTREE (id); CREATE INDEX ON graph_name."ELABEL" USING GIN (properties);CREATE INDEX ON graph_name."ELABEL" USING BTREE (start_id); CREATE INDEX ON graph_name."ELABEL" USING BTREE (end_id);
Indicizzare un valore chiave specifico nelle proprietà
Per le query di destinazione, è possibile creare un indice BTREE più piccolo ed efficiente per chiavi specifiche all'interno della colonna delle proprietà:
CREATE INDEX ON graph_name.label_name USING BTREE (agtype_access_operator(VARIADIC ARRAY[properties, '"KeyName"'::agtype]));
Questo approccio evita l'indicizzazione di dati non necessari, migliorando l'efficienza.
Informazioni dettagliate sui piani di query con EXPLAIN
La parola chiave EXPLAIN rivela il modo in cui le query utilizzano gli indici. Non tutte le query usano automaticamente gli indici, in particolare quelli emessi senza una clausola WHERE. Usare EXPLAIN per verificare l'utilizzo dell'indice e ottimizzare le query di conseguenza.
Osservazioni di benchmark
I test recenti evidenziano l'impatto dell'indicizzazione sulle prestazioni delle query.
Query indicizzate e non indicizzate
In questa sezione vengono illustrate le differenze di prestazioni tra query indicizzate e non indicizzate.
- Le scansioni sequenziali superano le scansioni degli indici per le query che recuperano intere tabelle.
- L'indicizzazione migliora significativamente le prestazioni per le query di join, ad esempio i conteggi delle relazioni.
Procedure consigliate per il caricamento dei dati
Il caricamento efficiente dei dati è fondamentale per set di dati di grandi dimensioni.
La libreria AGEFreighter offre un processo semplificato per l'inserimento dei dati.
Caricamento dei dati con AGEFreighter
AGEFreighter è una libreria Python progettata per facilitare il caricamento dei dati in Apache AGE. Supporta vari formati di dati, tra cui CSV, Avro e Parquet, e offre una semplice interfaccia per il caricamento dei dati nei grafici AGE.
Configurazione dell'ambiente
- Creare un'istanza di Azure HorizonDB con AGE abilitata.
- È consigliabile usare lo strumento di gestione delle dipendenze Python, ad esempio Poetry. Python 3.9 o versione successiva deve essere installato.
- La libreria AGEFreighter (AGEFreighter PyPi) deve essere installata come dipendenza:
poetry add agefreighter
Usare il formato di dati CSV per i benchmark
Per i benchmark, viene usato un file CSV per caricare i dati in AGE. Il formato CSV è ampiamente supportato e facile da usare, rendendolo una scelta ottimale per le attività di caricamento dei dati.
Poiché il set di dati è costituito da casi legali e relazioni tra di essi, il file CSV di input è strutturato come segue:
id,CaseID,start_vertex_type,end_CaseID,end_vertex_type
1,1005631,Case,5030916,Case
2,1005631,Case,5028652,Case
3,1005631,Case,996512,Case
4,1005631,Case,3413065,Case
5,1005631,Case,4912975,Case
Ogni riga rappresenta una relazione tra due case. CaseID fa riferimento al nodo case iniziale, mentre end_CaseID fa riferimento al caso connesso.
Usare lo script di caricamento dei dati per i benchmark
Lo script di Python seguente è stato usato per caricare il set di dati in AGE. È anche possibile fare riferimento alla sezione "Utilizzo di CSVFreighter" in AGEFreighter PyPi per un esempio diverso.
await instance.load(
graph_name="CaseGraphFull",
start_v_label="Case",
start_id="CaseID",
start_props=[],
edge_type="REF",
edge_props=[],
end_v_label="Case",
end_id="end_CaseID",
end_props=[],
csv_path="./cases.csv",
use_copy=True,
drop_graph=True,
create_graph=True,
progress=True,
)
Come si può notare, il graph_name e i campi nel file CSV fornito sono definiti qui. Il parametro use_copy=True garantisce un caricamento efficiente dei dati. I parametri drop_graph=True e create_graph=True assicurano un nuovo inizio prima di caricare nuovi dati.
Altre origini dati
AGEFreighter supporta altri formati, ad esempio MultiCSV, Avro, Parquet e Archiviazione di Azure, che possono essere adattati in base ai requisiti di formato dei dati. Per altre informazioni, vedere AGEFreighter in PyPI.
Benchmark delle prestazioni per il caricamento dei dati
- Dimensioni del set di dati: 725.000 case, relazioni di 2,8 MILIONI.
- Tempo di caricamento: 83 secondi.
Il caricamento efficiente dei dati è essenziale per gestire in modo efficace set di dati di grandi dimensioni.
Note
Anche se adatto per file di grandi dimensioni, questo processo potrebbe essere meno efficace per i set di dati più piccoli a causa del tempo di preparazione.