Sunteți pe pagina 1din 10

Sintaxe RDF pentru reprezentarea cunotinelor

RDF este un set de reguli de bun formare pentru a descrie "cunotine" sub form de grafuri. Acest
lucru este diferit de XML, care este axat pe reprezentarea informaiei sub forma unui arbore (DOM).
Grafurile sunt mult mai flexibile dect arborii (care sunt mai flexibili dect tabelele) i pot fi interogate
ntr-un mod mult mai puternic, prin utilizarea limbajului SPARQL (ntr-un arbore se pot realiza deplasri
de-a lungul relaiilor printe-copil, n grafuri se pot face deplasri n orice direcie).

O colecie de grafuri RDF este considerat fie o "baz de date NoSQL" (deoarece este interogat cu
limbajul SPARQL n loc de SQL), fie o "baz de cunotine" (deoarece este folosit de obicei pentru
stocarea de cunotine, nu doar a unor valori de diferite tipuri), sau o "baz de date
semantic"(deoarece este totui i o baz de date, n care datele sunt legate de semnificaia acestora cu
scopul de a stabili o interpretare clar i fix).

Asemnri cu XML:

- La fel ca i XML, RDF nu este un limbaj, ci un set de reguli sintactice care trebuie s fie respectate
pentru a descrie cunotinele sub forma unor afirmaii. Fiecare afirmaie conine 3 termeni: un
subiect, un predicat (proprietate) i un obiect.
- La fel ca i n XML, putem folosi orice termen dorim, putem inventa proprii notri termeni iar
interogrile vor funciona cu condiia ca regulile de bun formare s nu fie nclcate.
- La fel ca n XML, dac dorim ca alii s neleag afirmaiile noastre, este indicat s se foloseasc
un "vocabular standard" = un set de termeni standardizai, propus de W3C i recunoscut de mai
multe instrumente software. Cele mai importante vocabulare standard sunt RDF/S i OWL.
- Spre deosebire de XML ns, nu avem noiunea de "date valide". Aici, vocabularele NU sunt
folosite pentru a verifica dac o afirmaie este valid sau nu. Vocabularele RDF vor fi folosite
pentru a permite deducii logice automate (cum se fac n Prolog), iar vocabularele standard au
un rol important n a permite asta.. Principalele diferene ntre "baze de date" i "baze de
cunotine":
o n bazele de date, aplicm de la bun nceput "validarea" (pentru a verifica dac datele se
potrivesc cu o anumit restricie / schem a bazei de date);
o n bazele de cunotine, vom colecta afirmaii fcute de oameni diferii i trebuie s
permitem "oricui s fac orice afirmaie ar dori" (inclusiv minciuni!). n cazul n care
afirmaiile sunt "false", acestea vor conduce prin deducie logic la contradicii, dar ...
o contradicie nu se poate detecta prin compararea unei afirmaii fa de un tip
de date (ca la validare), ci prin compararea unei afirmaii cu alte afirmaii
provenite de la alte persoane/surse;
detectarea unei contradicii nu se poate face de la bun nceput (ca validarea), la
momentul la care s-a creat o afirmaie nou; e necesar s se acumuleze n timp
suficiente afirmaii din suficiente surse nct s permit detectarea unei
contradicii prin deducii logice (se poate totui i de la bun nceput, dac baza
de cunotine e suficient de bogat);
cnd se detecteaz o contradicie, nu e automat clar care e afirmaia fals, ci
numai care sunt afirmaiile aflate n conflict; administratorul bazei de cunotine
trebuie s decid pe care s le pstreze i pe care nu, n funcie de diverse
criterii (de ex. credibilitatea sau reputaia sursei fiecrei afirmaii).

Exemplu de afirmaie:
@prefix : <http://buchmann.ro#>.
:Mary :daughterOf :John.

De reinut:

- Spre deosebire de XML, afirmaiile RDF se pot scrie n mai multe sintaxe, fiecare avnd propriile
reguli de delimitare i bun formare. Exemplul anterior a fost scris n sintaxa Turtle.
- Fiecare "cuvnt" (termen) dintr-o afirmaie are un prefix (n acest caz, caracterul ":"), pentru a
indica cine "a inventat" termenul - acesta va fi cel care deine adresa serverului HTTP declarat
pe prima linie (i care este unic n Internet, eliminnd ambiguitatea care poate s apar ntre
termenii similari cu nelesuri diferite, creai de persoane diferite). Mai exact:
o persoane diferite pot inventa "cuvinte" similare distincia este fcut de prefix;
o putem avea mai multe prefixe n aceeai afirmaie sau fraz (putem combina "cuvinte"
inventate de oameni diferii);
o termenii standard vor avea un anumit prefix standard (rdf:, rdfs:, owl:);
o pentru tot restul semestrului, vom presupune c deinem PROPRIUL server cu adresa
http://expl.at i o vom folosi pentru a prefixa "cuvintele" inventate de noi (n unele cri
se folosesc http://example.org, sau un server deinut de autorul exemplelor).

O alt sintax pe care o vom folosi este N-triples. Afirmaie de mai sus poate fi scris n N-triples n felul
urmtor:
<http://buchmann.ro#Mary> <http://buchmann.ro#daughterOf> <http://buchmann.ro#John> .

n aceast sintax, nu trebuie s declarm un prefix, dar trebuie s repetm adresa de domeniu pentru
fiecare termen (prin urmare, Turtle este mult mai uor de utilizat). De aceea, aceti "termeni" se numesc
URI-uri (identificatori universali de resurse).

Pentru urmtoarele exerciii avem nevoie de:


- conexiune internet
- DotnetRDF: http://www.dotnetrdf.org/

Accesai urmtorul instrument online pentru a realiza conversii RDF ntre diferite sintaxe:
http://www.easyrdf.org/converter

Exemplul 1 (n Turtle):
Cunotinele de introdus: Anna are culoarea prului roie, are vrsta de 20 i este fiica lui John. Mary
este, de asemenea, fiica lui John.
Putei folosi orice editor text (Notepad) pentru sintaxa Turtle 1:

1
Exemplele vor folosi termeni n englez, dar nu e obligatoriu! La fel de bine am putea scrie i n forma:
@prefix : <http://expl.at#>.
:Anna :hasHairColor :Red; :hasAge 20; :daughterOf :John.
:Mary :daughterOf :John.

- S se copieze textul n seciunea Input Data a convertorului easyrdf


- Se va selecta formatul de introducere (Input Format): Turtle
- ncercai cu diferite opiuni pentru formatul de ieire (Output Format) pentru a observa cum
arat alte sintaxe RDF
- Putei s folosii acest instrument i ca validator, pentru a verifica dac ai introdus declaraiile
corect n sintaxa Turtle: dac reuii s l convertii fr erori nseamn c este corect

Sintaxele pe care le vom nva n acest semestru sunt:


Turtle / TriG (simplu pentru citit/scris, cel mai important)
N-triples / N-quads (simplu pentru citit, dificil de a scrie)
RDF / XML (dificil de citit i scris, dar standardizat i bazat pe XML)
TriX (uor de citit, dificil de a scrie, bazat pe XML)
RDFa (dificil de citit i scris, dar foarte important n Web, are la baz HTML)
JSON-LD (dificil de citit i scris, dar important n Web, are la baz JSON)

Easyconverter ofer, de asemenea, unele formate de ieire grafice (PNG, GIF), care ar trebui s genereze
o reprezentare grafic sub forma unui graf. Dar uneori aceste opiuni vor da o eroare n varianta on-line
(putei downloada pachetul ca librrie PHP!).

Putei ncerca, de asemenea, instrumentul on-line pentru validarea i vizualizarea sintaxa RDF / XML:
http://www.w3.org/RDF/Validator/

Dar acest lucru nseamn c trebuie s generai sintaxa RDF/XML din sintaxa Turtle (cu easyRDF), pentru
c RDF/XML este singurul tip de intrare acceptat de acest validator.

O reprezentare grafic arat foarte clar de ce cunotinele sunt grafuri i de ce limbajul XML sau tabelele
din baze de date relaionale nu sunt suficiente pentru baze de cunotine. Exemplul nostru are
urmtoarea form a grafului:

:Anna :areVarsta 20: eFiicaLui John. Mai mult, afirmaiile se scriu cu setul de caractere UNICODE, deci pot conine
i diacritice, litere chinezeti etc. Se prefer totui termeni care s poat fi citii uor de orice utilizator Web din
lume.
Exemplul 2: Traducei urmtorul graf n limbaj natural i n Turtle

Turtle:
@prefix : <http://expl.at#> .
:Anna :isMotherOf :Andrew, :Peter.
:Peter :isFatherOf [:hasAge 20].
:hasAge :measuredIn :years.

Limbaj natural:
Anna este mama lui Andrew i Peter. Peter este tatl cuiva a crui vrst este 20. Vrsta se msoar n
ani.

Comentarii: Observai c printre termenii folosii mai apar: o valoare simpl (numrul 20) i un nod
anonim (nod blank, ceva despre care noi nu tim nimic altceva, sau nu ne intereseaz suficient nct s-i
alocm un identificator) . n N-triples acest lucru se traduce prin:

<http://expl.at#Anna> <http://expl.at#isMotherOf> <http://expl.at#Andrew> .


<http://expl.at#Anna> <http://expl.at#isMotherOf> <http://expl.at#Peter> .
_:x <http://expl.at#hasAge> "20"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://expl.at#Peter> <http://expl.at#isFatherOf> _:x .
<http://expl.at#hasAge> <http://expl.at#measuredIn> <http://expl.at#years> .
Comentarii:
Pentru nodurile anonime nu putem folosi identificatori universali (URI). n schimb folosim o construcie
precum _: x (s-ar putea s avei altceva n loc de "x", pentru c e vorba de un identificator local generat
aleator n timpul conversiei de sintax). Ceea ce nseamn c nu l putem refolosi (se poate modifi-
ca/regenera de fiecare dat cnd salvai aceste afirmaii ntr-o baz de cunotine!).
Pentru valori simple (de exemplu, numere), nu vom folosi un URI, trebuie doar s i atribuim un tip de
date din XML Schema, care la rndul lor au form de URI).

Exemplul 3: Traducei n limbaj natural, n sintax Turtle cu "termenii" vizibili n imagine, apoi n sintax
Turtle cu termeni standardizai:

Limbaj natural: John este brbat. Orice brbat este un om. Brbaii i oamenii sunt mulimi. John este,
de asemenea, cunoscut i sub identificatorul Johnny (propus de cei care dein serverul http://other.at)

Sintax Turtle cu termenii din imagine:


@prefix : <http://expl.at#> .
@prefix o: <http://other.at#> .
:John :isOfType :Man; :equivalentTo o:Johnny.
:Man :isAKindOf :Human; :isOfType :Class.
:Human :isOfType :Class.

Sintax Turtle cu termeni standardizai:


@prefix : <http://expl.at#> .
@prefix o: <http://other.at#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns# > .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema# > .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
:John a :Man; owl:sameAs o:Johnny.
:Man rdfs:subClassOf :Human; a rdfs:Class.
:Human a rdfs:Class.
Exemplul 4: Traducei urmtorul text n Turtle (putei desena graful mai nti)

Capitala Austriei este Vienna sau Innsbruck. Austria este o ar, Vienna i Innsbruck sunt orae. Exist o
femeie care triete pe strada Brunnerstrasse, care este o strad din Vienna.

@prefix : <http://expl.at#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns# > .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema# > .
:Austria :hasCapital [a rdf:Alt; rdfs:member :Vienna, :Innsbruck]; a :Country.
:Vienna a :City.
:Innsbruck a :City.
[a :Woman; :livesOn :Brunnerstrasse].
:Brunnerstrasse a :Street; :locatedIn :Vienna.

Exemplul 5: Traducei n Turtle

Vara are urmtoarele luni, n aceast ordine: iunie, iulie, august.


James Cameron a regizat Avatar, Aliens i Terminator (ordinea e irelevant).

@prefix : <http://expl.at#> .
:Summer :hasMonths (:June :July :August).
:JamesCameron :directed :Avatar, :Aliens, :Terminator.

Uneori dorii s grupai afirmaii. Le putei grupa n grafuri separate, (dac ne gndim la o afirmaie ca la
o "nregistrare", atunci un graf este un "tabel", care conine mai multe nregistrri). Urmtorul exemplu
conine 2 grafuri (cnd folosim grafuri, sintaxa este numit TriG n loc de Turtle):

@prefix x: <http://expl.at#>.
@prefix o: <http://other.at#>.

x:Graph1
{
x:John a x:Human; x:isBrotherOf x:George, x:Anna; x:fullName "John Smith".
x:Anna a x:Human.
x:George a x:Human.
}
o:Graph2
{o:Mary o:worksAt [a o:Company; o:locatedIn o:Wien]}

Tradus n limbaj natural:


Graf-ul 1 (propus de deintorii serverului expl.at): John este om, este fratele lui George i al Anei, iar
numele su complet este "John Smith". Anna este om, George este om.
Graf-ul 2 (propus de deintorii serverului other.at): Mary lucreaz la o companie care este situat n
Viena.

Urmtorul exemplu este un singur graf:

@prefix x: <http://expl.at#>.
x:Graph1
{
x:Mary x:worksAt x: ABC; x:motherOf x:Peter, x:Andrew; x:hasAge 40 .
x: ABC a x:Company; x:locatedIn x:Wien .
x:Andrew x:isBrotherOf x:Peter; x:hasAge 20 .
Tradus n limbaj natural:
Graf 1: Mary lucreaz la ABC, este mama lui Peter i Andrew, are vrsta de 40. ABC este o companie i
este situat n Viena. Andrew este fratele lui Peter, i are 20 de ani.

Accesai instrumentul online pentru conversie n JSON-LD:


http://json-ld.org/playground/

Avei posibilitatea s utilizai acest instrument pentru a scrie grafuri n sintaxa JSON-LD i pentru a testa
corectitudinea lor. Ele sunt corecte dac pot fi traduse n N-quads (N-quads este la fel ca N-triples, dar la
finalul fiecrei afirmaii se mai adaug identificatorul grafului n care o includem).

ncercai s scriei cele dou exemple anterioare n JSON-LD i testai convertorul pentru a vedea dac
obinei expresiile corecte n N-quads.

Soluii:

Exemplul cu 2 grafuri:
[{"@context": {"x":"http://expl.at#"},
"@id":"x:Graph1",
"@graph":
[
{"@id":"x:John","@type":"x:Human",
"x:isBrotherOf":[{"@id":"x:George","@type":"x:Human"},{"@id":"x:Anna","@type":"x:Human"}],
"x:fullName":"John Smith"}
]},
{"@context": {"o":"http://other.at#"},
"@id":"o:Graph2",
"@graph":
[
{"@id":"o:Mary",
"o:worksAt":{"@type":"o:Company","o:locatedIn":{"@id":"o:Wien"}}}
]
}
]

Explicaii:
ntreaga baz de cunotine este o construcie JSON cu 2 elemente: unul pentru fiecare graf
Pentru fiecare graf, avem o serie de cuvinte cheie (care nu exist n alte sintaxe RDF, dar n JSON
au o interpretare special i ncep cu @):
n @context declarm prefixul
n @id declarm identificatorul grafului
n @graph vom construi o structur JSON cu toate declaraiile
@id" indic subiectul
@type indic tipul subiectului
Apoi urmeaz o list de proprieti (brother, fullName)
isBrotherOf este o relaie ce are ca valori un ir de entiti (George i
Ana) i pentru fiecare dintre acestea a fost inclus i tipul (Human).
fullName este un atribut a crui valoare este un string: John Smith
n al doilea graf:
@id indic subiectul, Mary ce nu are declarat un anume tip
Apoi urmeaz predicatul worksAt care o leag pe Mary de afirmaiile despre
companie
Nu avem @id pentru companie! (este un nod anonim)
Dar este declarat un tip (Company)
Precum i locaia sa (Viena)

Mai jos avei sintaxa JSON-LD pentru al doilea exemplu, cel cu un singur graf:

{
"@context":{"x":"http://expl.at#"},
"@id":"x:Graph1",
"@graph":
[
{"@id":"x:Mary",
"x:worksAt":{"@id":"x:ABC","@type":"x:Company","x:locatedIn":{"@id":"x:Wien"}},
"x:motherOf":[{"@id":"x:Peter"},{"@id":"x:Andrew"}],
"x:hasAge":40},
{"@id":"x:Andrew","x:isBrotherOf":{"@id":"x:Peter","x:hasAge":20}}
]
}
Downloadai urmtorul instrument pentru lucrul cu RDF:
http://www.dotnetrdf.org/

Exerciiu: Folosii rdfEditor pentru a crea, converti i edita date RDF

S se scrie urmtoarele date n rdfeditor:


@prefix : <http://expl.at#>.
:Anna :hasHairColor :Red; :hasAge 20; :daughterOf :John.
:Mary :daughterOf :John.

Selectai Options->Syntax->Turtle (W3C) pentru a indica ce sintax folosii i pentru a obine colorarea
de sintax pentru Turtle.
Selectai Tools->Validate Syntax pentru a verifica erorile (dac Options->Validate syntax as you type este
activ va evidenia erorile n timpul tastrii).
Selectai File-Save As pentru a salva ntr-un fiier numit sample.ttl.
De asemenea, putei converti textul n diferite sintaxe cu File-Save with -, dac nu sunt gsite erori
(dup conversie, fiierul poate fi salvat cu File-Save As; este important s se atribuie extensia corect:
ttl=Turtle, nt=Ntriples, trig=TriG, xml=TriX, rdf=RDF/XML, n3=Notation3 etc.).

Exerciiu: Folosii rdfConvert pentru conversie RDF

Acesta este un instrument n linia de comand. Avantaje:


1. Poate fi uor executat cu apeluri de sistem (deci i din alte programe)
2. Poate converti mai multe fiiere/formate deodat
3. Poate obine (chiar din mai multe surse) grafuri care sunt disponibile online

Copiai fiierul sample.ttl n dotnetrdf/rdfconvert


Lansai linia de comand (Command Prompt) i deplasai-v n directorul dotnetrdf apoi n directorul
rdfconvert. Putei consulta documentaia instrumentului:
rdfconvert help

Realizai conversii ale fiierului anterior (sample.ttl) n alt format:

Conversia n RDF/XML prin pstrarea numelui la fiier i indicarea formatului de ieire cu ajutorul tipului
MIME
rdfconvert sample.ttl -format:application/rdf+xml
Conversia n TriX prin specificarea numelui de fiier i indicarea formatului de ieire cu ajutorul extensiei:
rdfconvert sample.ttl out:newfile.xml
Conversia n N-Triples, prin obinerea cunotinelor disponibile pe DBPedia despre Austria (DBPedia este
o baz de cunotine on-line ce conine informaii extrase din Wikipedia).
rdfconvert http://dbpedia.org/resource/Austria out:austria.nt

Exerciiu: Folosii rdfQuery pentru a realiza interogri simple SPARQL pe un fiier

i acesta este un instrument n linia de comand care poate realiza interogri att pe fiiere locale ct i
pe cunotine on-line.

Copiai sample.ttl n directorul dotnetrdf/rdfquery.


n linia de comand (Command Prompt) deplasai-v n directorul dotnetrdf/rdfquery i realizai
urmtoarea interogare SPARQL care extrage toate informaiile din fiierul sample.ttl.
rdfquery sample.ttl "select * where {graph ?g {?x ?y ?z}}"
n urmtoarea versiune, rezultatele sunt salvate n alt fiier:
rdfquery sample.ttl out:results.txt "select * where {graph ?g {?x ?y ?z}}"
Iar n urmtoarea, interogarea se aplic asupra bazei de cunotine on-line de la DBPedia
rdfquery -endpoint:http://dbpedia.org/sparql -out:results2.txt "select * where {graph ?g {?x ?y ?z}} limit 50"

Exerciiu: Realizai interogri SPARQL direct pe o baz de cunotine on-line public (paginile Web ce
ofer acest tip de acces se numesc servicii de tip "SPARQL endpoint")
O list cu servicii SPARQL publice se poate consulta la adresa (atenionare: nu toate dintre acestea sunt
disponibile tot timpul):
http://www.w3.org/wiki/SparqlEndpoints

Unul dintre cele mai cunoscute este DBPedia (versiunea RDF a Wikipedia):
http://dbpedia.org/sparql

Realizai urmtoarele interogri n formularul de pe DBPedia:


- pentru a extrage primele 50 de afirmaii ale DBPedia. Atunci cnd se interogheaz servicii SPARQL
publice, se recomand s se utilizeze opiunea de limitare, pentru c, uneori, interogarea poate gsi mii
de rezultate, care pot bloca sau expira conexiunea:
select * where {graph ?g {?x ?y ?z}} limit 50
-pentru a extrage o list cu companii de pe DBPedia (nu este de dimensiune foarte mare de aceea nu
este necesar limitarea):
select * where {?x a <http://dbpedia.org/ontology/Company>}

Exerciiu: Realizai interogri SPARQL dintr-o interfa GUI


Copiai fiierul sample.ttl n directorul dotnetrdf/SparqlGUI. Executai SparqlGUI.exe i realizai
urmtoarele operaii:
Cutai fiierul sample.ttl (n partea de sus a ferestrei)
Apsai butonul Import File
Scriei interogarea select * where {graph ?g {?x ?y ?z}} n seciunea Query (nlocuii cea implicit, afiat
n fereastr)
Apsai Run Query pentru a obine rezultatele ntr-un tabel

Acum, ncercai s rulai o interogare ctre DBPedia. Teoretic, butonul Import URI ar putea fi utilizat
pentru a importa baza de cunotine DBPedia, dar aceasta e imens i ar bloca sistemul. n schimb,
utilizai opiunea SERVICE direct n interogare pentru a indica faptul c interogarea trebuie trimis spre
DBPedia. Scriei urmtoarea interogare n zona de interogare i executai-o:
SELECT *
WHERE
{
SERVICE <http://dbpedia.org/sparql> {?x a <http://dbpedia.org/ontology/Company>}
}