Obsah článku / Contents
Neo4j: Prečo sú vzťahy dôležitejšie ako dáta samotné

Neo4j: Svet, kde vzťahy hrajú hlavnú rolu

Väčšina z nás, ktorí pracujeme s dátami, sme vyrastali na relačních databázach (SQL). Tabuľky, riadky, stĺpce, JOINy – to je náš denný chlieb. Ale čo ak vám poviem, že existuje svet, kde tento model zlyháva a kde vzťahy medzi dátami sú dôležitejšie ako dáta samotné? Vitajte vo svete grafových databáz a ich kráľa, Neo4j.

Problém: Relačná databáza a komplexné vzťahy

Predstavte si, že budujete sociálnu sieť. Potrebujete odpovedať na zdanlivo jednoduchú otázku: "Ukáž mi priateľov mojich priateľov, ktorí žijú v Bratislave."

V SQL by to vyzeralo asi takto:

sql
SELECT p3.*
FROM People p1
JOIN Friends f1 ON p1.id = f1.person1_id
JOIN People p2 ON f1.person2_id = p2.id
JOIN Friends f2 ON p2.id = f2.person1_id
JOIN People p3 ON f2.person2_id = p3.id
WHERE p1.name = 'Ondrej'
  AND p3.city = 'Bratislava'
  AND p3.id != p1.id; -- Nechceme zobraziť samého seba

Toto je len pre "priateľov priateľov". Čo ak by sme chceli "priateľov priateľov priateľov"? Počet JOIN operácií by exponenciálne rástol, query by sa stalo pomalé a nečitateľné. Relačné databázy jednoducho nie sú navrhnuté na prechádzanie hlbokých a zložitých vzťahov.

Riešenie: Grafový model a Neo4j

Neo4j pristupuje k problému inak. Namiesto tabuliek používa jednoduchý, ale extrémne silný model:

1

Nodes (Uzly):

Reprezentujú entity (napr. Person, City, Company). Môžu mať vlastnosti (properties) ako meno, vek, atď.
2

typované

Reprezentujú spojenie medzi uzlami. Vzťahy sú (majú smer) a (napr. FRIENDS_WITH, LIVES_IN, WORKS_FOR). Aj vzťahy môžu mať vlastnosti (napr. since: 2020).

Ako vyzerá naša sociálna sieť v Neo4j?

Namiesto tabuliek si predstavte toto:

  • Uzol (p1:Person {name: 'Ondrej'})
  • Uzol (p2:Person {name: 'Jana'})
  • Vzťah (p1)-[:FRIENDS_WITH]->(p2)

Je to intuitívne a presne tak, ako by ste si to nakreslili na tabuľu.

Cypher: Jazyk, ktorý rozumie vzťahom

Neo4j má vlastný dopytovací jazyk Cypher, ktorý je navrhnutý tak, aby bol čitateľný a aby pripomínal vizuálnu reprezentáciu grafu.

Pozrime sa na našu pôvodnú otázku: "Ukáž mi priateľov mojich priateľov, ktorí žijú v Bratislave."

cypher
MATCH (me:Person {name: 'Ondrej'})-[:FRIENDS_WITH*2]->(friend_of_friend:Person)
WHERE friend_of_friend.city = 'Bratislava'
RETURN friend_of_friend.name

Analýza Cypher query:

  • MATCH: Špecifikuje vzor, ktorý hľadáme v grafe.
  • (me:Person {name: 'Ondrej'}): Nájdi uzol typu Person s menom 'Ondrej' a priraď ho do premennej me.
  • -[:FRIENDS_WITH*2]->: Toto je kúzlo. Hľadáme vzťah typu FRIENDS_WITH s hĺbkou presne 2. To znamená "priateľ priateľa". Ak by sme chceli ľubovoľnú hĺbku, použili by sme *.
  • (friend_of_friend:Person): Výsledný uzol priradíme do premennej friend_of_friend.
  • WHERE: Filtrujeme výsledky.
  • RETURN: Vrátime mená nájdených osôb.

Query je kratšia, čitateľnejšia a hlavne výrazne rýchlejšia pre tento typ operácie, pretože Neo4j je optimalizovaný na prechádzanie vzťahov (tzv. "index-free adjacency").

Kedy použiť Neo4j? Typické prípady použitia

Grafové databázy nie sú náhradou za všetky ostatné databázy, ale excelujú v špecifických doménach:

1

Sociálne siete:

Analýza komunít, odporúčanie priateľov, influencer marketing.
2

Recommendation Engines:

"Zákazníci, ktorí si kúpili toto, si kúpili aj..." je klasický grafový problém.
cypher
MATCH (customer:Customer {id: 'user123'})-[:BOUGHT]->(p:Product)<-[:BOUGHT]-(other:Customer)-[:BOUGHT]->(recommended:Product)
WHERE NOT (customer)-[:BOUGHT]->(recommended)
RETURN recommended, count(*) AS frequency
ORDER BY frequency DESC
LIMIT 10
3

Fraud Detection (Detekcia podvodov):

Hľadanie podozrivých vzorcov, napr. viacero "rôznych" účtov používajúcich tú istú kreditnú kartu alebo IP adresu.
cypher
MATCH (c1:Customer)-[:USED]->(card:CreditCard)<-[:USED]-(c2:Customer)
WHERE c1 <> c2
RETURN c1, c2, card
4

Network and IT Operations:

Mapovanie závislostí v sieti, analýza dopadu výpadku jedného komponentu.
5

Knowledge Graphs:

Organizácia komplexných dát, ako napríklad prepojenie liekov, chorôb, proteínov a symptómov v medicíne. Toto je základ pre pokročilé RAG systémy.

Sila Neo4j a AI: GraphRAG

Jedným z najmodernejších využití Neo4j je v oblasti GraphRAG (Graph Retrieval-Augmented Generation). Namiesto hľadania v nestruktúrovaných textoch (ako v tradičnom RAG), LLM kladie otázky priamo do Knowledge Graphu v Neo4j.

Workflow:

  1. Používateľ položí otázku: "Ktorí zamestnanci pracovali na projekte 'X' a majú skúsenosti s Pythonom?"
  2. LLM preloží túto otázku do Cypher query.
  3. Query sa spustí nad Neo4j databázou, ktorá obsahuje dáta o zamestnancoch, projektoch a ich zručnostiach.
  4. Neo4j vráti presné, štruktúrované dáta.
  5. LLM sformuluje odpoveď na základe týchto dát.

Výsledok je presnejší, rýchlejší a menej náchylný na halucinácie, pretože odpoveď je ukotvená v štruktúrovaných faktoch z grafu.

Záver

Neo4j a grafové databázy nie sú len buzzword. Sú to silné nástroje, ktoré otvárajú dvere k riešeniu problémov, ktoré boli v relačnom svete príliš zložité alebo pomalé. Ak vo vašej doméne hrajú hlavnú rolu vzťahy, prepojenia a siete, je najvyšší čas prestať trápiť SQL a dať šancu grafom. Možno zistíte, že pohľad na dáta cez optiku vzťahov vám odhalí úplne nové dimenzie.

Všetky články