martedì 21 luglio 2015

[Neo4j ] Operazione Import in Neo4j

In tutti i Graph Database, di conseguenza anche in Neo4j, la maggior parte delle volte ci si trova a dover creare e gestire dataset di grandi dimensioni.
I formati più utilizzati per questi dataset sono il formato Csv o il formato Json. Concentriamoci sull'import di dati in Neo4j provenienti da file con estensione csv
CSV sta per comma-separeted value e molto semplicemente può essere visto come un file con struttura tabellare con migliaia/milioni di record ed, eventualmente, degli header per identificare i campi di un determinato record.
Per separare i campi di ogni record si possono utilizzare diversi tipi di separatori di linea, come la virgola, il punto e virgola o il carattere di tabulazione.
In questa breve guida vedremo come effettuare l'import di un file csv in Neo4j mediante il comando LOAD CSV

1 Sintassi Comando LOAD CSV

Tale comando ammette queste due sintassi equivalenti, da utilizzare a seconda se il file csv contiene o meno degli Headers:
        1) File CSV senza HEADER
                   LOAD CSV FROM "<URL>" AS line
                   CREATE..........
        2) File CSV con HEADER
                   LOAD CSV WITH HEADERS FROM "<URL>" AS line
                   CREATE........
La stringa URL identifica dove ricercare il file csv.Abbiamo le seguenti possibilità:
  • LOCALE file:///home/utente/file.csv
  • REMOTO http://uri
La costante line(che può essere una costante di qualsiasi tipo a scelta del programmatore) viene utilizzata per effettuare l'iterazione delle righe ed estrarre gli elementi di un singolo record.
Se il file da importare è molto grande, si pone al di sopra del comando LOAD la clausola:
                    USING PERIODIC COMMIT 500
e con esso si specifica di effettuare il commit sul Graph Database dopo aver letto 500 righe.
Vediamo come costruire un database cinematografico come esempio per capire al meglio i comandi.


2) Esempio di Importing


Supponiamo di avere i seguenti file csv da importare:

Eseguiamo allora i seguenti comandi in Neo4j:
  1. LOAD CSV FROM "file:///home/daniele/attori.csv" AS line CREATE (n:ATTORE{id:line[0],nome:line[1],cognome:line[2]}).  Con questa istruzione stiamo dicendo a Neo4j di caricare il file attori.csv e creare, per ogni riga, un nodo ATTORE con proprietà id con valore pari alla prima colonna del file di input, con proprietà nome con valore pari alla seconda colonna del file di input, con proprietà cognome con valore pari alla terza colonna del file di input;
  2. LOAD CSV FROM "file:///home/daniele/titoli.csv" AS line CREATE (n:TITOLO_FILM{titolo:line[0]}).  Con questa istruzione stiamo dicendo a Neo4j di caricare il file titoli.csv e creare, per ogni riga, un nodo TITOLO_FILM con proprietà titolo con valore pari all'unica colonna del file di input;
  3. LOAD CSV FROM "file:///home/daniele/nazioni.csv" AS line CREATE (n:NAZIONE_PRODUZIONE{id:line[0],nazione:line[1]}). Con questa istruzione stiamo dicendo a Neo4j di caricare il file nazioni.csv e creare, per ogni riga, un nodo NAZIONE_PRODUZIONE con proprieta id con valore pari alla prima colonna del file di input e proprieta nazione con valore pari alla seconda colonna del file di input;
  4. LOAD CSV FROM "file:///home/daniele/film.csv" AS line MATCH (a:ATTORE),(n:NAZIONE_PRODUZIONE),(t:TITOLO_FILM) WHERE t.titolo=line[0] AND a.id=line[1] AND n.id=line[2] MERGE (a)-[:PARTECIPA_A]->(t)-[:PRODOTTO_IN]->(n) RETURN n. Importiamo il file film.csv(contenente gli archi che connettono i nodi) e, dopo aver effettuato un matching sui nodi ATTORE che hanno un determinato id e sui nodi NAZIONE_PRODUZIONE con quell'id creiamo due relazioni che connettono una ATTORE a TITOLO_FILM e l'altra TITOLO_FILM a NAZIONE_PRODUZIONE.
Eseguendo tali comandi nell'ordine dato, quello che si ottiene è il grafo rappresentato nell'immagine sottostante.
Augurandovi di esservi stato di aiuto con questo post, ci risentiamo al prossimo post in cui vedremo un altra tecnica basata su codice Java per importare file csv all'interno di Neo4j


Nessun commento:

Posta un commento