Uploaded by Dule

Neo4j

advertisement
Neo4j
• Web konzola ima podrazumevani port 7474. Na web konzoli mozemo da
pisemo upite, ima zanimljiv interfejs.
• Postoje dva osnovna objekata u sistemu: cvorovi i relacije. I same
relacije tretiramo kao objekte, te zbog toga relacije kao i cvoreve
mozemo da tipiziramo. Tipizaciju cvora radimo odredjivanjem labela
cvorava (labelu mozemo da shvatimo kao odgovor na pitanje “kog je tipa
ovaj cvor”). Labele mozemo da iskorisitmo kasnije kada pokusvamo da
pretrazujemo neo4j bazu. Takodje pomocu labela mozemo da odredimo
domenske entitete.
•
1
Za razliku od drugih sistema neo4j tretira relacije kao objekte, tako da i
cvorovi i labele mogu da imaju svoje karekteristike.
• ID-jeve cvora odredjuje sam neo4j. Mozemo i mi sami to da
implementiramo, ali svakako nije ni bitno ako neo4j to vec moze da uradi
umesto nas.
• Svaka relacije pored objekta moze da ima svoje property-je.
• Sta znaci da relacije mogu da budu tipizirane? To znaci da relacije
mozemo da kreiramo po tipu i da znamo kojom vrstom veze su
medjusobni cvorevi povezani. Taj tip veze nam drzi sementaku veze, a to
samo znacenje veze koristimo kod upita nase graph baze podataka.
• Neo4j razlikuje relacije kod kojih je definisana direktivnost u odnosu na
bidirekcione relacije. Ukoliko kreiramo relaciju prilikom dodavanje veze
izmedju dva cvora mi tada mozemo da odredimo direktivnost te veze.
Ova veza acts_in funckionise u smeru od cvora koji je neki glumac, ka cvoru
koji je film, posledica postavljana direktivnosti kod ove relacije je ta sto
kod pretrage nasih podataka, ako relacija ima direktivnost, mi kod upita
mozemo da je iskoristimo samo na taj nacin. U prevodu, prilikom
pretrage mi mozemo da se krecemo samo od cvora koji je glumac ka
cvorevima koji su film, ne bi mogli da pronadjemo vezu ukoliko bi smo
upit napisali tako da idemo kontra smerom, da smo relaciju napisali bez
ikakve direktivnosti, e tad bi smo mogli da se krecemo u oba smera.
2
• Neo4j ima svoj poseban upitni jezik, I taj upitni jezik se zove cypher.
Cypher je pandan sql-u. Osnova pretrage u ovom upitnom jeziku je
klauzula MATCH, pa na primer:
MATCH (n:Actor) RETURN n LIMIT 25
U prevodu kaze, pronadji mi bilo koji cvor koji je obelezen labelom Actor, pri
cemu ne zelim da nadjem sve glumce, nego samo prvih 25. MATCH u sebi
sadrzi pattern, pattern koji je potrebno pronaci u okviru nase baze
podataka.Svaki taj pattern je predstavljen kao put u nasoj bazi i kada
dobijemo podatke na osnovu pattern-a, mi ih dodatno mozemo filtrirati u
RETURN delu, recimo:
MATCH (n:Actor) RETURN n.name LIMIT 25,
sada za sve cvorove n koje smo nasli, vratiti njihova imena.
• Na koj nacin se dodaju podaci u neo4j bazi?
Dodaju se klauzulom CREATE, i ta struktura odgovara strukturi JSON objekta.
• Azuriranje se vrsi na nivou proptery-ja kako cvora tako i relacije, u te
svrhe koristi se klauzula SET, pri cemu mi kazemo MATCH <nesto> a onda
za to pronadjeno, izvrsimo SET.
• Kod brisanja, postoji razlika izmedju brisanja cvora i relacije. Ako zelimo
da obrisemo cvor, mi cemo onda da korsitimo kljucnu rec DELETE i to
moramo da budemo svesni da je brisanje cvora kljucnom recju DELETE,
dozvoljeno samo kada nema ni jednu vezu, odnosno ako cvor nije
povezan ni sa jednim cvorem u grafu. Kako onda da obrisemo cvor, i da
zajedno sa njim obrisemo sve veze koje idu od njega ili ka njemu ili
obostrano? Za takve situacije postoji posebna klauzula koje se zove
DETACH, koja brise sve veze koje se vezane za taj cvor kao i sam cvor.
DELETE se koristi za brisanje objekta, za brisanje property-ja postoje vise
prilaza. Jedan od prilaza je da iskoristimo UPDATE, pa da neki propery
setujemo na null, ali ako bas zelimo da obrisemo property iz cvora ili
relacije onda se koristi kljucna rec REMOVE. REMOVE nam iz strukture
cvora ili objekta izbacuje neki propety.
3
• Jedna jako bitna stvar, kada korisitmo CREATE, neo4j ce nas slepo slusati,
to znaci da kada kazemo neo4j-u CREATE <nesto>, on uopste ne razmatra
da li mi mozda u nasoj bazi imamo cvor koji ima identicnu strukturu, kao
struktura koju smo mi naveli za kreiranje. Posledica toga je ako mi imamo
dugme koje kreira neki cvor sa nekim ulaznim parametrima i ako 10 puta
kliknemo na to dugme, odnosno 10 puta posaljemo CREATE komande,
neo4j ce 10 puta napravtii identicni cvor po strukturu(nece potpuno biti
identicni jer ce neo4j da im dodeli razlicit ID). Pa ako zelimo da zadrzimo
jednstvenost u smislu unutrasnje strukture cvora, onda moramo
koristimo naredbu MERGE. MERGE naredba u CYPHER-u radi select-orinsert, to znaci da MERGE naredba kada je pozovemo ona najpre proveri
da li cvor sa strukturom koju smo prosledili, vec postoji u nasoj bazi, pa
ako postoji on ce samo biti selektovan, a ako ne postoji onda ce kreirati.
Tako da, ako ne zelimo da napravimo duplikat, onda bi trebalo iskoristii
naredbu MERGE.
• Ukoliko zelimo da filtriramo deo rezultata prema nekom property-ju ili
prema vrednosti property-ja, onda se koristi WHERE klauzula. I WHERE je
manje vise kao SQL-a. Rad sa stringovima je manje vise identican sa sqlom, problem je sa radom sa datumima(ukoliko imamo problema, obratiti
se profesoru).
• Ukoliko zelimo da napisemo upit koji lici na levi/desni spoj kod SQL-a,
primer za to bi bio da zelimo da nadjemo sve cvoreve koji su filmovi i koji
za sebe imaju veznog barem jednog glumca, gde se vraca ime tog glumca
ali ukoliko nema vezanog glumca onda da se vrati samo naziv filma, pa
ukoliko imamo takvu situaciju, koristiti optional match.
• CYPHER podrzava neke osnovne funkcije agregacije, count(nad bilo kojim
delom nad rezlutatom), distinict, ima podrsku za kreiranje nizova(funkcija
COLLECT- da bi iterirali kolkecijom koristiti unwind), sortiranje(ORDER
BY), ogranicavanje broj rezultata itd.
4
Neo4j aplikacija
Cilj aplikacije je povezivanje aplikacije, i izvrsavanje upita za dobijanje
domesnkih modela.
• Da bi smo koristili neo4j potrebno je ukljuciti klijenta:
5
• Povezivanje sa bazom:
• Pronalazanje glumca sa zadatim imenom:
6
• Pretraga filomva po nazivu i vracanje glumca koji glume u njemu:
7
• Kreiranje cvora
8
Download