Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica Elaborato finale in Basi di Dati Graph Database Anno Accademico 2012/2013 Candidato: MARCO DE MASI matr. N46000365 Indice Introduzione 4 Capitolo 1. Graph Database: Cosa sono. 5 1.1 1.2 1.3 1.4 Classificazione dei database NoSQL Teoria dei grafi applicata al graph database Nascita ed utilizzo del graph database Caratteristiche del graph database 5 6 8 9 Capitolo 2. Differenze tra database relazionale e a grafo. 2.1 2.2 2.3 2.4 12 Relationship nei database relazionali e a grafo Differenze tra query con esempio Confronto tra efficienze con esempio Confronto tra modellazione relazionale e a grafo 12 14 15 16 Capitolo 3. Progetti di graph database. Neo4j e Cypher. 3.1 3.2 3.3 3.4 3.5 20 Introduzione a Neo4j Neo4j: un database completamente transazionale Query in Neo4j Cypher per le query sui grafi Esempio con Cypher 20 20 22 24 27 Bibliografia Ringraziamenti 29 30 III Graph Database Introduzione In Informatica il termine database o base di dati (a volte abbreviato con DB) indica una collezione di dati, in cui le informazioni sono organizzate in modo tale da consentire la gestione dei dati stessi attraverso i cosiddetti query language, che ne permettono la ricerca, l’inserimento, la cancellazione, l’aggiornamento, ecc. grazie a particolari applicazioni software dedicate chiamate DBMS (DataBase Management System), che si basano su un’architettura di tipo Client/Server. Una base di dati può avere una diversa struttura a seconda del particolare modello logico, di seguito elencati in ordine cronologico: 1) gerarchico (rappresentato da un albero, anni sessanta); 2) reticolare (rappresentato da un grafo, anni sessanta); 3) relazionale (rappresentato da tabelle e relazioni tra esse, anni settanta); 4) ad oggetti (estensione del paradigma “Object-Oriented” della programmazione a oggetti, anni ottanta); Il modello relazionale è attualmente il più diffuso modello, anche se negli ultimi anni sono stati progettati nuovi sistemi al fine di ottenere elevate prestazioni nelle operazioni di lettura e scrittura sui database. In particolare sono stati ripresi strumenti del modello reticolare che hanno consentito lo sviluppo dei Graph Database (Basi di dati a grafo). 4 Graph Database Capitolo 1 Graph Database: Cosa sono. 1.1 Classificazione dei database NoSQL Il modello relazionale ha dominato fin dagli anni ’80 con implementazioni come Oracle e MySQL, con la diffusione dei RDBMS (Relational Database Management System). Negli ultimi anni però si è verificato un numero crescente di casi d’uso in cui il database relazionale ha portato problemi sia nella modellazione dei dati che nella scalabilità orizzontale su più server con grandi quantità di dati. Ciò ha portato allo sviluppo di nuove tecnologie per risolvere questi problemi che hanno consentito la creazione di progetti di database riconosciuti col nome di database NoSQL; in realtà il concetto è più antico dei RDBMS, ed è quindi tornato di moda recentemente. SQL (Structured Query Language) è il linguaggio standardizzato per database basati sul modello relazionale, in contrapposizione a esso si usa la terminologia NoSQL. Il termine NoSQL (acronimo di “Not Only SQL”) viene utilizzato generalmente per indicare i database che non usano un modello relazionale, anche se non riflette accuratamente la natura dei suoi database poiché fornisce l’errata impressione che il suo concetto sia riferito a SQL. I moderni database non relazionali hanno registrato un notevole sviluppo negli ultimi anni e sono basati su alcuni punti: 5 Graph Database - sono distribuiti; - sono open-source; - puntano a scalare orizzontalmente. Essi tipicamente non richiedono uno schema fisso (schemaless), evitano le operazioni di unione (join), non garantiscono le caratteristiche di Atomicità, Coerenza, Isolamento e Durabilità (ACID), permettono di gestire grandi quantità di dati. Il motivo per cui oggi si sono diffusi è che permettono di gestire dati che col tempo sono cresciuti enormemente in complessità, sia come dimensione che per interconnessioni. Le principali categorie di database NoSQL sono: - Key-Value stores; - Column Family stores; - Document Databases; - Graph Databases. 1.2 Teoria dei grafi applicata al graph database Il modello relazionale utilizza tabelle, il database orientato al documento utilizza documenti, ecc., mentre il database a grafo usa nodi e archi per rappresentare e archiviare l'informazione. Quindi un graph database memorizza i dati in un grafo, che rappresenta la più generica delle strutture dati, capace di rappresentare elegantemente ogni tipo di dato. Quando si parla di modelli dei dati basati su grafo è inevitabile fare riferimento alla teoria dei grafi. In matematica, in informatica e nella geometria combinatoria, la teoria dei grafi si occupa di studiare i grafi, cioè oggetti che consentono di effettuare analisi in termini quantitativi e algoritmici. Un grafo è un insieme di elementi detti nodi o vertici collegati fra loro da archi o lati. 6 Graph Database Più formalmente si dice grafo una coppia ordina G = (V,E), dove V è l’insieme dei nodi ed E è l’insieme degli archi. Un arco è una coppia (a,b) di vertici, con a∈V e b∈V. Esempio: Questo tipo di struttura permette di modellare ogni tipo di scenario. In questo caso ogni nodo rappresenta un’entità (per esempio una persona o un’attività commerciale) e ogni arco rappresenta una relationship tra due nodi. La variante più conosciuta di modello a grafo è rappresentato dal modello property graph, che presenta le seguenti caratteristiche: - contiene nodi e relationship; - i nodi contengono proprietà attraverso coppie chiave-valore, dove “chiave” è la stringa identificativa della proprietà, “valore” dipende invece dal tipo di dato; - le relationship sono espresse da un nome (una label) e collegano due nodi in modo diretto (da un nodo iniziale a uno finale); - anche le relationship possono contenere proprietà; La direzione e la label delle relationship aggiungono semantica alla struttura. La maggior parte delle persone trova il property graph model intuitivo e facile da comprendere, e può descrivere la stragrande maggioranza dei casi d’uso. Esso risulta essere il modello di grafo più utilizzato. 7 Graph Database 1.3 Nascita ed utilizzo del graph database I graph database nacquero con l’idea di ricollocare la semantica dell’SQL tabellare attraverso un modello dei dati a grafo che avrebbe semplificato il lavoro degli sviluppatori, dimezzando il tempo normalmente richiesto per i classici database. Originariamente l’idea era quella di conservare tutte le caratteristiche del database relazionale (transazioni, ACID, trigger, ecc.). Negli ultimi anni ci sono stati enormi cambiamenti che riguardano soprattutto Google, Facebook e Twitter, che infatti utilizzano i grafi al centro del loro business; Facebook per esempio fu fondato con l’idea che oltre alle informazioni discrete sulle persone (il loro nome, cosa fanno, ecc.) ci sono anche informazioni sulle relationship tra esse, rappresentando queste informazioni in un social graph; in modo simile Google capì come memorizzare e processare i documenti Web e i collegamenti tra essi, utilizzando il web graph. La relationship è la chiave per stabilire la semantica del contesto. Oggi i grafi sono adottati con successo anche all’esterno del mondo del web, per esempio da compagnie aeree, compagnie logistiche e aziende di servizi finanziari. Le grandi imprese qualche tempo fa crearono tecnologie proprietarie di elaborazione dei grafi. Queste considerazioni portarono alla nascita di nuovi strumenti general-purpose per la gestione dei database, che consentono agli utenti di trarre benefici senza dover costruire la propria infrastruttura a grafo. I graph database risultano essere il miglior modo per rappresentare e interrogare dati connessi, e sono importanti nel business odierno poiché fanno riferimento a relazioni complesse e dinamiche tra questi dati. L’interpretazione e il valore dei dati connessi dipende dalle relazioni tra gli elementi dei dati, quindi spesso si dà un nome alle suddette 8 Graph Database relazioni. Quasi sconosciuti fino a qualche anno fa, i graph database oggi sono fortemente utilizzati in diversi settori tra i quali l’assistenza sanitaria, la vendita al dettaglio, lo sviluppo di giochi ed altro ancora; inoltre hanno aiutato a risolvere importanti problemi riguardanti ad esempio il social networking e la gestione dei dati. Questo incremento dell’uso dei graph database è guidato da due fattori principali: - il grande successo commerciale di compagnie come Facebook, Google e Twitter, le quali hanno concentrato il loro modello di business sulle proprie tecnologie a grafo proprietarie; - l’introduzione di graph database general-purpose. 1.4 Caratteristiche del graph database Un graph database è un database ottimizzato per gestire dati altamente connessi. Essi furono progettati con l’idea che gli sviluppatori creavano delle strutture a grafo per poi memorizzare i dati in forma non naturale nelle tabelle dei database relazionali, o anche in altri database NoSQL, allora si cercò un modo per poter memorizzare questi dati in una struttura che consentisse di conservare la natura dei dati. Un graph database è generalmente costruito per interagire con i sistemi transazionali OLTP (OnLine Transaction Processing), di conseguenza sono ottimizzati per ottenere buone prestazioni transazionali. I modelli di riferimento di implementazione dei graph database sono due: 9 Graph Database - Property Graph Model (già enunciato in precedenza); - Resource Description Framework (RDF) Graph. RDF è il modello di riferimento del Web Semantico. Il passaggio da un modello all’altro è molto intuitivo, per entrambi esistono linguaggi di interrogazione specifici, ma solo per RDF esiste lo standard SPARQL. I modelli prodotti con i graph database sono più semplici e significativi rispetto ai modelli prodotti con i tradizionali database relazionali o con altri database NoSQL. Vantaggi nell’utilizzo dei graph database: - Prestazioni. Uno dei principali vantaggi ottenuti con i graph database, rispetto all’utilizzo dei database relazionali o altri NoSQL, è l’aumento assoluto delle prestazioni quando si ha a che fare con dati connessi. Rispetto ai database relazionali dove le prestazioni delle query diminuiscono all’aumentare dei dati, nel graph database le prestazioni tendono a rimanere costanti anche con l’aumentare dei dati, poiché le query si riferiscono solo ad una porzione del grafo. Come conseguenza di ciò, il tempo di esecuzione per ogni query è proporzionale solo alla dimensione della parte del grafo da attraversare. - Flessibilità. Il grafo è naturalmente additivo, quindi è possibile aggiungere nuove relationship, nuovi nodi e nuovi sottografi a una struttura senza turbare le query esistenti e le funzionalità. L’additività dei grafi permette di eseguire minori migrazioni, riducendo l’overhead della manutenzione e i rischi. 10 Graph Database - Agilità (Efficacia risposta ai cambiamenti). I moderni graph database forniscono strumenti per ottenere uno sviluppo senza attrito e una buona manutenzione del sistema. In particolare, è possibile sviluppare un’applicazione in modo controllato grazie alla natura dello schema libero del modello a grafo e alla testabilità delle API (Application Programmer Interface) e dei linguaggi query del graph database. Oggi lo sviluppo del graph database si allinea bene con l’agilità, in modo migliore rispetto allo sviluppo del database relazionale, permettendo alle applicazioni di supporto ai graph database di evolvere al passo con i cambiamenti dell’ambiente del business. Per tutti questi motivi quindi il graph database fornisce la miglior rappresentazione per modellare, memorizzare e interrogare dati connessi. 11 Graph Database Capitolo 2 Differenze tra database relazionale e a grafo. 2.1 Relationship nei database relazionali e a grafo - RELATIONSHIP NEI DATABASE RELAZIONALI Per molti decenni, gli sviluppatori hanno provato a sistemare i dati connessi all’interno del database relazionale, che inizialmente erano progettati per codificare figure e tabelle, e subito vennero mostrate difficoltà nel tentativo di modellare le relationship del mondo reale. Le relationship esistono nel mondo del database relazionale, ma solo come rappresentazioni di tabelle accoppiate, spesso si ha la necessità di non avere ambiguità sulla semantica delle relationship che collegano le entità. Se i dati si moltiplicano la loro struttura diventa più complessa e meno uniforme, e il modello relazionale diventa oneroso. Uno dei peggiori svantaggi che si può ottenere nell’utilizzo dei database relazionali è l’aumento delle costose operazioni di join, che ostacola le prestazioni e rende difficile adattare un database esistente in risposta ai cambiamenti del business. Inoltre lo schema tabellare mescola i propri dati con le foreign-key. Esempio di schema relazionale, rappresentazione di un social network: 12 Graph Database Le relazioni semantiche nel database relazionale sono minori rispetto al caso del database a grafo. Quando le query vincolano il numero di righe da considerare in una tabella (ad esempio con la condizione “WHERE”), esse non risultano particolarmente costose e difficili, a differenza di quando le query vanno a considerare tutte le righe della tabella risultando quindi costose; quando si va a considerare join ricorsive, le query diventano computazionalmente e sintatticamente ancora più complesse. - RELATIONSHIP NEI GRAPH DATABASE Quando si ha a che fare con dati connessi ci sono dipendenze semantiche tra le entità. Si vuole una figura completa che includa tutti i collegamenti tra ciascun elemento. Per esempio consideriamo ora il social network: 13 Graph Database Rispetto al modello relazionale ora la rete cresce in espressività, infatti per ogni utente sono mostrate le sue relazioni con altri utenti (nell’esempio si può facilmente osservare come James e Charlie siano sia amici che colleghi). Inoltre la flessibilità del modello a grafo permette di aggiungere nuovi nodi e nuove relationship senza compromettere lo schema esistente o la migrazione dei dati. Quindi il grafo offre maggiori ricchezze rispetto al modello tabellare del database relazionale, inoltre si hanno notevoli vantaggi nelle prestazioni dei graph database quando vengono trattati dati connessi. Naturalmente le relationship in un grafo formano dei path, che vengono coinvolti dal grafo attraverso le query. La maggior parte delle operazioni path-based del graph database risultano estremamente efficienti. 2.2 Differenze tra query con esempio Per i database relazionali è definito lo standard SQL per le query, mentre per i graph database non c’è un linguaggio standard e nell’esempio consideriamo Cypher. Esempio. Selezionare una persona che si chiama “Anakin” da un gruppo di persone: 14 Graph Database Esempio. Trovare tutti gli indirizzi email associati ad una persona di nome “Anakin”: 2.3 Confronto tra efficienze con esempio Il social network rappresenta l’esempio classico per mostrare la maggior efficienza dei graph database rispetto ai relazionali quando si ha a che fare con dati connessi; tutto questo può essere mostrato attraverso un esperimento effettuato per trovare gli amici di amici (fino a profondità 5 di amicizia) in un social network di un milione di persone, ognuna avente circa 50 amici, usando un database relazionale e il graph database Neo4j. L’esperimento produsse i seguenti risultati: A profondità 2 (amici di amici) entrambi i database producono buoni risultati e un utente finale non noterebbe la differenza di ms tra i due, ma a partire da profondità 3 (amici di amici di amici) in poi, il database relazionale presenta query con tempi di esecuzione non ragionevoli rispetto alle query del Neo4j, che presentano un tempo di esecuzione quasi invariato ottenendo un risultato più che soddisfacente. 15 Graph Database 2.4 Confronto tra modellazione relazionale e a grafo Il database relazionale è il più famoso ed utilizzato database, e presenta poche similarità e molte differenze con i database a grafo. Le tecniche di modellazione relazionali richiedono di partire prima dal modello logico per poi arrivare al modello fisico, e queste trasformazioni introducono dissonanze semantiche. Nei graph database questo gap è ridotto, poiché esso presenta una stretta affinità tra modello logico e modello fisico. Esempio di dominio semplificato per la gestione dei dati tramite il supporto di applicazioni che usano diverse infrastrutture, dalle macchine virtuali ai load balancer: 16 Graph Database - MODELLAZIONE RELAZIONALE La fase iniziale di modellazione relazionale è simile a quella di molte altre tecniche di modellazione dei dati, cioè si cerca di capire e concordare le entità del dominio e come queste ultime sono collegate tra loro. Per esprimere questo tipicamente si crea un diagramma come quello nell’esempio precedente, che è un grafo. La fase successiva cattura questi accordi in una forma più rigida creando un diagramma entity-relationship (E-R). Questa trasformazione del modello concettuale in un modello logico usa una notazione più stretta, e non è sempre necessaria (spesso gli utenti non usano questo diagramma E-R intermedio). In riferimento al precedente esempio, si può costruire il seguente diagramma E-R: Si ha ora un modello normalizzato, che ha notevole complessità nella forma di foreign key e tabelle. Il lavoro di progetto non è già completo, infatti i modelli normalizzati relazionali generalmente non sono abbastanza veloci. Per molti sistemi di produzione uno schema normalizzato deve praticamente essere ulteriormente adattato e specializzato, per poter 17 Graph Database essere adattato per il database e non per l’utente, questa tecnica è chiamata denormalizzazione. La denormalizzazione comporta dati duplicati al fine di acquisire maggiore performance. Per esempio un utente ha diversi indirizzi email, che nel modello normalizzato potrebbero essere memorizzati in una tabella EMAIL. Per ridurre le join e i decrementi delle prestazioni dovuti alle join tra due tabelle, è utile porre questi dati nella tabella USER, aggiungendo una o più colonne. Invece in riferimento all’esempio precedente è possibile ottenere: - MODELLAZIONE A GRAFO I database relazionali non rappresentano uno strumento particolarmente buono per supportare rapidi cambiamenti, quindi si ha bisogno di un modello strettamente allineato col dominio, che non sacrifica le prestazioni e che supporta l’evoluzione conservando l’integrità 18 Graph Database dei dati quando è sottoposto a rapidi cambiamenti. Questo modello è il modello a grafo. Le fasi iniziali sono simili a quelle del modello relazionale, tramite abbozzi si descrive il dominio. Dopo, invece di trasformare la rappresentazione a grafo in tabelle, bisogna invece arricchirla per produrre una rappresentazione accurata del dominio. Assicurando la correttezza del modello del dominio implicitamente si migliora il modello a grafo, assicurando che ogni nodo abbia le appropriate proprietà e che sia nel contesto semantico corretto creando relationship con nomi e dirette tra i nodi. In riferimento all’esempio è possibile costruire il seguente modello a grafo: Il prossimo passo consiste nel testare se il modello è adatto per poter eseguire specifiche query, quindi bisogna correggere eventualmente qualche errata decisione di progetto iniziale. Invece i cambiamenti successivi alla struttura del grafo saranno guidati solamente dai cambiamenti del business, e ciò è facilitato grazie alla flessibilità del modello a grafo. 19 Graph Database Capitolo 3 Progetti di graph database. Neo4j e Cypher. 3.1 Introduzione a Neo4j Esistono vari progetti di basi di dati a grafo, tra i più conosciuti sicuramente ci sono Neo4j, InfoGrid, DEX e HyperGraphDB. Neo4j è un database a grafo open source, completamente transazionale, supportato da Neo Technology, utilizza il modello property graph ed è sviluppato interamente in Java. Il Neo4j possiede le seguenti caratteristiche principali: - è intuitivo, poiché usa un modello a grafo per rappresentare i dati; - è affidabile, con transazioni completamente ACID; - è altamente scalabile, fino a diversi miliardi di nodi, relationship e proprietà; - è espressivo, con un potente linguaggio query per il grafo; - è veloce, con un potente traversal framework per query ad altà velocità; - può essere usato sia in modalità server che embedded. 3.2 Neo4j: un database completamente transazionale La gestione delle transazioni è stato il punto più discusso nelle tecnologie NoSQL da quando 20 Graph Database esse hanno iniziato a diffondersi, così i database non relazionali hanno optato per il trade-off degli attributi transazionali (Atomicità, Coerenza, Isolamento, Durabilità), ad esempio alcuni database non relazionali come BigTable e Cassandra optarono per la coerenza trade-off, permettendo così ai clienti di avere la possibilità di leggere dati non aggiornati. Questi approcci risultano adeguati solo in specifici casi d’uso (caching, concorrenza, …) e rappresentano un problema quando si introducono i database non relazionali all’interno di qualche azienda. Gli attributi transazionali furono ideati per i database relazionali e risultano ancora importanti in molti casi d’uso. Neo4j ha adottato un approccio differente rispetto a tutti gli altri database non relazionali, infatti supporta completamente le proprietà ACID: - Atomicità: si possono avvolgere operazioni multiple all’interno di una singola transazione, la transazione è indivisibile (se una delle operazioni fallisce allora fallisce l’intera transazione), non sono ammesse esecuzioni parziali; - Coerenza: quando si scrivono dati nel database, ogni client che accederà al database leggerà gli ultimi dati aggiornati; - Isolamento: le operazioni di una singola transazione saranno isolate l’una dall’altra, così anche le transazioni saranno eseguite in modo isolato; - Durabilità: i dati scritti sul database saranno memorizzati su disco e disponibili dopo il riavvio del database. 21 Graph Database 3.3 Query in Neo4j Riguardo alle operazioni sui dati connessi, Neo4j può eseguire molto più velocemente rispetto ai classici e tradizionali database relazionali. Esso aiuta a modellare e a risolvere problemi in modo più elegante ottenendo una migliore esecuzione, anche quando si lavora con grandi quantità di dati. Si consideri come esempio un social network, dove gli utenti collegati tra loro con le frecce sono amici: Neo4j memorizza i dati come vertici ed archi, che nella terminologia del graph database sono rispettivamente nodi e relationship. Nell’esempio gli utenti sono rappresentati come nodi e le loro amicizie come relationship tra i nodi. C’è una differenza fondamentale tra un database relazionale e un Neo4j nell’interrogazione (query) dei dati, poiché in Neo4j non ci sono tabelle né MySQL con i comandi select e join, quindi le query vengono eseguite diversamente. Neo4j, come tutti i graph database, usa un potente concetto matematico dalla teoria dei grafi per effettuare query, chiamato graph traversal. Esso è uno dei principali strumenti che rende 22 Graph Database Neo4j potente per poter trattare dati di larga scala. I principali metodi per eseguire query su una base di dati a grafo e supportati da Neo4j sono Cypher, Gremlin e Traversal. Il traversal (attraversamento) è un’operazione che percorre un insieme di nodi nel grafo, muovendosi solo tra nodi collegati con le relationship. E’ un’operazione fondamentale per il retrieval dei dati in un grafo. Interrogare i dati attraverso gli attraversamenti porta in considerazione solo i dati richiesti, mantenendo un rendimento prevedibile a prescindere dal numero di dati, senza la necessità di eseguire costose operazioni di raggruppamento sull’intero insieme di dati come avviene con le operazioni di join nei database relazionali. Neo4j fornisce una Traversal API, utilizzata per poter navigare attraverso il grafo. Inoltre è possibile utilizzare REST API o i linguaggi di query Neo4j per attraversare i dati nel grafo. Prima di avviare l’attraversamento, si seleziona un nodo da cui l’attraversamento avrà inizio, dopodiché si esegue l’attraversamento, seguendo tutte le relationship (indicate dalle frecce) e raccogliendo i nodi visitati, così l’attraversamento continua poi il suo viaggio da un nodo a un altro attraverso le relationship che li collegano, fin quando non finisce di eseguire il proprio compito e l’attraversamento termina. In riferimento al precedente esempio di social network, lo scopo può essere quello di visitare solo i nodi che sono di profondità 1 partendo da un nodo iniziale (trovare gli amici dell’utente X), e una volta che questi nodi sono visitati l’attraversamento termina. Quindi indipendentemente dal numero di nodi e di relationship esistenti nel grafo, l'attraversamento visita solo i nodi collegati al nodo di partenza. Si ottiene così l’attraversamento dei seguenti nodi e delle corrispondenti relationship: 23 Graph Database Il vantaggio principale che si può ottenere utilizzando Neo4j è che fornisce ottime prestazioni anche con i dati in larga scala. Infatti passando da un social network di mille persone a uno che ne comprende un milione, l’aumento mille volte maggiore dei dati non influenza in modo significativo le prestazioni del Neo4j, cosa che invece non avviene lavorando con un qualsiasi database relazionale. Ovviamente più sono i nodi da visitare e più è lento l’attraversamento, anche se questo aumento è lineare e non dipende dalle dimensioni totali del grafo. Inoltre l’utilizzo di un graph database Neo4j permette di preservare la struttura naturale a grafo dei dati (con nodi e relationship), migliorando le prestazioni delle query in modo significativo. Le query sono eseguite in modo efficiente grazie alle Neo4j Traversal API. 3.4 Cypher per le query sui grafi Per utilizzare un database ed avere la possibilità di creare, manipolare e interrogare i suoi dati, c’è bisogno di un linguaggio query. A differenza di ciò che avviene nei database relazionali con lo standard SQL, per i database a grafo non c’è un linguaggio standard, allora in questo paragrafo si farà riferimento a Cypher. Oltre ad esso ci sono altri famosi linguaggi query come SPARQL del modello RDF 24 Graph Database (utilizzato nel Web semantico) o anche il linguaggio query path-based Gremlin. Cypher è un linguaggio query dichiarativo che consente di effettuare query espressive ed efficienti e di aggiornare la struttura del grafo (in questo caso si esegue una transazione). E’ uno dei linguaggi query più facili ed utilizzati per descrivere e interrogare i dati nel property graph ed è utilizzato anche in Neo4j. Come la maggior parte dei linguaggi query, Cypher è composto da clausole. Le più semplici query comprendono la clausola START, seguite dalle clausole MATCH e RETURN. A differenza di SQL che opera su insiemi, Cypher lavora prevalentemente sui sotto-grafi. Esempio di query Cypher che usa queste tre clausole per trovare gli amici di un utente chiamato Michael: START MATCH a-node:user(name=’Michael’) (a) – [ :KNOWS ] - > (b) – [ :KNOWS ] - > (c) , (a) – [ :KNOWS ] - > (c) RETURN b, c - START Specifica uno o più punti iniziali (nodi o relationship) nel grafo. Essi sono ottenuti attraverso ricerche di indici o, molto raramente, acceduti direttamente basandosi sugli ID del nodo o della relationship. Nell’esempio si cerca un nodo iniziale, attraverso un indice chiamato ‘user’, con un nome il cui valore è ‘Michael‘. Il valore di ritorno da questa ricerca è legato da un identificatore, nell’esempio chiamato ‘a’, che permette di far riferimento al nodo iniziale. Da un punto di vista SQL, gli identificatori in START sono come i nomi delle tabelle che indicano un insieme di nodi o di relationship. - MATCH Permette a un utente (o a un’applicazione che lavora per lui) di chiedere al database di trovare dati che corrispondono a uno specifico pattern. 25 Graph Database La clausola MATCH evita quindi costose operazioni di join come avviene in SQL. Nell’esempio abbiamo un semplice pattern che rappresenta un caso d’uso di tre amici: Si trattano i dati di interesse usando i caratteri ASCII per rappresentare i nodi e le relationship. La rappresentazione ASCII equivalente in Cypher è: (a) – [ :KNOWS ] - > (b) – [ :KNOWS ] - > (c) , (a) – [ :KNOWS ] - > (c) Questo pattern descrive un path, che comprende tre nodi (uno associato all’identificatore ‘a’, uno a ‘b’ e l’altro a ‘c’), collegati attraverso le relationship ‘KNOWS’. Questo pattern potrebbe teoricamente verificarsi molte volte, infatti con un grande set di utenti ci possono essere molte relationship corrispondenti a questo pattern. I pattern di Cypher seguono molto naturalmente il modo in cui si disegnano i grafi, utilizzando istanze di nodi e relationship. Una query Cypher considera una o più parti del pattern per specificare le locazioni di partenza nel grafo, e allora va sulle parti non considerate per effettuare confronti locali. Le locazioni di partenza sono scoperte principalmente attraverso l’uso di un indice (utilizzato da Neo4j). Con la clausola START si è cercato un nodo reale nel grafo, nell’esempio il nodo che rappresenta ‘Michael’, per poterlo legare all’identificatore ‘a’, il quale effettua la clausola MATCH. Cypher allora confronta (match) il resto del pattern col grafo circostante il punto considerato, e scopre i nodi 26 Graph Database da legare agli altri identificatori. Mentre ‘a’ sarà sempre associato a Michael, ‘b’ e ‘c’ saranno legati a una certa sequenza di nodi a seconda dell’esecuzione della query. - RETURN Questa clausola specifica quali nodi, relationship e proprietà dopo il match dovrebbero essere ritornati. Con riferimento all’esempio, i nodi di interesse sono quelli legati agli identificatori ‘b’ e ‘c’. Altre clausole utilizzate da Cypher sono: - WHERE: fornisce condizioni per filtrare i risultati ottenuti dal match; - CREATE e CREATE UNIQUE: crea nodi e relationship; - DELETE: rimuove nodi, relationship e proprietà; - SET: stabilisce i valori associati alle proprietà; - FOREACH: esegue un’azione di aggiornamento per ogni elemento di una lista; - UNION: unisce i risultati di due o più query; - WITH: divide una query in multiple parti distinte. 3.5 Esempio con Cypher 27 Graph Database Esempio di query che trova un utente chiamato John attraverso un indice e poi attraversa il grafo in cerca di amici di amici di John prima di ritornare sia John che gli amici di amici trovati: Altro esempio: si consideri la lista di utenti (con ID del nodo) e si attraversi il grafo in cerca di altri utenti, ritornando solo quelli che hanno la proprietà ‘name’ che inizia per ‘S’. Quindi Cypher si concentra su COSA recuperare da un grafo e non COME. 28 Graph Database Bibliografia e Sitografia [1] Ian Robinson, Jim Webber, Emil Eifrem 2013 “Graph Databases” [2] Jonas Partner, Aleksa Vukotic, Nicki Watt 2013 “Neo4j in Action” [3] http://www.nosql-database.org/ [4] http://www.neo4j.org/ [5] http://docs.neo4j.org/chunked/milestone/ 29 Ringraziamenti 30