Documente Academic
Documente Profesional
Documente Cultură
Instrumente necesare:
Conexiune internet
Tomcat (necesit ca Java s fie instalat corect)
Sesame (necesit ca Java s fie instalat corect)
Descrcai Sesame de la adresa de mai jos (exemplele au fost testate pe Sesame 2.x. Ar trebui s
funcioneze i pe Sesame 4.x lansat n cursul acestui an, dar pentru a evita surprizele, recomandm s
lucrai cu Sesame 2.8)
http://rdf4j.org/download.docbook?view
Sesame este disponibil n mai multe forme, n funcie de modul n care urmeaz a fi folosit:
Pornii consola Sesame (din pachetul Sesame pe care l-ai downloadat) bin/console.bat (necesit Java) 1.
Putei obine lista cu comenzi disponibile dac tiprii help n linia de comand:
>help.
Conectai-v la directorul pe care l-ai creat i care va constitui directorul de lucru pentru bazele de
cunotine create cu linia de comand:
>connect c:\rdf.
1
Asigurai-v c Java s-a instalat corect. Dac fereastra consolei se nchide imediat dup ce pornete nseamn c
nu s-a setat variabila de mediu JRE_HOME (dac avei Java JRE) sau JAVA_HOME (dac avei Java JDK).
Va trebui s completai urmtoarele:
Repository ID = myrepo
Repository title = myrepo
Persist = true (dac dorim s se salveze datele pe hard-disk cnd se nchide consola)
Sync delay = 0 (dac dorim s scrie pe hard disk de fiecare dat cnd se fac modificri)
Prompter-ul va indica (similar cu MySQL!) faptul c lucrai n myrepo. ncrcai fiierul sample.ttl n
depozitul creat.
myrepo> load c:\rdf\sample.ttl.
Copiai coninutul directorului War din pachetul Sesame (2 fiiere) n directorul webapps din Tomcat.
Pornii serviciul Tomcat din Tomcat\bin\startup.bat. Pornii browser-ul (preferabil Firefox) i lansai
aplicaia Web Sesame la adresa: http://localhost:8080/openrdf-workbench. n panoul din stnga a
interfeei Sesame selectai Repositories-New repository cu urmtorii parametri:
Cmpul Context ar trebui s rmn liber deoarece contextul (:mymoviegraph) este luat direct
din fiier; dac se ncarc un fiier fr graf identificat, atunci contextul poate fi introdus
manual);
Apsai Upload.
Putei converti datele n sintaxa dorit cu opiunea Export (n cazul n care selectai un format care nu
suport grafuri identificate precum N-Triples, Turtle, identificatorul contextului nu va fi exportat). n
fereastra Export, putei da clic pe oricare din URI-uri pentru a extrage toate afirmaiile despre acel URI.
Observai cum arat nodurile anonime nu mai sunt la fel ca i n fiierul original! (reamintim: nodurile
anonime au identificatori instabili ce nu pot s apar n interogri).
La folosirea identificatorilor de tip URI ntr-o interogare, toate prefixele trebuie s fie declarate nainte
de interogare . Pentru a face acest lucru mai uor, procedai n felul urmtor :
Verificai opiunea Namespaces din meniul situat n partea stng Sesame. Toate prefixele care
au fost detectate n fiierul original ar trebui s apar listate acolo. De asemenea, se pot aduga
altele noi;
n unele versiuni de Sesame, n fereastra Query se poate apsa Clear. Aceast aciune ar trebui
s aduc n fereastra de interogri toate declaraiile de prefix ce s-au definit n Namespaces.
n alte versiuni, trebuie s ncepei s tastai "prefix" n fereastra Query i vei obine o list
derulant de prefixe (tot din lista de la Namespaces) pentru a alege pe cele de care avei nevoie
Pentru fiecare interogare, trebuie s v asigurai c prefixele sunt incluse la nceput dup cum arat
exemplul de mai jos (n restul exemplelor, prefixul va fi omis n acest document, dar voi trebuie s l
avei):
Afieaz tot ce este n relaie cu Terminator i n plus afieaz Terminator pentru fiecare rezultat:
select ?x ?y (:Terminator as ?z)
where
{
?x ?y :Terminator
}
Aceeai interogare ca i cea anterioar, dar s se afieze doar acele rezultate care au numele disponibil
n francez:
select ?x ?y
where
{
?x :hasName ?y
filter (lang(?y)="fr")
}
Cine este cel al crui nume se termin n "on" (indiferent c e majuscul sau minuscul)?
select ?x
where
{
?x :hasName ?nm
filter regex(?nm,"ON$","i")
}
(regex permite s se aplice filtre cu expresii regulate!)
Sunt disponibile funcii similare pentru verificarea dac un termen este URI (isuri) sau dac este nod
anonim (isblank).
S se afieze filmele cu bugetele lor, plus un comentariu indicnd dac este un buget mic (sub
10000000) sau mare:
select ?x (if(?b<10000000,"Low budget","Big budget") as ?comment)
where
{
?x :hasBudget ?b
}
S se afieze bugetul mediu:
select (avg(?b) as ?AverageBudget)
where
{
?x :hasBudget ?b
}
(alte funcii de agregare disponibile sunt: count, sum, min, max, group_concat(concatenare de iruri),
sample (selectare arbitrar dintr-o list de valori))
Aceeai interogare ca i cea anterioar, ns pstrnd doar regizorii care au mai mult de un film:
select ?x (count(?m) as ?MovieCount)
where
{
?x :directorOf ?m
}
group by ?x
having (?MovieCount>1)
Construii o list de titluri pentru fiecare regizor care are mai mult de un film:
select ?x (group_concat(?t;separator=', ') as ?TitleList)
where
{
?x :directorOf/:hasTitle ?t
}
group by ?x
having (count(?t)>1)
(Observai cum proprietile :directorOf/:hasTitle sunt nlnuite pentru a lega regizorii de titluri)
Executai interogri SPARQL cu subinterogri
Prima dat (n subinterogare) se gsete bugetul minim i se pstreaz ntr-o variabil (?minb)
Apoi (n interogarea principal) se caut filmul cu bugetul respectiv
Pentru a transfera rezultatul de la subinterogare la interogarea principal s-a folosit o variabil comun
(?minb).
Pentru a putea realiza acest lucru, avem nevoie de cel puin 2 contexte (grafuri identificate). Creai un
nou fiier movies2.trig cu urmtorul coninut:
@prefix : <http://expl.at#>.
:mynewmoviegraph
{:Titanic :directedBy :JamesCameron;
:hasActor :LeoDiCaprio.
:Godzilla :directedBy :REmmerich.
:DieHard :hasActor :BruceWillis.
:JamesCameron :directorOf :Terminator.
:Predator :hasBudget 100 .
:Titanic :hasBudget 200 .
:DieHard :hasBudget 300 .
:Godzilla :hasBudget 400 .
_:somemovie :hasBudget 500 .
}
Observai urmtoarele:
Relaia regizor-film este acum exprimat n dou moduri diferite (:directedBy i :directorOf).
Deocamdat Sesame nu nelege c aceste relaii sunt reciproc inverse! (e necesar utilizarea
terminologiei standard OWL pentru a face posibil acest lucru);
Am adugat cteva afirmaii care contrazic afirmaiile din graful iniial, de exemplu bugetul
filmului Predator. Se va putea detecta aceast contradicie tot prin raionare pe baza
standardului OWL, de care ne ocupm mai trziu (exist un mod standard de a spune c un film
nu poate avea dou bugete);
Dei s-a folosit un identificator pentru nod anonim _:somemovie cnd s-a ncrcat primul fiier,
ulterior a primit un nou ID i astfel s-a pierdut legtura cu afirmaiile anterioare (putei vedea
toate afirmaiile n ecranul Export).
ncrcai noul fiier n aceeai baz de cunotine i testai urmtoarele interogri:
S se afieze toate afirmaiile despre James Cameron, mpreun cu graful de care aparin:
select *
where
{
graph ?g {?x ?y ?z filter (?x=:JamesCameron)}
}
(observai c apare de dou ori afirmaia c James Cameron a regizat Terminator acest lucru este
permis deoarece e stocat n grafuri diferite; n cadrul aceluiai graf, o afirmaie poate apare o singur
dat!).
Deosebiri:
Cu clauza FROM, se va separa primul graf de restul cunotinelor i apoi se execut interogarea
pe graf
Cu clauza GRAPH se execut interogarea pe tot setul de date i apoi se filtreaz rezultatele dup
graful indicat
n cele mai multe cazuri rezultatele sunt identice. Dac se folosesc deodat, FROM are prioritate. Totui
se prefer clauza GRAPH deoarece permite interogri ce nu sunt posibile cu clauza FROM, precum:
- folosirea identificatorului de graf ca variabil (s se extrag toate afirmaiile despre Predator, inclusiv
numele grafului de care aparin)
select *
where
{
graph ?g {?x ?y ?z}
filter (?x=:Predator)
}
-combinarea abloanelor din grafuri diferite (s se extrag toate afirmaiile din graful iniial, despre cel
care a regizat Titanic conform grafului nou)
select *
where
{
graph :mynewmoviegraph {:Titanic :directedBy ?x}
graph :mymoviegraph {?x ?y ?z}
}
A se observa variabila comun ?x care realizeaz nlnuirea afirmaiilor din diferite grafuri.
S se compare ultimul rezultat cu urmtorul (toate afirmaiile despre cel care a regizat Titanic, conform
grafului nou):
select *
where
{
graph :mynewmoviegraph {:Titanic :directedBy ?x}
?x ?y ?z
}
i cu urmtorul (toate afirmaiile din noul graf, despre cel care a regizat Titanic conform aceluiai graf):
select *
where
{
graph :mynewmoviegraph {:Titanic :directedBy ?x. ?x ?y ?z}
}
Pentru a agrega informaii incomplete din surse multiple (presupunnd c fiecare graf conine
informaii pariale)
Pentru a detecta contradicii (de exemplu verificnd dac aceeai proprietate, de exemplu ziua
de natere sau CNP-ul este declarat diferit n baze de cunotine diferite, cee ace poate indica un
caz de fraud!).
S se afieze toate informaiile disponibile despre James Cameron, ns doar din graful cu reputaia 10:
select *
where
{
graph :metadata {?x :reputation 10}
graph ?x {:JamesCameron ?b ?c}
}