Neo4j Workshop – Graf baze podataka
Na nedavno održanom Neo4j workshopu, naš zaposlenik Ivan Tomić održao je radionicu s temom graf baze podataka, s posebnim naglaskom na Neo4j.
Cilj radionice bio je pokazati ključne koncepte, razlike u odnosu na tradicionalne baze podataka, te predstaviti praktične primjere rada s Cypher jezikom.
Razlike između Graf i Relacijske baze podataka
Relacijske baze podataka koriste tabličnu strukturu i dobro su prilagođene podacima s jednostavnim vezama. Graf baze podataka, s druge strane, dizajnirane su za rad s podacima koji su prirodno povezani ili imaju kompliciranu povezanost, kao što su društvene mreže, sustavi za preporuku sadržaja i sl.
Sastoje se od entiteta i veza (odnosa):
Za razliku od relacijskih baza podataka, graf baze podataka mogu direktno pohranjivati podatke u vezama, što omogućava intuitivnije i učinkovitije pretraživanje kompleksnih veza.
ACID principi
Kao i svaki puta kada se razgovara o bazama podataka, važno je spomenuti ACID principe koje i Neo4j prati:
- Atomicity – Svaka transakcija se u potpunosti izvršava ili se vraća na početno stanje u slučaju pogreške
- Consistency – Podaci ostaju validni prema unaprijed definiranim pravilima (npr. NOT NULL, ograničenja tipova podataka) prije i nakon svake transakcije
- Isolation – Transakcije se odvijaju neovisno jedna o drugoj, bez utjecaja na međusobne rezultate
- Durability – Podaci ostaju trajno pohranjeni nakon uspješne transakcije, čak i u slučaju kvara
Cypher Query jezik
U praktičnom dijelu radionice demonstriran je jednostavan primjer modeliranja društvene mreže te upotreba Cypher jezika za pretraživanje i manipulaciju podacima u Neo4j bazi. Cypher omogućava intuitivno kreiranje, ažuriranje i pretraživanje grafova.
U nastavku možete vidjeti jedan jednostavan dio primjera Cypher izraza za izradu i traženje podataka:
// Izrada entiteta User: Ana i Marko
CREATE (a:User {name: 'Ana'}), (b:User {name: 'Marko'})
// Izrada veze između entiteta User: Ana je prijatelj s Markom od 1.10.2024.
CREATE (a)-[:FRIENDS_WITH: {since: datetime("2024-10-01")}]->(b)
// Pretraživanje veza između entiteta User: Tko su Anini prijatelji?
MATCH (a)-[:FRIENDS_WITH]->(b)
RETURN b.name