L’installazione di Neo4j è rapida e richiede poco spazio su disco rispetto ad altri database.
Per prima cosa bisogna scaricare Neo4j dal sito ufficiale, selezionando il pacchetto adatto al sistema operativo su cui operiamo: Windows o Linux.
Installazione su Windows
Per Windows, la procedura è molto semplice: basta lanciare l’eseguibile, accettare la licenza e scegliere il percorso di installazione:
A questo punto si può lanciare Neo4j, che mostrerà questa finestra:
Non dobbiamo far altro che scegliere il percorso in cui si troveranno i file del database e premere Start. Dopo qualche secondo apparirà un link da aprire nel browser per accedere alla console web, generalmente http://localhost:7474/.
Installazione su Linux
Se lavoriamo su Linux, prima cosa bisogna scompattare il pacchetto destinato a questo sistema operativo nel percorso dove si vuole installare Neo4j:
tar -xf neo4j-community-versione-unix.tar.gz
L’eseguibile si trova nella sottocartella bin:
bin/neo4j start
A questo punto il server è in ascolto, pronto per l'uso.
Primi passi
Aprendo il browser sulla URL http://localhost:7474/, ci verrà mostrato il Neo4j Browser:
Si tratta di un'interfaccia web che permette di interagire con il
server inviando comandi o query Cypher, il linguaggio creato appositamente
per Neo4j a cui abbiamo accennato in precedenza.
Per prima cosa possiamo creare un nodo. Nel prompt (la casella che appare
in alto nel Neo4j Browser), inseriamo:
CREATE (:Utente { username: 'htmluser@html.it', password: 'A4_2j4=' })
In questo caso il nodo contiene due proprietà. Se il server risponde con un
messaggio simile al seguente, significa che la transazione è stata eseguita
con successo:
Added 1 label, created 1 node, set 2 properties, statement executed in 64 ms.
L’istruzione CREATE
che abbiamo appena visto permette di creare non solo i nodi, ma anche le relazioni. Vediamo un esempio:
CREATE (:Utente { username: 'verdi@html.it'})-[:ISCRITTO_A{scadenza: '2016-10-08'}]->(:Corso {nome: 'Corso di Neo4j'})
Questa istruzione crea 2 nodi e una relazione. Il primo nodo con etichetta Utente, il secondo con etichetta Corso. La relazione di tipo ISCRITTO_A viene creata dal primo al secondo nodo (è necessario indicare un verso alla relazione).
Ora possiamo interrogare il database, per richiedere gli utenti iscritti al corso con scadenza in un certo anno:
MATCH (u)-[i:ISCRITTO_A]->(:Corso {nome: 'Corso di Neo4j'}) WHERE i.scadenza < '2017' RETURN u,i
In questo esempio l’istruzione MATCH
, che
vedremo dettagliatamente in seguito, permette di effettuare query
utilizzando il pattern matching. In questo caso si cerca
un pattern formato da qualsiasi nodo u collegato tramite una
relazione i di tipo ISCRITTO_A ad un nodo avente
un’etichetta Corso e la proprietà nome impostata al valore
indicato. Inoltre, tramite la clausola WHERE
viene
specificato un ulteriore filtraggio. La clausola
RETURN
specifica cosa restituire
dall’interrogazione.
La risposta sarà l’elenco di nodi che corrispondono alla ricerca. Se
passiamo alla visualizzazione grafica, tramite l’apposito pulsante Graph, il browser mostrerà quanto segue:
L’istruzione MATCH
si può combinare con l’istruzione CREATE
(e alle altre istruzioni che vedremo in seguito) per effettuare modifiche a porzioni di grafo:
MATCH (u)-[i:ISCRITTO_A]->(c:Corso {nome: 'Corso di Neo4j'}) WHERE i.scadenza < '2017'
CREATE (u)-[:LEGGE]->(l:Libro { titolo: 'Neo4j Cookbook' })
SET i.inizio = '2016-01-01'
In questo caso abbiamo creato un nodo con etichetta Libro e
abbiamo aggiunto una relazione tra esso e tutti gli utenti trovati con il
pattern matching. Inoltre, con l’istruzione SET
,
abbiamo impostato una proprietà con nome inizio nella
relazione i. Se la proprietà non esiste verrà automaticamente creata, altrimenti
sarà sovrascritta.
La cancellazione di un nodo o di una relazione si effettua con l’istruzione
DELETE
. In questo caso, stiamo cancellando tutte
le relazioni di tipo LEGGE con il libro creato prima:
MATCH (u)-[i:LEGGE]->(l:Libro { titolo: 'Neo4j Cookbook' })
DELETE i
Cancellare i nodi senza cancellare le sue eventuali relazioni con altri
nodi provoca un errore di tipo ConstraintViolationTransactionFailureException:
MATCH (u:Utente { username: 'verdi@html.it' })
DELETE u
In tal caso bisogna eliminare le relazioni o prima di eliminare il nodo (come abbiamo visto nell’esempio precedente) oppure contestualmente, come vedremo più avanti, con l’istruzione OPTIONAL MATCH
.