Post on 04-Apr-2015
W3C SPARQL (Simple Protocol And RDF
Query Language)BALI Ahmed
Bali.ahmed@gmail.comMaster informatique 2012/2013
-----------Basé sur le cours de olivier corby (INRIA)
2
Notion
• est un langage de requête et un protocole qui permettra de rechercher, d'ajouter, de modifier ou de supprimer des données RDF disponibles à travers Internet.
• Comme le SQL aux données des bases de données, avec SPARQL, on accède aux données du Web des données.
• « SPARQL fera une énorme différence», selon Tim Berners-Lee dès mai 2006
3
Que fait SPARQL?
• Pour interroger une base de triplets RDF sous forme de graphe
• SPARQL est neutre par rapport aux inférences RDF/RDFS/OWL.
• C’est au serveur de triplets (e,g dbpedia) de faire les inférences et de délivrer les bons triplets
4
A partir d’une base RDF :• Extraire de l’information : URI, literal, datatype
literal• Extraire un sous graphe RDF• Construire un graphe résultat
5
SPARQL: exemple
PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?mbox WHERE{ ?x foaf:name "Johnny Lee Outlaw" .?x foaf:mbox ?mbox }
6
Syntaxe SPARQL : Triple
URI: <http://www.inria.fr/ocorby>Qname: rdf:type foaf:nameVariable: ?x ?nameBlank Node (variable anonyme): _:b1 _:b2Literal: “Literal” 3.14 true “12”^^xsd:integer
7
Syntaxe SPARQL : Triple
• subject property object• <http://www.inria.fr/ocorby> foaf:name ?name• ?x foaf:name 'Omar'• ?x ?p 'Omar'• _:b1 foaf:age 49
11
Blank Node
?x c:speed [ rdf:value ?val ; c:unit 'km/h' ]Equivalent à :?x c:speed _:b_:b rdf:value ?val_:b c:unit 'km/h'
12
Blank Node
?x c:speed [ rdf:value ?val ; c:unit 'km/h' ]Interroger le design pattern des relations n-aires:<c:Car><c:speed rdf:parseType=‘Resource’><rdf:value>100</rdf:value><c:unit>km/h</c:unit></c:speed></c:Car>
13
Liste
(1 ?x ‘v’)⇔_:a rdf:first 1 ._:a rdf:rest _:b ._:b rdf:first ?x ._:b rdf:rest _:c ._:c rdf:first ‘v’ ._:c rdf:rest rdf:nil
14
Test : Filtre
Test : FiltreFILTER (?age >= 7 && ?age <= 77)Comparaison : < <= = >= > != Opération : + * / -Booléen : && (and) || (or) ! (not)Fonction : isBlank(?x) my:fun(?y)
15
Syntaxe Abstraite Filtre
EXP ::= TERM | EXP OPER EXP | (EXP)TERM ::= VAR | CST | FUNCST ::= URI | LiteralOPER ::= < <= = >= > + - * / && || !FUN ::= NAME( EXP* )
19
Tests
lang(?x) = ‘en’engineer@en -> trueingénieur@fr -> falsedatatype(?y)= xsd:string! (?x || ?y && ?z)
20
Exercice
1. Trouver l’age des ressources dont le nom est ‘Salim’2. Trouver le nom des ressources dont l’age est inférieur à 50,3. Trouver les valeurs des propriétés des ressources dont le nom est ‘Salim’ et l’age inférieur à 504. Trouver les autres noms des ressources dont le nom est ‘Salim’5. Trouver les ressources qui ont deux propriétés différentes avec la même valeur6. Trouver les ressources qui ont deux fois la même propriété avec des valeurs différentes
21
Exercice
1. Trouver l’age des ressources dont le nom est ‘Salim’select ?age where { ?x name ‘Salim’ . ?x age ?age }2. Trouver le nom des ressources dont l’age est inférieurà 50select ?name where { ?x name ?name . ?x age ?age filter(?age < 50) }3. Trouver les valeurs des propriétés des ressources dontle nom est ‘Salim’ et l’age inférieur à 50select ?p ?y where { ?x name ‘Salim’ . ?x age ?age filter(?age < 50) ?x ?p ?y }
22
Exercice
4. Trouver les autres noms des ressources dont le nom est ‘Salim’select ?name where { ?x name ‘Salim’ .?x name ?name }5. Trouver les ressources qui ont deux propriétés différentes avec la même valeurselect * where { ?x ?p ?y . ?x ?q ?y filter(?p != ?q)}6. Trouver les ressources qui ont deux fois la même propriété avec des valeurs différentesselect * where { ?x ?p ?y . ?x ?p ?z filter(?y != ?z)}
23
Pattern optionnel
SELECT * WHERE {?x :hasCreated ?doc .OPTIONAL {?x :isMemberOf ?org}}hasCreated est obligatoireisMemberOf est optionnel
24
Pattern optionnel
SELECT * WHERE { :John :hasCreated :d1?x :hasCreated ?doc :John :hasCreated :d2OPTIONAL { :Jack :hasCreated :d3?x :isMemberOf ?org :Jack :isMemberOf :club}}Résultats:(1) x = :John ; doc = :d1 ; org = unbound(2) x = :John ; doc = :d2 ; org = unbound(3) x = :Jack ; doc = :d3 ; org = :club
25
Pattern optionnel
SELECT * WHERE {?x :hasCreated ?doc .OPTIONAL {?x :age ?age .?x :isMemberOf ?org}}age et isMemberOf doivent être présents pour que optional réussisse
26
Pattern optionnelSELECT * WHERE { :John :hasCreated :d1?x :hasCreated ?doc . :John :hasCreated :d2OPTIONAL { :Jack :hasCreated :d3?x :age ?age . :Jack :isMemberOf :club?x :isMemberOf ?org :Jim :hasCreated :d4} :Jim :isMemberOf :assoc} :Jim :age 45Résultats(1) x = :John ; doc = :d1 ; org = unbound ; age = unbound(2) x = :John ; doc = :d2 ; org = unbound ; age = unbound(3) x = :Jack ; doc = :d3 ; org = unbound ; age = unbound(4) x = :Jim ; doc = :d4 ; org = :assoc ; age = 45
27
Pattern optionnel
SELECT * WHERE { :John :hasCreated :d1?x :hasCreated ?doc . :John :hasCreated :d2OPTIONAL {?x :age ?age} :Jack :hasCreated :d3OPTIONAL {?x :isMemberOf ?org} :Jack :isMemberOf :club} :Jim :hasCreated :d4
:Jim :isMemberOf :assoc:Jim :age 45
Résultats(1) x = :John ; doc = :d1 ; org = unbound ; age = unbound(2) x = :John ; doc = :d2 ; org = unbound ; age = unbound(3) x = :Jack ; doc = :d3 ; org = :club ; age = unbound(4) x = :Jim ; doc = :d4 ; org = :assoc ; age = 45
28
Pattern optionnel avec test
SELECT * WHERE {?x :hasCreated ?doc .OPTIONAL {?x :age ?age FILTER (?age < 45) .?x :isMemberOf ?org .}}
29
Pattern UNION
SELECT * WHERE {:Barack :apply :Presidency
{?x :apply ?job} :Barack :play :BasketBallUNION :John :apply :Presidency{?x :play ?act}}Résultats(1) x = :Barack ; job = :Presidency ; act = unbound(2) x = :Barack ; job = unbound ; act = :BasketBall(3) x = :John ; job = :Presidency ; act = unbound
30
RDF Dataset
Interroger une base de plusieurs graphesDes graphes nommés avec des URIUn graphe par défautIdentifier les graphes interrogés
32
Distinct
select distinct ?x ?z where {?x :friend ?y?y :friend ?z}Ne retourne pas deux fois les mêmes valeurs de x et z
33
Distinct
select distinct ?x ?z :Jules :friend :Jimwhere { :Jim :friend :Jack?x :friend ?y :Jules :friend :James?y :friend ?z :James :friend :Jack}Résultat(1) x = :Jules ; z = :Jack
34
Distinct
select ?x ?z :Jules :friend :Jimwhere { :Jim :friend :Jack?x :friend ?y :Jules :friend :James?y :friend ?z :James :friend :Jack}Résultat(1) x = :Jules ; z = :Jack(2) x = :Jules ; z = :Jack
35
Order by
select ?pers ?date :Jim :author :d2 where { :Jack :author :d1?pers :author ?doc :d2 :date 2008-01-01?doc :date ?date :d1 :date 2007-12-31}order by ?dateRésultat(1) pers = :Jim ; date = 2007-12-31(2) pers = :Jack ; date = 2008-01-01
36
Order by
select ?doc ?date :Jim :author :d2 where { :Jack :author :d1?pers :author ?doc :Jack :author :d3?doc :date ?date :d2 :date 2008-01-01} :d1 :date 2007-12-31order by ?date :d3 :date 2007-12-31desc(?doc)Résultat(1) doc = :d3 ; date = 2007-12-31(2) doc = :d1 ; date = 2007-12-31(3) doc = :d2 ; date = 2008-01-01
38
Limit/Offset
select * where {PATTERN}LIMIT 20OFFSET 1020 résultats (au plus), après le 10èmei.e. de 11 à 30
40
Construct
construct { :Jules :sister :Jil?girl :brother ?boy}where {?boy :sister ?girl}Résultat:Jil :brother :Jules
41
Discribe
describe ?x where {?x rdf:type :HotTopic?x :date ?datefilter (?date >= ‘2007-12-31’^^xsd:date)}Retourne une description des ?x, dépend de l’application (du serveur)
44
Negation as failure
Les personnes qui sont membre d’une organisation et qui n’ont pas créé de doc :SELECT * WHERE {?x c:isMemberOf ?org .OPTIONAL {?x c:hasCreated ?doc}FILTER (! bound(?doc))}
45
Fonction externe (user defined)
PREFIX fun: <function://fr.inria.package>SELECT * WHERE {?x c:age ?age .FILTER fun:prime(?age)}
46
Format Résultat XML
<?xml version="1.0"?><sparql xmlns="http://www.w3.org/2005/sparql-results#"> <head>
<variable name="x"/><variable name="hpage"/><variable name="name"/><variable name="age"/><variable name="blurb"/>
</head>...</sparql>
47
Format Résultat XML
<?xml version="1.0"?><sparql xmlns="http://www.w3.org/2005/sparql-results#"> <head> ... </head> <results> <result>... </result> <result>... </result> </results></sparql>