Zdokonaľte optimalizáciu dopytov v Neo4j pre rýchlejší výkon grafovej databázy. Naučte sa osvedčené postupy v Cypher, indexovanie, profilovanie a pokročilé techniky.
Grafové databázy: Optimalizácia dopytov v Neo4j – Komplexný sprievodca
Grafové databázy, najmä Neo4j, sa stávajú čoraz populárnejšími pre správu a analýzu prepojených dát. Avšak s rastúcimi objemami dát sa efektívne vykonávanie dopytov stáva kľúčovým. Tento sprievodca poskytuje komplexný prehľad techník optimalizácie dopytov v Neo4j, čo vám umožní vytvárať vysokovýkonné grafové aplikácie.
Pochopenie dôležitosti optimalizácie dopytov
Bez správnej optimalizácie sa dopyty v Neo4j môžu stať pomalými a náročnými na zdroje, čo ovplyvňuje výkon a škálovateľnosť aplikácie. Optimalizácia zahŕňa kombináciu porozumenia vykonávaniu dopytov v jazyku Cypher, využívania stratégií indexovania a používania nástrojov na profilovanie výkonu. Cieľom je minimalizovať čas vykonania a spotrebu zdrojov pri súčasnom zabezpečení presných výsledkov.
Prečo na optimalizácii dopytov záleží
- Zlepšený výkon: Rýchlejšie vykonávanie dopytov vedie k lepšej odozve aplikácie a pozitívnejšej používateľskej skúsenosti.
- Znížená spotreba zdrojov: Optimalizované dopyty spotrebúvajú menej cyklov CPU, pamäte a diskových I/O operácií, čím sa znižujú náklady na infraštruktúru.
- Zlepšená škálovateľnosť: Efektívne dopyty umožňujú vašej databáze Neo4j spracovávať väčšie objemy dát a vyššiu záťaž dopytov bez zníženia výkonu.
- Lepšia súbežnosť (Concurrency): Optimalizované dopyty minimalizujú konflikty pri zamykaní a súperenie o zdroje, čím sa zlepšuje súbežnosť a priepustnosť.
Základy dopytovacieho jazyka Cypher
Cypher je deklaratívny dopytovací jazyk Neo4j, navrhnutý na vyjadrovanie grafových vzorov a vzťahov. Porozumenie jazyku Cypher je prvým krokom k efektívnej optimalizácii dopytov.
Základná syntax jazyka Cypher
Tu je stručný prehľad základných prvkov syntaxe jazyka Cypher:
- Uzly (Nodes): Reprezentujú entity v grafe. Uzatvárajú sa do okrúhlych zátvoriek:
(node)
. - Vzťahy (Relationships): Reprezentujú spojenia medzi uzlami. Uzatvárajú sa do hranatých zátvoriek a spájajú sa pomlčkami a šípkami:
-[relationship]->
alebo<-[relationship]-
alebo-[relationship]-
. - Štítky (Labels): Kategorizujú uzly. Pridávajú sa za premennú uzla:
(node:Label)
. - Vlastnosti (Properties): Páry kľúč-hodnota priradené k uzlom a vzťahom:
{property: 'value'}
. - Kľúčové slová (Keywords): Ako napríklad
MATCH
,WHERE
,RETURN
,CREATE
,DELETE
,SET
,MERGE
, atď.
Bežné klauzuly v jazyku Cypher
- MATCH: Používa sa na hľadanie vzorov v grafe.
MATCH (a:Person)-[:FRIENDS_WITH]->(b:Person) WHERE a.name = 'Alice' RETURN b
- WHERE: Filtruje výsledky na základe podmienok.
MATCH (n:Product) WHERE n.price > 100 RETURN n
- RETURN: Špecifikuje, aké dáta sa majú z dopytu vrátiť.
MATCH (n:City) RETURN n.name, n.population
- CREATE: Vytvára nové uzly a vzťahy.
CREATE (n:Person {name: 'Bob', age: 30})
- DELETE: Odstraňuje uzly a vzťahy.
MATCH (n:OldNode) DELETE n
- SET: Aktualizuje vlastnosti uzlov a vzťahov.
MATCH (n:Product {name: 'Laptop'}) SET n.price = 1200
- MERGE: Buď nájde existujúci uzol alebo vzťah, alebo vytvorí nový, ak neexistuje. Užitočné pre idempotentné operácie.
MERGE (n:Country {name: 'Germany'})
- WITH: Umožňuje reťaziť viacero klauzúl
MATCH
a prenášať medzivýsledky.MATCH (a:Person)-[:FRIENDS_WITH]->(b:Person) WITH a, count(b) AS friendsCount WHERE friendsCount > 5 RETURN a.name, friendsCount
- ORDER BY: Zoraďuje výsledky.
MATCH (n:Movie) RETURN n ORDER BY n.title
- LIMIT: Obmedzuje počet vrátených výsledkov.
MATCH (n:User) RETURN n LIMIT 10
- SKIP: Preskočí zadaný počet výsledkov.
MATCH (n:Product) RETURN n SKIP 5 LIMIT 10
- UNION/UNION ALL: Kombinuje výsledky viacerých dopytov.
MATCH (n:Movie) WHERE n.genre = 'Action' RETURN n.title UNION ALL MATCH (n:Movie) WHERE n.genre = 'Comedy' RETURN n.title
- CALL: Vykonáva uložené procedúry alebo používateľom definované funkcie.
CALL db.index.fulltext.createNodeIndex("PersonNameIndex", ["Person"], ["name"])
Plán vykonávania dopytov v Neo4j
Pochopenie toho, ako Neo4j vykonáva dopyty, je kľúčové pre optimalizáciu. Neo4j používa plán vykonávania dopytov na určenie optimálneho spôsobu získavania a spracovania dát. Plán vykonávania si môžete pozrieť pomocou príkazov EXPLAIN
a PROFILE
.
EXPLAIN vs. PROFILE
- EXPLAIN: Zobrazí logický plán vykonávania bez skutočného spustenia dopytu. Pomáha pochopiť kroky, ktoré Neo4j podnikne na vykonanie dopytu.
- PROFILE: Spustí dopyt a poskytne podrobné štatistiky o pláne vykonávania, vrátane počtu spracovaných riadkov, prístupov do databázy (database hits) a času vykonania každého kroku. Je to neoceniteľné pri identifikácii výkonnostných problémov.
Interpretácia plánu vykonávania
Plán vykonávania pozostáva zo série operátorov, z ktorých každý vykonáva špecifickú úlohu. Medzi bežné operátory patria:
- NodeByLabelScan: Prehľadáva všetky uzly s konkrétnym štítkom.
- IndexSeek: Používa index na nájdenie uzlov na základe hodnôt vlastností.
- Expand(All): Prechádza vzťahmi na nájdenie pripojených uzlov.
- Filter: Aplikuje podmienku filtra na výsledky.
- Projection: Vyberá špecifické vlastnosti z výsledkov.
- Sort: Zoraďuje výsledky.
- Limit: Obmedzuje počet výsledkov.
Analýza plánu vykonávania môže odhaliť neefektívne operácie, ako sú úplné prehľadávanie uzlov (full node scans) alebo zbytočné filtrovanie, ktoré je možné optimalizovať.
Príklad: Analýza plánu vykonávania
Zvážte nasledujúci dopyt v jazyku Cypher:
EXPLAIN MATCH (p:Person {name: 'Alice'})-[:FRIENDS_WITH]->(f:Person) RETURN f.name
Výstup EXPLAIN
môže ukázať NodeByLabelScan
nasledovaný Expand(All)
. To naznačuje, že Neo4j prehľadáva všetky uzly Person
, aby našiel 'Alice', predtým ako prejde vzťahmi FRIENDS_WITH
. Bez indexu na vlastnosti name
je to neefektívne.
PROFILE MATCH (p:Person {name: 'Alice'})-[:FRIENDS_WITH]->(f:Person) RETURN f.name
Spustenie PROFILE
poskytne štatistiky vykonávania, ktoré odhalia počet prístupov do databázy a čas strávený pri každej operácii, čo ďalej potvrdí úzke hrdlo.
Stratégie indexovania
Indexy sú kľúčové pre optimalizáciu výkonu dopytov, pretože umožňujú Neo4j rýchlo nájsť uzly a vzťahy na základe hodnôt vlastností. Bez indexov sa Neo4j často uchýli k úplnému prehľadávaniu, čo je pri veľkých objemoch dát pomalé.
Typy indexov v Neo4j
- B-tree indexy: Štandardný typ indexu, vhodný pre dopyty na rovnosť a rozsah. Vytvárajú sa automaticky pre unikátne obmedzenia (unique constraints) alebo manuálne pomocou príkazu
CREATE INDEX
. - Fulltextové indexy: Navrhnuté na vyhľadávanie v textových dátach pomocou kľúčových slov a fráz. Vytvárajú sa pomocou procedúry
db.index.fulltext.createNodeIndex
alebodb.index.fulltext.createRelationshipIndex
. - Bodové indexy (Point Indexes): Optimalizované pre priestorové dáta, umožňujúce efektívne dopytovanie na základe geografických súradníc. Vytvárajú sa pomocou procedúry
db.index.point.createNodeIndex
alebodb.index.point.createRelationshipIndex
. - Rozsahové indexy (Range Indexes): Špeciálne optimalizované pre dopyty na rozsah, ktoré ponúkajú zlepšenie výkonu oproti B-tree indexom pre určité typy záťaže. Dostupné v Neo4j 5.7 a novších verziách.
Vytváranie a správa indexov
Indexy môžete vytvárať pomocou príkazov v jazyku Cypher:
B-tree index:
CREATE INDEX PersonName FOR (n:Person) ON (n.name)
Zložený index (Composite Index):
CREATE INDEX PersonNameAge FOR (n:Person) ON (n.name, n.age)
Fulltextový index:
CALL db.index.fulltext.createNodeIndex("PersonNameIndex", ["Person"], ["name"])
Bodový index (Point Index):
CALL db.index.point.createNodeIndex("LocationIndex", ["Venue"], ["latitude", "longitude"], {spatial.wgs-84: true})
Existujúce indexy môžete zobraziť pomocou príkazu SHOW INDEXES
:
SHOW INDEXES
A indexy môžete odstrániť pomocou príkazu DROP INDEX
:
DROP INDEX PersonName
Osvedčené postupy pre indexovanie
- Indexujte často dopytované vlastnosti: Identifikujte vlastnosti používané v klauzulách
WHERE
a vzorochMATCH
. - Používajte zložené indexy pre viacero vlastností: Ak často dopytujete na základe viacerých vlastností naraz, vytvorte zložený index.
- Vyhnite sa nadmernému indexovaniu: Príliš veľa indexov môže spomaliť operácie zápisu. Indexujte iba tie vlastnosti, ktoré sa skutočne používajú v dopytoch.
- Zvážte kardinalitu vlastností: Indexy sú efektívnejšie pre vlastnosti s vysokou kardinalitou (t.j. s mnohými jedinečnými hodnotami).
- Monitorujte používanie indexov: Používajte príkaz
PROFILE
na kontrolu, či vaše dopyty používajú indexy. - Pravidelne prebudovávajte indexy: Časom sa indexy môžu stať fragmentovanými. Ich prebudovanie môže zlepšiť výkon.
Príklad: Indexovanie pre výkon
Zvážte graf sociálnej siete s uzlami Person
a vzťahmi FRIENDS_WITH
. Ak často dopytujete priateľov konkrétnej osoby podľa mena, vytvorenie indexu na vlastnosti name
uzla Person
môže výrazne zlepšiť výkon.
CREATE INDEX PersonName FOR (n:Person) ON (n.name)
Po vytvorení indexu sa nasledujúci dopyt vykoná oveľa rýchlejšie:
MATCH (p:Person {name: 'Alice'})-[:FRIENDS_WITH]->(f:Person) RETURN f.name
Použitie PROFILE
pred a po vytvorení indexu preukáže zlepšenie výkonu.
Techniky optimalizácie dopytov v jazyku Cypher
Okrem indexovania existuje niekoľko techník optimalizácie dopytov v jazyku Cypher, ktoré môžu zlepšiť výkon.
1. Použitie správneho vzoru MATCH
Poradie prvkov vo vašom vzore MATCH
môže výrazne ovplyvniť výkon. Začnite s najselektívnejšími kritériami, aby ste znížili počet uzlov a vzťahov, ktoré je potrebné spracovať.
Neefektívne:
MATCH (a)-[:RELATED_TO]->(b:Product) WHERE b.category = 'Electronics' AND a.city = 'London' RETURN a, b
Optimalizované:
MATCH (b:Product {category: 'Electronics'})<-[:RELATED_TO]-(a {city: 'London'}) RETURN a, b
V optimalizovanej verzii začíname s uzlom Product
s vlastnosťou category
, čo je pravdepodobne selektívnejšie ako prehľadávanie všetkých uzlov a následné filtrovanie podľa mesta.
2. Minimalizácia prenosu dát
Vyhnite sa vracaniu nepotrebných dát. V klauzule RETURN
vyberajte iba tie vlastnosti, ktoré potrebujete.
Neefektívne:
MATCH (n:User {country: 'USA'}) RETURN n
Optimalizované:
MATCH (n:User {country: 'USA'}) RETURN n.name, n.email
Vrátenie iba vlastností name
a email
znižuje množstvo prenášaných dát, čím sa zlepšuje výkon.
3. Použitie WITH pre medzivýsledky
Klauzula WITH
umožňuje reťaziť viacero klauzúl MATCH
a prenášať medzivýsledky. To môže byť užitočné na rozdelenie zložitých dopytov na menšie a lepšie spravovateľné kroky.
Príklad: Nájdite všetky produkty, ktoré sa často nakupujú spolu.
MATCH (o:Order)-[:CONTAINS]->(p:Product)
WITH o, collect(p) AS products
WHERE size(products) > 1
UNWIND products AS product1
UNWIND products AS product2
WHERE id(product1) < id(product2)
WITH product1, product2, count(*) AS co_purchases
ORDER BY co_purchases DESC
LIMIT 10
RETURN product1.name, product2.name, co_purchases
Klauzula WITH
nám umožňuje zozbierať produkty v každej objednávke, filtrovať objednávky s viac ako jedným produktom a potom nájsť spoločné nákupy medzi rôznymi produktmi.
4. Využitie parametrizovaných dopytov
Parametrizované dopyty zabraňujú útokom typu Cypher injection a zlepšujú výkon tým, že umožňujú Neo4j opätovne použiť plán vykonávania dopytu. Používajte parametre namiesto priameho vkladania hodnôt do reťazca dopytu.
Príklad (s použitím Neo4j driverov):
session.run("MATCH (n:Person {name: $name}) RETURN n", {name: 'Alice'})
Tu je $name
parameter, ktorý sa odovzdáva dopytu. To umožňuje Neo4j uložiť plán vykonávania dopytu do medzipamäte a opätovne ho použiť pre rôzne hodnoty name
.
5. Vyhýbanie sa karteziánskym súčinom
Karteziánske súčiny vznikajú, keď máte v dopyte viacero nezávislých klauzúl MATCH
. To môže viesť k vytvoreniu veľkého počtu zbytočných kombinácií, čo môže výrazne spomaliť vykonávanie dopytu. Uistite sa, že vaše klauzuly MATCH
sú navzájom prepojené.
Neefektívne:
MATCH (a:Person {city: 'London'})
MATCH (b:Product {category: 'Electronics'})
RETURN a, b
Optimalizované (ak existuje vzťah medzi Person a Product):
MATCH (a:Person {city: 'London'})-[:PURCHASED]->(b:Product {category: 'Electronics'})
RETURN a, b
V optimalizovanej verzii používame vzťah (PURCHASED
) na prepojenie uzlov Person
a Product
, čím sa vyhneme karteziánskemu súčinu.
6. Použitie procedúr a funkcií APOC
Knižnica APOC (Awesome Procedures On Cypher) poskytuje zbierku užitočných procedúr a funkcií, ktoré môžu rozšíriť možnosti jazyka Cypher a zlepšiť výkon. APOC obsahuje funkcionality pre import/export dát, refaktorovanie grafu a ďalšie.
Príklad: Použitie apoc.periodic.iterate
na dávkové spracovanie
CALL apoc.periodic.iterate(
"MATCH (n:OldNode) RETURN n",
"CREATE (newNode:NewNode) SET newNode = n.properties WITH n DELETE n",
{batchSize: 1000, parallel: true}
)
Tento príklad ukazuje použitie apoc.periodic.iterate
na migráciu dát z OldNode
do NewNode
v dávkach. Je to oveľa efektívnejšie ako spracovanie všetkých uzlov v jednej transakcii.
7. Zváženie konfigurácie databázy
Konfigurácia Neo4j môže tiež ovplyvniť výkon dopytov. Medzi kľúčové konfigurácie patria:
- Veľkosť haldy (Heap Size): Priraďte Neo4j dostatočnú pamäť haldy. Použite nastavenie
dbms.memory.heap.max_size
. - Stránková vyrovnávacia pamäť (Page Cache): Stránková vyrovnávacia pamäť ukladá často používané dáta do pamäte. Zvýšte jej veľkosť (
dbms.memory.pagecache.size
) pre lepší výkon. - Zapisovanie transakcií (Transaction Logging): Upravte nastavenia zapisovania transakcií na vyváženie výkonu a trvanlivosti dát.
Pokročilé techniky optimalizácie
Pre zložité grafové aplikácie môžu byť potrebné pokročilejšie techniky optimalizácie.
1. Modelovanie grafových dát
Spôsob, akým modelujete svoje grafové dáta, môže mať významný vplyv na výkon dopytov. Zvážte nasledujúce princípy:
- Vyberte správne typy uzlov a vzťahov: Navrhnite schému grafu tak, aby odrážala vzťahy a entity vo vašej dátovej doméne.
- Používajte štítky efektívne: Používajte štítky na kategorizáciu uzlov a vzťahov. To umožňuje Neo4j rýchlo filtrovať uzly na základe ich typu.
- Vyhnite sa nadmernému používaniu vlastností: Aj keď sú vlastnosti užitočné, ich nadmerné používanie môže spomaliť výkon dopytov. Zvážte použitie vzťahov na reprezentáciu dát, ktoré sa často dopytujú.
- Denormalizujte dáta: V niektorých prípadoch môže denormalizácia dát zlepšiť výkon dopytov znížením potreby spájania. Buďte si však vedomí redundancie a konzistencie dát.
2. Použitie uložených procedúr a používateľom definovaných funkcií
Uložené procedúry a používateľom definované funkcie (UDF) vám umožňujú zapuzdriť zložitú logiku a spustiť ju priamo v databáze Neo4j. To môže zlepšiť výkon znížením sieťovej réžie a umožnením Neo4j optimalizovať vykonávanie kódu.
Príklad (vytvorenie UDF v Jave):
@Procedure(name = "custom.distance", mode = Mode.READ)
@Description("Calculates the distance between two points on Earth.")
public Double distance(@Name("lat1") Double lat1, @Name("lon1") Double lon1,
@Name("lat2") Double lat2, @Name("lon2") Double lon2) {
// Implementation of the distance calculation
return calculateDistance(lat1, lon1, lat2, lon2);
}
Potom môžete zavolať UDF z jazyka Cypher:
RETURN custom.distance(34.0522, -118.2437, 40.7128, -74.0060) AS distance
3. Využitie grafových algoritmov
Neo4j poskytuje vstavanú podporu pre rôzne grafové algoritmy, ako sú PageRank, najkratšia cesta a detekcia komunít. Tieto algoritmy sa dajú použiť na analýzu vzťahov a extrakciu poznatkov z vašich grafových dát.
Príklad: Výpočet PageRank
CALL algo.pageRank.stream('Person', 'FRIENDS_WITH', {iterations:20, dampingFactor:0.85})
YIELD nodeId, score
RETURN nodeId, score
ORDER BY score DESC
LIMIT 10
4. Monitorovanie a ladenie výkonu
Neustále monitorujte výkon vašej databázy Neo4j a identifikujte oblasti na zlepšenie. Použite nasledujúce nástroje a techniky:
- Neo4j Browser: Poskytuje grafické rozhranie na vykonávanie dopytov a analýzu výkonu.
- Neo4j Bloom: Nástroj na prieskum grafov, ktorý vám umožňuje vizualizovať a interagovať s vašimi grafovými dátami.
- Neo4j Monitoring: Monitorujte kľúčové metriky, ako sú čas vykonávania dopytov, využitie CPU, využitie pamäte a diskové I/O.
- Záznamy (Logs) Neo4j: Analyzujte záznamy Neo4j na prítomnosť chýb a varovaní.
- Pravidelne kontrolujte a optimalizujte dopyty: Identifikujte pomalé dopyty a aplikujte optimalizačné techniky opísané v tomto sprievodcovi.
Príklady z reálneho sveta
Pozrime sa na niekoľko príkladov optimalizácie dopytov v Neo4j z reálneho sveta.
1. Odporúčací systém pre e-commerce
E-commerce platforma používa Neo4j na vytvorenie odporúčacieho systému. Graf sa skladá z uzlov User
, Product
a vzťahov PURCHASED
. Platforma chce odporúčať produkty, ktoré sa často nakupujú spolu.
Pôvodný dopyt (pomalý):
MATCH (u:User)-[:PURCHASED]->(p1:Product), (u)-[:PURCHASED]->(p2:Product)
WHERE p1 <> p2
RETURN p1.name, p2.name, count(*) AS co_purchases
ORDER BY co_purchases DESC
LIMIT 10
Optimalizovaný dopyt (rýchly):
MATCH (o:Order)-[:CONTAINS]->(p:Product)
WITH o, collect(p) AS products
WHERE size(products) > 1
UNWIND products AS product1
UNWIND products AS product2
WHERE id(product1) < id(product2)
WITH product1, product2, count(*) AS co_purchases
ORDER BY co_purchases DESC
LIMIT 10
RETURN product1.name, product2.name, co_purchases
V optimalizovanom dopyte používame klauzulu WITH
na zozbieranie produktov v každej objednávke a potom nájdeme spoločné nákupy medzi rôznymi produktmi. Je to oveľa efektívnejšie ako pôvodný dopyt, ktorý vytvára karteziánsky súčin medzi všetkými zakúpenými produktmi.
2. Analýza sociálnej siete
Sociálna sieť používa Neo4j na analýzu spojení medzi používateľmi. Graf sa skladá z uzlov Person
a vzťahov FRIENDS_WITH
. Platforma chce nájsť influencerov v sieti.
Pôvodný dopyt (pomalý):
MATCH (p:Person)-[:FRIENDS_WITH]->(f:Person)
RETURN p.name, count(f) AS friends_count
ORDER BY friends_count DESC
LIMIT 10
Optimalizovaný dopyt (rýchly):
MATCH (p:Person)
RETURN p.name, size((p)-[:FRIENDS_WITH]->()) AS friends_count
ORDER BY friends_count DESC
LIMIT 10
V optimalizovanom dopyte používame funkciu size()
na priame spočítanie počtu priateľov. Je to efektívnejšie ako pôvodný dopyt, ktorý vyžaduje prechádzanie všetkých vzťahov FRIENDS_WITH
.
Okrem toho, vytvorenie indexu na štítku Person
zrýchli počiatočné vyhľadávanie uzlov:
CREATE INDEX PersonLabel FOR (p:Person) ON (p)
3. Vyhľadávanie v grafe znalostí
Graf znalostí používa Neo4j na ukladanie informácií o rôznych entitách a ich vzťahoch. Platforma chce poskytnúť vyhľadávacie rozhranie na nájdenie súvisiacich entít.
Pôvodný dopyt (pomalý):
MATCH (e1)-[:RELATED_TO*]->(e2)
WHERE e1.name = 'Neo4j'
RETURN e2.name
Optimalizovaný dopyt (rýchly):
MATCH (e1 {name: 'Neo4j'})-[:RELATED_TO*1..3]->(e2)
RETURN e2.name
V optimalizovanom dopyte špecifikujeme hĺbku prechádzania vzťahov (*1..3
), čo obmedzuje počet vzťahov, ktoré je potrebné prejsť. Je to efektívnejšie ako pôvodný dopyt, ktorý prechádza všetkými možnými vzťahmi.
Ďalej, použitie fulltextového indexu na vlastnosti `name` by mohlo zrýchliť počiatočné vyhľadávanie uzlov:
CALL db.index.fulltext.createNodeIndex("EntityNameIndex", ["Entity"], ["name"])
Záver
Optimalizácia dopytov v Neo4j je nevyhnutná pre budovanie vysokovýkonných grafových aplikácií. Porozumením vykonávania dopytov v jazyku Cypher, využívaním stratégií indexovania, používaním nástrojov na profilovanie výkonu a aplikovaním rôznych optimalizačných techník môžete výrazne zlepšiť rýchlosť a efektivitu vašich dopytov. Nezabudnite neustále monitorovať výkon vašej databázy a prispôsobovať svoje optimalizačné stratégie podľa vývoja vašich dát a záťaže dopytov. Tento sprievodca poskytuje pevný základ pre zvládnutie optimalizácie dopytov v Neo4j a budovanie škálovateľných a výkonných grafových aplikácií.
Implementáciou týchto techník môžete zabezpečiť, že vaša grafová databáza Neo4j bude poskytovať optimálny výkon a stane sa cenným zdrojom pre vašu organizáciu.