Obvladajte optimizacijo poizvedb v Neo4j za hitrejše delovanje grafovske zbirke podatkov. Spoznajte najboljše prakse Cypher, indeksiranje, profiliranje in napredne metode.
Grafovske zbirke podatkov: Optimizacija poizvedb v Neo4j – Celovit vodnik
Grafovske zbirke podatkov, zlasti Neo4j, so postale vse bolj priljubljene za upravljanje in analizo medsebojno povezanih podatkov. Vendar pa z rastjo naborov podatkov postane učinkovito izvajanje poizvedb ključnega pomena. Ta vodnik ponuja celovit pregled tehnik optimizacije poizvedb v Neo4j, ki vam omogočajo izgradnjo visoko zmogljivih grafovskih aplikacij.
Razumevanje pomena optimizacije poizvedb
Brez ustrezne optimizacije poizvedb lahko poizvedbe v Neo4j postanejo počasne in potratne z viri, kar vpliva na zmogljivost in razširljivost aplikacije. Optimizacija vključuje kombinacijo razumevanja izvajanja poizvedb v jeziku Cypher, uporabe strategij indeksiranja in uporabe orodij za profiliranje zmogljivosti. Cilj je zmanjšati čas izvajanja in porabo virov ob zagotavljanju točnih rezultatov.
Zakaj je optimizacija poizvedb pomembna
- Izboljšana zmogljivost: Hitrejše izvajanje poizvedb vodi do boljše odzivnosti aplikacije in pozitivnejše uporabniške izkušnje.
- Manjša poraba virov: Optimizirane poizvedbe porabijo manj procesorskih ciklov, pomnilnika in diskovnih V/I operacij, kar zmanjšuje stroške infrastrukture.
- Povečana razširljivost: Učinkovite poizvedbe omogočajo vaši zbirki podatkov Neo4j obvladovanje večjih naborov podatkov in večjih obremenitev poizvedb brez poslabšanja zmogljivosti.
- Boljša sočasnost: Optimizirane poizvedbe zmanjšujejo konflikte zaklepanja in tekmovanja za vire, kar izboljšuje sočasnost in prepustnost.
Osnove poizvedovalnega jezika Cypher
Cypher je deklarativni poizvedovalni jezik Neo4j, zasnovan za izražanje grafovskih vzorcev in odnosov. Razumevanje jezika Cypher je prvi korak k učinkoviti optimizaciji poizvedb.
Osnovna sintaksa Cypher
Sledi kratek pregled osnovnih elementov sintakse Cypher:
- Vozlišča: Predstavljajo entitete v grafu. Zapisana so v oklepajih:
(node)
. - Odnosi: Predstavljajo povezave med vozlišči. Zapisani so v oglatih oklepajih in povezani z vezaji ter puščicami:
-[relationship]->
ali<-[relationship]-
ali-[relationship]-
. - Oznake: Kategorizirajo vozlišča. Dodane so za spremenljivko vozlišča:
(node:Label)
. - Lastnosti: Pari ključ-vrednost, povezani z vozlišči in odnosi:
{property: 'value'}
. - Ključne besede: Kot so
MATCH
,WHERE
,RETURN
,CREATE
,DELETE
,SET
,MERGE
itd.
Pogosti stavki v jeziku Cypher
- MATCH: Uporablja se za iskanje vzorcev v grafu.
MATCH (a:Person)-[:FRIENDS_WITH]->(b:Person) WHERE a.name = 'Alice' RETURN b
- WHERE: Filtrira rezultate na podlagi pogojev.
MATCH (n:Product) WHERE n.price > 100 RETURN n
- RETURN: Določa, kateri podatki naj se vrnejo iz poizvedbe.
MATCH (n:City) RETURN n.name, n.population
- CREATE: Ustvarja nova vozlišča in odnose.
CREATE (n:Person {name: 'Bob', age: 30})
- DELETE: Odstranjuje vozlišča in odnose.
MATCH (n:OldNode) DELETE n
- SET: Posodablja lastnosti vozlišč in odnosov.
MATCH (n:Product {name: 'Laptop'}) SET n.price = 1200
- MERGE: Poišče obstoječe vozlišče ali odnos ali ustvari novega, če ne obstaja. Uporabno za idempotentne operacije.
MERGE (n:Country {name: 'Germany'})
- WITH: Omogoča veriženje več stavkov
MATCH
in prenos vmesnih rezultatov.MATCH (a:Person)-[:FRIENDS_WITH]->(b:Person) WITH a, count(b) AS friendsCount WHERE friendsCount > 5 RETURN a.name, friendsCount
- ORDER BY: Ureja rezultate.
MATCH (n:Movie) RETURN n ORDER BY n.title
- LIMIT: Omeji število vrnjenih rezultatov.
MATCH (n:User) RETURN n LIMIT 10
- SKIP: Preskoči določeno število rezultatov.
MATCH (n:Product) RETURN n SKIP 5 LIMIT 10
- UNION/UNION ALL: Združi rezultate več poizvedb.
MATCH (n:Movie) WHERE n.genre = 'Action' RETURN n.title UNION ALL MATCH (n:Movie) WHERE n.genre = 'Comedy' RETURN n.title
- CALL: Izvede shranjene procedure ali uporabniško določene funkcije.
CALL db.index.fulltext.createNodeIndex("PersonNameIndex", ["Person"], ["name"])
Načrt izvajanja poizvedb v Neo4j
Razumevanje, kako Neo4j izvaja poizvedbe, je ključno za optimizacijo. Neo4j uporablja načrt izvajanja poizvedbe, da določi optimalen način za pridobivanje in obdelavo podatkov. Načrt izvajanja si lahko ogledate z ukazoma EXPLAIN
in PROFILE
.
EXPLAIN proti PROFILE
- EXPLAIN: Prikaže logični načrt izvajanja, ne da bi dejansko zagnal poizvedbo. Pomaga razumeti korake, ki jih bo Neo4j izvedel za izvajanje poizvedbe.
- PROFILE: Izvede poizvedbo in zagotovi podrobno statistiko o načrtu izvajanja, vključno s številom obdelanih vrstic, dostopi do baze podatkov in časom izvajanja za vsak korak. To je neprecenljivo za prepoznavanje ozkih grl zmogljivosti.
Razlaga načrta izvajanja
Načrt izvajanja je sestavljen iz niza operatorjev, od katerih vsak opravlja določeno nalogo. Pogosti operatorji vključujejo:
- NodeByLabelScan: Pregleda vsa vozlišča z določeno oznako.
- IndexSeek: Uporabi indeks za iskanje vozlišč na podlagi vrednosti lastnosti.
- Expand(All): Prehaja odnose za iskanje povezanih vozlišč.
- Filter: Uporabi pogoj filtriranja na rezultatih.
- Projection: Izbere določene lastnosti iz rezultatov.
- Sort: Uredi rezultate.
- Limit: Omeji število rezultatov.
Analiza načrta izvajanja lahko razkrije neučinkovite operacije, kot so popolni pregledi vozlišč ali nepotrebno filtriranje, ki jih je mogoče optimizirati.
Primer: Analiza načrta izvajanja
Poglejmo si naslednjo poizvedbo Cypher:
EXPLAIN MATCH (p:Person {name: 'Alice'})-[:FRIENDS_WITH]->(f:Person) RETURN f.name
Rezultat ukaza EXPLAIN
lahko prikaže NodeByLabelScan
, ki mu sledi Expand(All)
. To pomeni, da Neo4j pregleduje vsa vozlišča Person
, da bi našel 'Alice', preden preide na odnose FRIENDS_WITH
. Brez indeksa na lastnosti name
je to neučinkovito.
PROFILE MATCH (p:Person {name: 'Alice'})-[:FRIENDS_WITH]->(f:Person) RETURN f.name
Zagon ukaza PROFILE
bo zagotovil statistiko izvajanja, ki razkrije število dostopov do baze podatkov in čas, porabljen za vsako operacijo, kar dodatno potrdi ozko grlo.
Strategije indeksiranja
Indeksi so ključni za optimizacijo zmogljivosti poizvedb, saj omogočajo Neo4j hitro lociranje vozlišč in odnosov na podlagi vrednosti lastnosti. Brez indeksov se Neo4j pogosto zateče k popolnim pregledom, ki so za velike nabore podatkov počasni.
Vrste indeksov v Neo4j
- Indeksi B-drevesa: Standardna vrsta indeksa, primerna za poizvedbe po enakosti in območju. Ustvarijo se samodejno za omejitve edinstvenosti ali ročno z ukazom
CREATE INDEX
. - Polnotekstovni indeksi: Zasnovani za iskanje po besedilnih podatkih z uporabo ključnih besed in fraz. Ustvarijo se s proceduro
db.index.fulltext.createNodeIndex
alidb.index.fulltext.createRelationshipIndex
. - Točkovni indeksi: Optimizirani za prostorske podatke, omogočajo učinkovito poizvedovanje na podlagi geografskih koordinat. Ustvarijo se s proceduro
db.index.point.createNodeIndex
alidb.index.point.createRelationshipIndex
. - Območni indeksi: Posebej optimizirani za poizvedbe po območju, ki ponujajo izboljšave zmogljivosti v primerjavi z indeksi B-drevesa za določene delovne obremenitve. Na voljo v Neo4j 5.7 in novejših različicah.
Ustvarjanje in upravljanje indeksov
Indekse lahko ustvarite z ukazi Cypher:
Indeks B-drevesa:
CREATE INDEX PersonName FOR (n:Person) ON (n.name)
Sestavljeni indeks:
CREATE INDEX PersonNameAge FOR (n:Person) ON (n.name, n.age)
Polnotekstovni indeks:
CALL db.index.fulltext.createNodeIndex("PersonNameIndex", ["Person"], ["name"])
Točkovni indeks:
CALL db.index.point.createNodeIndex("LocationIndex", ["Venue"], ["latitude", "longitude"], {spatial.wgs-84: true})
Obstoječe indekse lahko prikažete z ukazom SHOW INDEXES
:
SHOW INDEXES
In jih odstranite z ukazom DROP INDEX
:
DROP INDEX PersonName
Najboljše prakse za indeksiranje
- Indeksirajte pogosto poizvedovane lastnosti: Določite lastnosti, uporabljene v stavkih
WHERE
in vzorcihMATCH
. - Uporabite sestavljene indekse za več lastnosti: Če pogosto poizvedujete po več lastnostih hkrati, ustvarite sestavljeni indeks.
- Izogibajte se pretiranemu indeksiranju: Preveč indeksov lahko upočasni operacije pisanja. Indeksirajte samo lastnosti, ki se dejansko uporabljajo v poizvedbah.
- Upoštevajte kardinalnost lastnosti: Indeksi so učinkovitejši za lastnosti z visoko kardinalnostjo (tj. veliko različnimi vrednostmi).
- Spremljajte uporabo indeksov: Uporabite ukaz
PROFILE
, da preverite, ali vaše poizvedbe uporabljajo indekse. - Občasno ponovno zgradite indekse: Sčasoma lahko indeksi postanejo fragmentirani. Njihova ponovna izgradnja lahko izboljša zmogljivost.
Primer: Indeksiranje za zmogljivost
Predstavljajte si graf družbenega omrežja z vozlišči Person
in odnosi FRIENDS_WITH
. Če pogosto iščete prijatelje določene osebe po imenu, lahko ustvarjanje indeksa na lastnosti name
vozlišča Person
znatno izboljša zmogljivost.
CREATE INDEX PersonName FOR (n:Person) ON (n.name)
Po ustvarjanju indeksa se bo naslednja poizvedba izvajala veliko hitreje:
MATCH (p:Person {name: 'Alice'})-[:FRIENDS_WITH]->(f:Person) RETURN f.name
Uporaba ukaza PROFILE
pred in po ustvarjanju indeksa bo pokazala izboljšanje zmogljivosti.
Tehnike optimizacije poizvedb v Cypherju
Poleg indeksiranja lahko zmogljivost izboljšajo tudi številne tehnike optimizacije poizvedb v Cypherju.
1. Uporaba pravilnega vzorca MATCH
Vrstni red elementov v vašem vzorcu MATCH
lahko pomembno vpliva na zmogljivost. Začnite z najbolj selektivnimi merili, da zmanjšate število vozlišč in odnosov, ki jih je treba obdelati.
Neučinkovito:
MATCH (a)-[:RELATED_TO]->(b:Product) WHERE b.category = 'Electronics' AND a.city = 'London' RETURN a, b
Optimizirano:
MATCH (b:Product {category: 'Electronics'})<-[:RELATED_TO]-(a {city: 'London'}) RETURN a, b
V optimizirani različici začnemo z vozliščem Product
z lastnostjo category
, ki je verjetno bolj selektivna kot pregled vseh vozlišč in nato filtriranje po mestu.
2. Zmanjšanje prenosa podatkov
Izogibajte se vračanju nepotrebnih podatkov. V stavku RETURN
izberite samo lastnosti, ki jih potrebujete.
Neučinkovito:
MATCH (n:User {country: 'USA'}) RETURN n
Optimizirano:
MATCH (n:User {country: 'USA'}) RETURN n.name, n.email
Vračanje samo lastnosti name
in email
zmanjša količino prenesenih podatkov in izboljša zmogljivost.
3. Uporaba stavka WITH za vmesne rezultate
Stavek WITH
omogoča veriženje več stavkov MATCH
in prenos vmesnih rezultatov. To je lahko koristno za razčlenitev zapletenih poizvedb na manjše, bolj obvladljive korake.
Primer: Poiščite vse izdelke, ki se pogosto kupujejo skupaj.
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
Stavek WITH
nam omogoča, da zberemo izdelke v vsakem naročilu, filtriramo naročila z več kot enim izdelkom in nato poiščemo skupne nakupe med različnimi izdelki.
4. Uporaba parametriziranih poizvedb
Parametrizirane poizvedbe preprečujejo napade z vbrizgavanjem kode Cypher in izboljšajo zmogljivost, saj omogočajo Neo4j ponovno uporabo načrta izvajanja poizvedbe. Uporabljajte parametre namesto neposrednega vstavljanja vrednosti v niz poizvedbe.
Primer (z uporabo gonilnikov Neo4j):
session.run("MATCH (n:Person {name: $name}) RETURN n", {name: 'Alice'})
Tu je $name
parameter, ki se posreduje poizvedbi. To omogoča Neo4j, da predpomni načrt izvajanja poizvedbe in ga ponovno uporabi za različne vrednosti name
.
5. Izogibanje kartezičnim produktom
Kartezični produkti nastanejo, ko imate v poizvedbi več neodvisnih stavkov MATCH
. To lahko povzroči ustvarjanje velikega števila nepotrebnih kombinacij, kar lahko znatno upočasni izvajanje poizvedbe. Zagotovite, da so vaši stavki MATCH
med seboj povezani.
Neučinkovito:
MATCH (a:Person {city: 'London'})
MATCH (b:Product {category: 'Electronics'})
RETURN a, b
Optimizirano (če obstaja odnos med Person in Product):
MATCH (a:Person {city: 'London'})-[:PURCHASED]->(b:Product {category: 'Electronics'})
RETURN a, b
V optimizirani različici uporabimo odnos (PURCHASED
), da povežemo vozlišči Person
in Product
ter se tako izognemo kartezičnemu produktu.
6. Uporaba procedur in funkcij APOC
Knjižnica APOC (Awesome Procedures On Cypher) ponuja zbirko uporabnih procedur in funkcij, ki lahko izboljšajo zmožnosti jezika Cypher in povečajo zmogljivost. APOC vključuje funkcionalnosti za uvoz/izvoz podatkov, preoblikovanje grafov in še več.
Primer: Uporaba apoc.periodic.iterate
za paketno obdelavo
CALL apoc.periodic.iterate(
"MATCH (n:OldNode) RETURN n",
"CREATE (newNode:NewNode) SET newNode = n.properties WITH n DELETE n",
{batchSize: 1000, parallel: true}
)
Ta primer prikazuje uporabo apoc.periodic.iterate
za migracijo podatkov iz OldNode
v NewNode
v paketih. To je veliko učinkoviteje kot obdelava vseh vozlišč v eni sami transakciji.
7. Upoštevanje konfiguracije zbirke podatkov
Konfiguracija Neo4j lahko vpliva tudi na zmogljivost poizvedb. Ključne konfiguracije vključujejo:
- Velikost kupa (Heap Size): Dodelite dovolj pomnilnika kupa za Neo4j. Uporabite nastavitev
dbms.memory.heap.max_size
. - Predpomnilnik strani (Page Cache): Predpomnilnik strani shranjuje pogosto dostopane podatke v pomnilniku. Povečajte velikost predpomnilnika strani (
dbms.memory.pagecache.size
) za boljšo zmogljivost. - Beleženje transakcij (Transaction Logging): Prilagodite nastavitve beleženja transakcij, da uravnotežite zmogljivost in trajnost podatkov.
Napredne tehnike optimizacije
Za zapletene grafovske aplikacije so lahko potrebne naprednejše tehnike optimizacije.
1. Modeliranje grafovskih podatkov
Način modeliranja grafovskih podatkov lahko pomembno vpliva na zmogljivost poizvedb. Upoštevajte naslednja načela:
- Izberite prave tipe vozlišč in odnosov: Oblikujte svojo shemo grafa tako, da odraža odnose in entitete v vaši podatkovni domeni.
- Učinkovito uporabljajte oznake: Uporabljajte oznake za kategorizacijo vozlišč in odnosov. To omogoča Neo4j hitro filtriranje vozlišč glede na njihov tip.
- Izogibajte se pretirani uporabi lastnosti: Čeprav so lastnosti uporabne, lahko njihova pretirana uporaba upočasni zmogljivost poizvedb. Razmislite o uporabi odnosov za predstavitev podatkov, po katerih se pogosto poizveduje.
- Denormalizirajte podatke: V nekaterih primerih lahko denormalizacija podatkov izboljša zmogljivost poizvedb z zmanjšanjem potrebe po združevanju. Vendar bodite pozorni na redundanco in doslednost podatkov.
2. Uporaba shranjenih procedur in uporabniško določenih funkcij
Shranjene procedure in uporabniško določene funkcije (UDF) vam omogočajo, da zapakirate zapleteno logiko in jo izvedete neposredno v zbirki podatkov Neo4j. To lahko izboljša zmogljivost z zmanjšanjem omrežne obremenitve in omogočanjem Neo4j, da optimizira izvajanje kode.
Primer (ustvarjanje UDF v Javi):
@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);
}
Nato lahko pokličete UDF iz Cypherja:
RETURN custom.distance(34.0522, -118.2437, 40.7128, -74.0060) AS distance
3. Izkoriščanje grafovskih algoritmov
Neo4j ponuja vgrajeno podporo za različne grafovske algoritme, kot so PageRank, najkrajša pot in zaznavanje skupnosti. Te algoritme lahko uporabite za analizo odnosov in pridobivanje vpogledov iz vaših grafovskih podatkov.
Primer: Izračun 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. Spremljanje in uglaševanje zmogljivosti
Nenehno spremljajte zmogljivost vaše zbirke podatkov Neo4j in prepoznavajte področja za izboljšave. Uporabite naslednja orodja in tehnike:
- Neo4j Browser: Zagotavlja grafični vmesnik za izvajanje poizvedb in analizo zmogljivosti.
- Neo4j Bloom: Orodje za raziskovanje grafov, ki omogoča vizualizacijo in interakcijo z vašimi grafovskimi podatki.
- Nadzor Neo4j: Spremljajte ključne metrike, kot so čas izvajanja poizvedb, poraba procesorja, poraba pomnilnika in diskovni V/I.
- Dnevniki Neo4j: Analizirajte dnevnike Neo4j za napake in opozorila.
- Redno pregledujte in optimizirajte poizvedbe: Prepoznajte počasne poizvedbe in uporabite tehnike optimizacije, opisane v tem vodniku.
Primeri iz resničnega sveta
Poglejmo si nekaj primerov optimizacije poizvedb v Neo4j iz resničnega sveta.
1. Priporočilni sistem za e-trgovino
Platforma za e-trgovino uporablja Neo4j za izgradnjo priporočilnega sistema. Graf je sestavljen iz vozlišč User
, Product
in odnosov PURCHASED
. Platforma želi priporočiti izdelke, ki se pogosto kupujejo skupaj.
Začetna poizvedba (počasna):
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
Optimizirana poizvedba (hitra):
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 optimizirani poizvedbi uporabimo stavek WITH
, da zberemo izdelke v vsakem naročilu in nato poiščemo skupne nakupe med različnimi izdelki. To je veliko učinkoviteje od začetne poizvedbe, ki ustvari kartezični produkt med vsemi kupljenimi izdelki.
2. Analiza družbenih omrežij
Družbeno omrežje uporablja Neo4j za analizo povezav med uporabniki. Graf je sestavljen iz vozlišč Person
in odnosov FRIENDS_WITH
. Platforma želi najti vplivneže v omrežju.
Začetna poizvedba (počasna):
MATCH (p:Person)-[:FRIENDS_WITH]->(f:Person)
RETURN p.name, count(f) AS friends_count
ORDER BY friends_count DESC
LIMIT 10
Optimizirana poizvedba (hitra):
MATCH (p:Person)
RETURN p.name, size((p)-[:FRIENDS_WITH]->()) AS friends_count
ORDER BY friends_count DESC
LIMIT 10
V optimizirani poizvedbi uporabimo funkcijo size()
za neposredno štetje števila prijateljev. To je učinkoviteje od začetne poizvedbe, ki zahteva prehajanje vseh odnosov FRIENDS_WITH
.
Dodatno bo ustvarjanje indeksa na oznaki Person
pospešilo začetno iskanje vozlišč:
CREATE INDEX PersonLabel FOR (p:Person) ON (p)
3. Iskanje po grafu znanja
Graf znanja uporablja Neo4j za shranjevanje informacij o različnih entitetah in njihovih odnosih. Platforma želi zagotoviti iskalni vmesnik za iskanje povezanih entitet.
Začetna poizvedba (počasna):
MATCH (e1)-[:RELATED_TO*]->(e2)
WHERE e1.name = 'Neo4j'
RETURN e2.name
Optimizirana poizvedba (hitra):
MATCH (e1 {name: 'Neo4j'})-[:RELATED_TO*1..3]->(e2)
RETURN e2.name
V optimizirani poizvedbi določimo globino prehajanja odnosov (*1..3
), kar omeji število odnosov, ki jih je treba preiti. To je učinkoviteje od začetne poizvedbe, ki preide vse možne odnose.
Poleg tega bi lahko uporaba polnotekstovnega indeksa na lastnosti `name` pospešila začetno iskanje vozlišč:
CALL db.index.fulltext.createNodeIndex("EntityNameIndex", ["Entity"], ["name"])
Zaključek
Optimizacija poizvedb v Neo4j je ključna za izgradnjo visoko zmogljivih grafovskih aplikacij. Z razumevanjem izvajanja poizvedb v Cypherju, uporabo strategij indeksiranja, uporabo orodij za profiliranje zmogljivosti in uporabo različnih tehnik optimizacije lahko znatno izboljšate hitrost in učinkovitost vaših poizvedb. Ne pozabite nenehno spremljati zmogljivosti vaše zbirke podatkov in prilagajati svoje strategije optimizacije, ko se vaši podatki in delovne obremenitve poizvedb razvijajo. Ta vodnik zagotavlja trdne temelje za obvladovanje optimizacije poizvedb v Neo4j in izgradnjo razširljivih ter zmogljivih grafovskih aplikacij.
Z izvajanjem teh tehnik lahko zagotovite, da vaša grafovska zbirka podatkov Neo4j zagotavlja optimalno zmogljivost in predstavlja dragocen vir za vašo organizacijo.