Neo4j — grafowa baza danych: instalacja i Cypher query
Opublikowano: 10 kwietnia 2026 · Kategoria: VPS / Bazy danych
Neo4j to najpopularniejsza grafowa baza danych. Zamiast tabel ze wierszami przechowuje dane jako węzły (nodes) połączone relacjami (relationships). Każdy węzeł i relacja mogą mieć właściwości (properties). To podejście sprawia, że zapytania "znajdź wszystkich znajomych znajomych użytkownika X" lub "wykryj pętle transakcji wskazujące na pranie pieniędzy" są trywialne — zamiast złożonych wielokrotnych JOIN-ów w SQL, Cypher obsługuje te wzorce natywnie i wydajnie. Ten artykuł przeprowadzi Cię przez instalację, podstawy Cypher i typowe zastosowania.
Instalacja — Docker (zalecane) i apt
# === Metoda 1: Docker (najszybsza) === docker run -d \ --name neo4j \ -p 7474:7474 \ # HTTP/Browser UI -p 7687:7687 \ # Bolt protocol (aplikacje) -e NEO4J_AUTH=neo4j/TajneHaslo123 \ -v neo4j-data:/data \ -v neo4j-logs:/logs \ neo4j:5-community # Dostep: http://localhost:7474 (login: neo4j / TajneHaslo123) # === Metoda 2: apt (Ubuntu) === wget -O - https://debian.neo4j.com/neotechnology.gpg.key | \ sudo gpg --dearmor -o /usr/share/keyrings/neo4j.gpg echo 'deb [signed-by=/usr/share/keyrings/neo4j.gpg] https://debian.neo4j.com stable latest' | \ sudo tee /etc/apt/sources.list.d/neo4j.list sudo apt update && sudo apt install -y neo4j # Ustaw haslo sudo neo4j-admin dbms set-initial-password TajneHaslo123 sudo systemctl enable --now neo4j sudo systemctl status neo4j # neo4j.conf - kluczowe ustawienia # server.memory.heap.initial_size=1g # server.memory.heap.max_size=2g # server.memory.pagecache.size=1g # server.default_listen_address=0.0.0.0 # Ostroznie z tym! # Polaczenie przez Cypher Shell cypher-shell -u neo4j -p TajneHaslo123
Cypher — podstawy języka zapytań
// === TWORZENIE DANYCH ===
// Tworzenie wezlow (nodes)
CREATE (alice:User {name: 'Alice', age: 30, city: 'Warsaw'})
CREATE (bob:User {name: 'Bob', age: 25, city: 'Krakow'})
CREATE (charlie:User {name: 'Charlie', age: 35, city: 'Warsaw'})
// Tworzenie relacji
MATCH (a:User {name: 'Alice'}), (b:User {name: 'Bob'})
CREATE (a)-[:FOLLOWS {since: '2024-01-01'}]->(b)
MATCH (a:User {name: 'Alice'}), (b:User {name: 'Charlie'})
CREATE (a)-[:FOLLOWS]->(b)
// MERGE - twórz jesli nie istnieje (upsert)
MERGE (p:Product {id: 'prod-001'})
ON CREATE SET p.name = 'Laptop', p.price = 3999
ON MATCH SET p.updatedAt = timestamp()
// === ZAPYTANIA ===
// Znajdz wszystkich uzytkownikow
MATCH (u:User) RETURN u.name, u.city ORDER BY u.name
// Kogo obserwuje Alice
MATCH (alice:User {name: 'Alice'})-[:FOLLOWS]->(followed:User)
RETURN followed.name
// Wspolni znajomi (friends of friends)
MATCH (alice:User {name: 'Alice'})-[:FOLLOWS]->(mid:User)-[:FOLLOWS]->(fof:User)
WHERE NOT (alice)-[:FOLLOWS]->(fof) AND alice <> fof
RETURN DISTINCT fof.name AS recommendation
// Najdluzsze sciezki (np. fraud detection)
MATCH path = shortestPath(
(a:User {name: 'Alice'})-[:FOLLOWS*..5]->(b:User {name: 'Charlie'})
)
RETURN path, length(path) AS hops Indeksy, constraints i wydajność
// Indeks - przyspiesza wyszukiwanie po wlasciwosci
CREATE INDEX user_name FOR (u:User) ON (u.name)
CREATE INDEX user_city FOR (u:User) ON (u.city)
// Indeks zlozonyz
CREATE INDEX order_date_status FOR (o:Order) ON (o.date, o.status)
// Constraint - unikalne wartosci (tez tworzy indeks)
CREATE CONSTRAINT user_id_unique FOR (u:User) REQUIRE u.id IS UNIQUE
CREATE CONSTRAINT product_sku FOR (p:Product) REQUIRE p.sku IS UNIQUE
// Listowanie indeksow i constraints
SHOW INDEXES
SHOW CONSTRAINTS
// EXPLAIN - plan wykonania zapytania (analiza wydajnosci)
EXPLAIN MATCH (u:User {name: 'Alice'}) RETURN u
// Szukaj: "NodeIndexSeek" (uzyl indeksu) vs "AllNodesScan" (pelny skan)
// PROFILE - szczegolowe metryki
PROFILE MATCH (u:User {name: 'Alice'})-[:FOLLOWS*2]->(fof:User)
RETURN fof.name
// Pokazuje db hits, rows i czas per operator APOC library i import CSV
# Instalacja APOC (Awesome Procedures On Cypher)
# Docker: dodaj do docker run:
# -e NEO4JLABS_PLUGINS='["apoc"]'
# apt: skopiuj apoc jar do plugins/
NEO4J_HOME=/var/lib/neo4j
curl -L https://github.com/neo4j/apoc/releases/latest/download/apoc-5.x-all.jar \
-o ${NEO4J_HOME}/plugins/apoc-5.jar
# Dodaj do neo4j.conf:
# dbms.security.procedures.allowlist=apoc.*
// Import z pliku CSV (neo4j/import/users.csv)
// CSV: id,name,age,city
// 1,Alice,30,Warsaw
LOAD CSV WITH HEADERS FROM 'file:///users.csv' AS row
MERGE (u:User {id: toInteger(row.id)})
SET u.name = row.name,
u.age = toInteger(row.age),
u.city = row.city
// Masowe importowanie przez APOC (duze pliki)
CALL apoc.periodic.iterate(
"LOAD CSV WITH HEADERS FROM 'file:///big-file.csv' AS row RETURN row",
"MERGE (u:User {id: row.id}) SET u += row",
{batchSize: 1000, parallel: false}
)
// Przydatne funkcje APOC
CALL apoc.meta.stats() YIELD labels, relTypesCount // Statystyki grafu
CALL apoc.export.json.all('/tmp/export.json', {}) // Eksport Use cases — kiedy Neo4j się opłaca
| Use case | Neo4j (graf) | PostgreSQL (relacyjna) |
|---|---|---|
| Social network (znajomi znajomych) | Natywny, szybki | Wolny (rekurencyjne CTE) |
| Rekomendacje produktów | Natywny (collaborative filtering) | Możliwy, skomplikowany SQL |
| Wykrywanie oszustw (fraud detection) | Szybki (analiza pętli transakcji) | Wolny (wiele JOIN-ów) |
| Knowledge graph / ontologie | Idealny | Trudny do zamodelowania |
| Prostota danych tabelarycznych | Nadmiarowy | Idealny |
| Transakcje finansowe ACID | Podstawowe ACID | Silne ACID, lepszy |