• Non ci sono risultati.

La selezione dei dat

Il Linguaggio di Interrogazione

2.8 La selezione dei dat

C yp he r for ni sc e una mo lt ep l ic it à d i cl a uso le c he p er me t to no d i i nt err o - ga re i l da tab a se .

La ma ni e ra i n c ui ve ngo no i mp i e gat e q ue s te c la us o le co ns e nto no d i d e - fi ni re d i ve rs e te c nic he di se l ez io ne , c he i nfl uir a nno , po s i ti va me nt e o ne g a- t i va me nt e, s ull e pr e st az io ni d e ll e q uer y.

2.8.1 Tecniche di selezione

P e r a ffro nta re al me gl i o q ue st a p ar te s i è d ec i so d i uti l iz zar e un mo de l - l o d i r i fer i me nt o, a c ui so tt oporr e una s er ie di q ue r y S Q L e p oi a nal iz zare l e cor re sp et t i ve q uer y Cyp he r .

La co no s ce nza de l la s trut t ura de i mo de l li no n è un pr obl e m a d i r i li e vo vi s t o c he le q uer i y c he ve rra nno pr e se i n e sa me no n sa ra nno co mp l e s se dal p unto d i vi st a l o gi co, i nfa t t i no n verr a nno e ffe t tua t i gr a nd i j oi n tr a l e t a- b el le , e la st r ut t ur a de i mo d el l i è fac il me nt e int ui bi l e d ir et ta me nt e d alle i nt err o ga zi o ni st e s se .

S i pr e nd a i n co nsi der az io ne la se gue nte q ue r y SQ L:

SELECT FT.*

FROM FACT500K FT, CITY c WHERE FT.CITY = c.IDCITY AND c.CITY = 'Alameda';

La tabella FACT500K contiene all’interno una serie di dati statistici s udd i vi s i p er ci t tà, e t nia, s e s so, oc c upa z io ne e a nno .

La q uer y d i e s e mp io e segue un se mp l ic e j o i n tr a l a t abe l la F ACT 500 K e l a t abe l la C IT Y. L’i nter ro gaz io ne e str arr à t utt e le t upl e d a F ACT 500 K che c o nt e ngo no i d a ti st at i s ti c i d e ll a ci t tà di Al a me da . La s udd e tt a q uer y p o - t re bbe e s se re tr ado t ta nel l e s e gue nt e q uer y C yp he r:

MATCH (FT:Fact500k)-[:IN_CITY]->(c:City) WHERE c.CITY = ‘Alamenda’

RETURN FT

La st r utt ura d el gra fo è fa ci l me nt e d ed uc ibi l e. I nodi e ti c he t ta ti “Fact500k”, che corrispondono alle tuple della tabella FACT500K, sono connessi ai nodi con label “City” per mezzo di una semplice relazione . C hi a ra me nt e i nod i et i c he t ta t i “C i t y” corr i spo nde ra nno ai re cor d d el la t a- b el la CIT Y .

I r i s ult a ti d e ll a q ue r y SQ L e de ll a q uer y C yp her so no p re s so c hé id e nt i - c i, no n s i po s so no co ns id era re ugua li p erc hé l e c hi a vi pri ma r i e ed i mp o r- t a te no n s o no p re s e nt i i n un d at aba s e a gr a fo , al co ntr ar io d el r el az io nal e.

I n q ue s ta pri ma i nte rro ga z io ne C yp her , s i p uò no ta re c he la s tr ut t ur a di r i fer me nt o al l ’i nte r no del l a c la uso la M AT CH non pr e se nta a l c una se l ez i o - ne e spl i ci ta , a p ar te l a for ma de l pa tt er n. Ciò si gni fi c a c he p r i ma verr a nno e s tr at t i t ut t i i F ac t p re sent i ne l d at aba s e, co n a nne s s i t utt i i nod i C it t à co l- legati per mezzo della relazione “IN_CITY” , e poi successivamente verrà e ffe t t ua t a la s c her ma t ur a de i r i s ul t at i i n b a se a l pr ed ic ato d i se le zio ne pr e- s e nt e nel l a c la us ol a W HE R E.

C hi a ra me nt e da l p unto di vi s ta pre s ta z io na l e, la q uer y ap pe na d e scr i tt a r i s ult a a s sa i o ner os a, vi st o c he il mo tor e d i da tab a se di neo4j do vrà pr ima p erc orr e i l d a tab a se p er e st rar re t utt i i so tt o - gra fi c he c orr i spo nd o no a l p at te r n p er car i c ar s el i in me mo r ia ce ntr al e, e s uc c e ss i va me nt e s ca nd irl i s e q ue nz ia l me nt e p er e limi na r e t ut t i q ue i r i sc o nt r i c he no n sodd i s fa no i l pr ed ic at o d i se l ez io ne.

N e l c a so di gr a nd i d a ta se t , q ue st o ti po d i app rocc io gr a va ta l me nt e t a n - t o s ul le r i sor s e, d a ri s chi a re d i s at ura re t ut ta la me mo r ia R AM ad ibi t a a l s e r ve r Neo4j (q ua lor a no n si a s ta ta ded ic a ta un’e nor me q ua nti t à d i me m o - r ia ).

Un’altra query Cypher corrispondente alla query SQL potrebbe essere la s e gue nt e:

MATCH (FT:Fact500k)-[:IN_CITY]->(c:City{CITY: ‘Alamenda’}) RETURN FT

I n q ue s to c a so il p red ica to d i se l et t i vi t à è pr e sent e al l ’i nte r no de l p a t - t er n , c iò st a a si gni fi car e c he no n ve rra nno c ari c at i i n me mo r i a c e ntra le t ut t i i Fa ct pr e se nt i ne l d at aba s e, ma l a ce r ni t a ve rrà e ffet t uat a a l i vel lo di a t tr a ver s a me nt o d el gra fo . I n q ue s to mo do s i e vi t er à d i so vr ac ca ri car e la me mo r i a R AM , e d i rid ur re not e vo l me nt e i t e mp i di e s ec uzio ne de ll a q u e- r y. Anc he i n q ue s to c a so N eo4j do vrà s ca nd ir e seq ue nz i al me nt e t utt i i fa ct pr e se nt i nel da t aba s e p er poi sc art ar e q ue ll i c h e no n gl i i nte re s s a no.

La pro s s i ma q uer y C yp he r s uppo ne c he si a s t ato cr ea to un i ndi ce s ul l a proprietà “CITY” dei nodi etichettati “City”, questo perché verrà effettuata l a ri ce rc a i mp ie ga ndo l a c l a uso la ST ART :

START c=node:City(CITY=’Alameda’) MATCH (c)<-[:IN_CITY]-(FT:Fact500k) RETURN FT

D a to c he è s ta to i mp l i ci ta me nt e i mp i e ga to un i ndi c e ut i li zz a ndo la c l a u - sola ST ART, l’interrogazione risulterà sicuramente più performante. L’enorme aumento delle prestazioni non è dovuto solamente al fatto che è s t a to ut il i zza to l ’i ndi ce p er e se guir e la q uer y, i l me r i to è d a at tr ib uire s o - pr a tt ut to al la l o gi ca de l la c la us ol a ST ART .

C o me è s ta to d e tto i n pre ce de nza , la cl a uso la ST AR T e se gue una pr i ma r ic er ca i n ba s e a l pr ed ica to d i se l ez io ne i nd i ca togl i . Q ue s ti nodi ver ra n no i mp i e ga ti c o me p unt i di pa rt e nz a ( an cho r po int ) d a c ui far pro t e nde re l a r ic er ca vera e p ropr ia . In q ue st o mo do , Ne o4j no n do vrà s ca nd ir e t ut ti i fact presenti all’interno del database , ma si dovrà solamente limitare ad a t- t ra ver s are t utt e q ue l le rel a zio ni c he pa rt o no da ll e C i t ta e s tr at t e i niz ia l me n - t e e c he gli co ns e nto no ra ggi unge re i F ac t di i nter e s se.

Vediamo ora un’ultima query:

START c=node(773)

MATCH (c)<-[IN_CITY]-(FT:Fact500k) RETURN FT

In quest’ultima interrogazione si può notare che il “nodo ancora” viene scelto direttamente specificandogli l’id del nodo. Il nodo ancora sarà solo uno (co me nel ca so pre ce de nte ) e d a e s so p ar ti rà la r ic er ca. L’ut i l iz zo d e- gl i id p er me t t e di a ume nt a re ult er ior me nt e la ve lo ci t à di e se c uz io ne del le no s tr e q uer ie s . O gni q ual vo lt a s i vuol e e ffe tt uar e una r ic erc a mo l to gr a nde, l’utilizzo di questi identificatori univoci è un buon escamotage. T uttavia, l’impiego degli id implica che si conosca a priori l’id del nodo di intere s- s e .

Documenti correlati