Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

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

Najczęstsze pytania

Czym jest grafowa baza danych i kiedy jest lepsza od relacyjnej? +
Grafowa baza danych przechowuje dane jako węzły (nodes) i relacje (relationships) między nimi, zamiast tabel i wierszy. Jest lepsza od relacyjnej gdy: (1) dane są ze sobą silnie powiązane (social networks, fraud detection, rekomendacje), (2) często pytasz "jak daleko od A do B przez sieć znajomych/relacji", (3) schemat połączeń jest zmienny i trudny do zamodelowania w tabelach, (4) wykonujesz wielokrotne JOIN-y (relacyjna BD staje się wolna przy 5+ JOIN-ach, grafowa pozostaje szybka). Przykłady: LinkedIn (graph of connections), Netflix (recommendation engine), banki (wykrywanie oszustw przez analizę transakcji). Grafowa baza NIE jest lepsza dla prostych danych tabelarycznych, raportowania czy OLAP — tam PostgreSQL/ClickHouse są odpowiednie.
Co to jest Cypher i jak się różni od SQL? +
Cypher to deklaratywny język zapytań Neo4j, zaprojektowany dla grafów. SQL pyta "które wiersze spełniają warunki", Cypher pyta "jakie wzorce węzłów i relacji istnieją w grafie". Kluczowa różnica: Cypher używa graficznej składni do opisania wzorców — np. (a:User)-[:FOLLOWS]->(b:User) oznacza "użytkownik a obserwuje użytkownika b". Taki wzorzec jest natychmiastowo czytelny dla programisty. W SQL to samo wymagałoby tabeli users, tabeli follows i JOIN. Cypher jest otwarty jako openCypher (ISO GQL) i wspierany przez inne bazy (Amazon Neptune, Memgraph). Kluczowe słowa: MATCH (szukaj wzorca), CREATE (tworz węzły/relacje), WHERE (filtruj), RETURN (zwróć wyniki), MERGE (utwórz jeśli nie istnieje).
Czy Neo4j Community Edition wystarczy dla projektu produkcyjnego? +
Neo4j Community Edition jest open-source (GPL) i ma ograniczenia: brak klastrowania (tylko single-node), brak zaawansowanego monitorowania, brak security features (role-based access control jest podstawowe). Dla małych projektów, startup MVP lub aplikacji gdzie single point of failure jest akceptowalny — Community Edition wystarczy. Gdy potrzebujesz: wysokiej dostępności (klaster Causal Cluster), zaawansowanego RBAC, wsparcia enterprise, szyfrowania danych at rest — potrzebujesz Enterprise Edition (płatna). Neo4j AuraDB to managed cloud (za darmo do 200k węzłów na Free tier, potem płatne). Dla produkcji z krytycznymi danymi rekomendowane jest Enterprise lub AuraDB.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.