ABONAMENTE VIDEO REDACȚIA
RO
EN
NOU
Numărul 150
Numărul 149 Numărul 148 Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 12
Abonament PDF

NEO4j Graph Database modelarea datelor interconectate

Iulian Moșneagu
Senior Software Engineer
@Gemini Solutions



PROGRAMARE

Neo4j este o baza de date open-source fondată pe teoria grafurilor, fiind o soluție optimizată pentru a modela și interoga volume mari de date strâns relaționate, reprezentabile prin structuri de tip graf. Dinamismul,creșterea volumului datelor, precum și evolutia continuă a procesării informațiilora impus ieșirea din spațiul bazelor de date relaționale tradiționale și orientarea spre soluții NOSQL.

Neo4j face parte din fenomenul NOSQL încadrându-se încategoria bazelor de date de tip graf. O caracteristică unică a acestora este gradul ridicat de adaptibilitate la modelele reale de date.

NOSQL Stores

Atât în cazul bazelor de date relaționale cât și în cazul unor soluțiiNOSQL (non-graph) procesulde modelare / design trece prin două faze :

  • Definirea conceptelor , a entitățilorși a interacțiunii dintre ele - model logic/real
  • Materializarea modelului logic într-un model fizic/abstract ( Ex. În cazul bazelor de date relaționale schemă)

De cele mai multe ori modelul logic este foarte diferit de modelul fizic. În cadrul unei organizații software în prima fază poate participa orice echipă nu neapărat tehnică(management / sales ) pentru o mai bună definire a cerințelor sau conceptelor.În cea de a doua fază însă are loc abstractizarea modelului logic în funcție de opțiunea de stocare. Astfel gradul de înțelegere al modelului logic scade odată cu creșterea complexității datelor.

Marele avantaj al bazelor de date de tip graf și implicit utilizarea Neo4j este că modelul logic este același cu modelul fizic. Având acest mod de reprezentare uniformă sau astfel spus o reprezentare "human readable" ce oferă un mare grad de flexibilitate , adaptibilitate și expresivitate în modelarea datelor reale.

Acest tip de bază de date permite o abordare iterativă putând fi utilizată cu succes în strategia de development de tip Agile.

Reprezentarea datelor în Neo4J

În Neo4j datele sunt reprezentate prin noduri și relații. Atât nodurile cât și relațiile pot fi avea proprietăți.Relațiile au un rol foarte important în cadrul bazei de date de tip graf pentru că traversarea grafului și implicit manipularea datelor se realizează prin intermediul lor.

O relație implică întotdeauna două noduri, are o direcțieși un tip identificat unic printr-un nume.

În exemplul de mai sus relația "KNOWS" conectează nodurile "Autor 1" cu "Autor 2 " precizând de asemenea proprietatea adițională "since".

Relativ la un nod relațiile se pot clasifica în două tipuri :

  • incoming,
  • outgoing.

Atât proprietățile unui nod cât și cele aleunei relații pot fi indexate pentru îmbunătățirea performanței de traversare a grafului ( similar cu indexarea coloanelor în bazele de date tradiționale ).

Forțând o comparație cu bazele de date tradiționale, vă puteți imagina un nod ca o înregistrare dintr-un tabel, iar o relație ca o înregistrare dintr-un tabel de legătură sau o pereche de coloane din același tabel în cazul unei reprezentări tip denormalizat.

Limbajul de interogare Cypher

Neo4j are propriul limbaj de interogare a datelor organizate în structuri de graf.Este folosit conceptul de "Traversal" prin intermediul căruia se navighează în graf, se indentifică drumurile și implicit se selecteză nodurile pentru rezultatul unei interogări.

Limbajul Cypher este un limbaj de interogare declarativ fiind foarte intuitiv și "human readable", putând fi înțeles cu ușurință chiar și de o persoană non-tehnică.

Unele cuvinte cheie sunt inspirate din SQL cum ar fi: where, order by , limit, skip (echivalentul offset)

Limbajul este alcătuind din următoarele clauze :

  • START - punctul de intrare în graf. Orice interogare în graf are cel puțin un nod de start,
  • MATCH -șablonul pentru căutarea nodurilor și care este legat de nodul de start,
  • WHERE-condițiile de filtrare a nodurilor / relațiilor,
  • RETURN -rezultatul interogării,
  • CREATE -creează noduri sau relații ,
  • DELETE -șterge noduri sau relații,
  • SET -setează proprietăți noduri sau relații,
  • FOREACH -update pe liste de noduri,
  • WITH -împarte interogarea în mai multe părți distincte.

Pentru exemplificare vă propun următorul graf care reprezintă autorii care publică în TSM relaționați după cum urmează :

Graful de mai sus se poate crea cu următoarea instrucțiune Cypher :

CREATE autor1 = { name : "Autor1, worksAt : 
 "Company1" }, 
articol1 = { title : "Articol1" }, articol2= { title
 : "Articol2" }, 	
 
(autor1)-[:Wrote]->(articol1), 
 (autor1)-[:Wrote]->(articol2),
 
revista = { name : "TSM", domain : "IT" , poweredBy:"Gemini Solutions"},
(articol1)-[:Published_in {date:"2013} ]->(revista),
 
autor2 = { name : "Autor2, worksAt : "Company2" }, 
articol3 = { title : "Articol3" }, (autor2)-[:Wrote]->(articol3)},
autor3 = { name : "Autor3, worksAt : "Company3" }, 
articol4 = { title : " Articol4" }, (autor3)-
[:Wrote]->(articol4)} 
(autor2)-[:Knows]->(autor3),
subject1 = { subject : " Spring Framework" }, 
 subject2 = { subject : " NOSQL },
 
subject3 = { subject : " Agile" },subject4 = { subject : " Android"},
(autor1)-[:Interested_in]->(subject1), (autor1)-[:Interested_in]->(subject3), 
(autor2)-[:Interested_in]->(subject2),(autor3)-[:Interested_in]->(subject4);

Cum observați și mai sus crearea nodurilor și a relațiilor este foarte intuitivă și flexibilă.

Exemple de interogări pe graful de mai sus:

 

1.start n=node(*) match n-[:WROTE]->(a) return n, count(a) 
(rezultatul va afisa fiecare autor cu numarul de articolo publicate)
 
2.start magazine=node(*) match magazine<-[:Published_in]-(article)<-[:Wrote]-(author)-[:Interested_in]->(subject) where magazine.name?=""TSM" and subject.subject?="Java" return author.name, article; 	
(rezultatul va afisa toate articolele cu subiectul Java impreuna cu numele autorului)
3.start n=node(*)match n<-[:Published_in]-(article) return count(article)
( rezulatul afiseaza numarul de articolo publicate în TSM)

În cazul în careavem milioane de autori și avem cerința de a adăuga o nouă relație ( ex. RATING între un autor și un articol), trebuie doar adăugată relația și funcționalitatea de a conecta autori cu articole se poate realiza. În cadrul unei baze de date relaționale, operațile de modificare de schema sunt de obicei costisitoare și nu neapărat simple.

Astfel că se poate spune ca modelul evoluează în mod natural odată cu datele reale și cerințele impuse de business.

SpringData și Neo4j

Neo4j expune un API Java foarte variat care permite crearea și manipularea grafurilor.

O alta opțiune este utilizarea platformei REST. Fondatorii Spring Framework au creat un nou modul adresat bazelor de date NOSQL.

Numele lui este String Data și are la bază aceeași abstactizare a interacțiunii cu bazele de date princonceptul "Templates" ( ex. JDBCTemplate) .

Ca analogie, la fel cum interacțiunea cu SQL se realizează prin hibernate, interacțiunea cu Cypher se realizează prin Spring Data Neo4j support.

NUMĂRUL 149 - Development with AI

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects