W3C SPARQL (Simple Protocol And RDF Query Language) BALI Ahmed Master informatique 2012/ Basé sur le cours de olivier corby (INRIA)
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
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. Cest au serveur de triplets (e,g dbpedia) de faire les inférences et de délivrer les bons triplets 3
A partir dune base RDF : Extraire de linformation : URI, literal, datatype literal Extraire un sous graphe RDF Construire un graphe résultat 4
SPARQL: exemple PREFIX foaf: SELECT ?mbox WHERE { ?x foaf:name "Johnny Lee Outlaw". ?x foaf:mbox ?mbox } 5
Syntaxe SPARQL : Triple URI: Qname: rdf:type foaf:name Variable: ?x ?name Blank Node (variable anonyme): _:b1 _:b2 Literal: Literal 3.14 true 12^^xsd:integer 6
Syntaxe SPARQL : Triple subject property object foaf:name ?name ?x foaf:name 'Omar' ?x ?p 'Omar' _:b1 foaf:age 49 7
Syntaxe SPARQL ?x c:firstName ?y. ?x c:lastName ?z ?x c:firstName ?y ; c:lastName ?z 8
Syntaxe SPARQL ?x c:name Omar. ?x c:name Zaid. ?x c:name Omar, Zaid. 9
Blank Node _:b [] _:b c:speed ?v ?x c:speed [] Blank: comme une variable non retournée en résultat 10
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' 11
Blank Node ?x c:speed [ rdf:value ?val ; c:unit 'km/h' ] Interroger le design pattern des relations n-aires: 100 km/h 12
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 13
Test : Filtre FILTER (?age >= 7 && ?age <= 77) Comparaison : = > != Opération : + * / - Booléen : && (and) || (or) ! (not) Fonction : isBlank(?x) my:fun(?y) 14
Syntaxe Abstraite Filtre EXP ::= TERM | EXP OPER EXP | (EXP) TERM ::= VAR | CST | FUN CST ::= URI | Literal OPER ::= = > + - * / && || ! FUN ::= NAME( EXP* ) 15
Tests et datatypes 1 = 1.0 1^^xsd:integer = 1.0^^xsd:decimal ?x + ?y < 0.1 * ?z 16
Tests regex(?string,.*master.*) engineer != engineer = 17
Tests: fonctions isURI(?x) isLiteral(?y) isBlank(?z) bound(?t) 18
Tests lang(?x) = en -> true -> false datatype(?y)= xsd:string ! (?x || ?y && ?z) 19
Exercice 1. Trouver lage des ressources dont le nom est Salim 2. Trouver le nom des ressources dont lage est inférieur à 50, 3. Trouver les valeurs des propriétés des ressources dont le nom est Salim et lage inférieur à 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 valeur 6. Trouver les ressources qui ont deux fois la même propriété avec des valeurs différentes 20
Exercice 1. Trouver lage des ressources dont le nom est Salim select ?age where { ?x name Salim. ?x age ?age } 2. Trouver le nom des ressources dont lage est inférieur à 50 select ?name where { ?x name ?name. ?x age ?age filter(?age < 50) } 3. Trouver les valeurs des propriétés des ressources dont le nom est Salim et lage inférieur à 50 select ?p ?y where { ?x name Salim. ?x age ?age filter(?age < 50) ?x ?p ?y } 21
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 valeur select * 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érentes select * where { ?x ?p ?y. ?x ?p ?z filter(?y != ?z)} 22
Pattern optionnel SELECT * WHERE { ?x :hasCreated ?doc. OPTIONAL { ?x :isMemberOf ?org } hasCreated est obligatoire isMemberOf est optionnel 23
Pattern optionnel SELECT * WHERE { :John :hasCreated :d1 ?x :hasCreated ?doc :John :hasCreated :d2 OPTIONAL { :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 24
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 25
Pattern optionnel SELECT * WHERE { :John :hasCreated :d1 ?x :hasCreated ?doc. :John :hasCreated :d2 OPTIONAL { :Jack :hasCreated :d3 ?x :age ?age. :Jack :isMemberOf :club ?x :isMemberOf ?org :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 = unbound ; age = unbound (4) x = :Jim ; doc = :d4 ; org = :assoc ; age = 45 26
Pattern optionnel SELECT * WHERE { :John :hasCreated :d1 ?x :hasCreated ?doc. :John :hasCreated :d2 OPTIONAL {?x :age ?age} :Jack :hasCreated :d3 OPTIONAL {?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 27
Pattern optionnel avec test SELECT * WHERE { ?x :hasCreated ?doc. OPTIONAL { ?x :age ?age FILTER (?age < 45). ?x :isMemberOf ?org. } 28
Pattern UNION SELECT * WHERE { :Barack :apply :Presidency {?x :apply ?job} :Barack :play :BasketBall UNION :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 29
RDF Dataset Interroger une base de plusieurs graphes Des graphes nommés avec des URI Un graphe par défaut Identifier les graphes interrogés 30
Résultat SELECT * WHERE SELECT DISTINCT ?x ?y WHERE ORDER BY ?x DESC(?y) LIMIT 10 OFFSET 10 31
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 32
Distinct select distinct ?x ?z :Jules :friend :Jim where { :Jim :friend :Jack ?x :friend ?y :Jules :friend :James ?y :friend ?z :James :friend :Jack } Résultat (1) x = :Jules ; z = :Jack 33
Distinct select ?x ?z :Jules :friend :Jim where { :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 34
Order by select ?pers ?date :Jim :author :d2 where { :Jack :author :d1 ?pers :author ?doc :d2 :date ?doc :date ?date :d1 :date } order by ?date Résultat (1) pers = :Jim ; date = (2) pers = :Jack ; date =
Order by select ?doc ?date :Jim :author :d2 where { :Jack :author :d1 ?pers :author ?doc :Jack :author :d3 ?doc :date ?date :d2 :date } :d1 :date order by ?date :d3 :date desc(?doc) Résultat (1) doc = :d3 ; date = (2) doc = :d1 ; date = (3) doc = :d2 ; date =
Limit/Offset select * where { PATTERN } LIMIT résultats au plus 37
Limit/Offset select * where { PATTERN } LIMIT 20 OFFSET résultats (au plus), après le 10ème i.e. de 11 à 30 38
Construct construct { ?girl :brother ?boy } where { ?boy :sister ?girl } 39
Construct construct { :Jules :sister :Jil ?girl :brother ?boy } where { ?boy :sister ?girl } Résultat :Jil :brother :Jules 40
Discribe describe ?x where { ?x rdf:type :HotTopic ?x :date ?date filter (?date >= ^^xsd:date) } Retourne une description des ?x, dépend de lapplication (du serveur) 41
Ask ask {:Olivier :teach :ensi} yes/no answer 42
Négation Trouver les personnes qui sont membre dune organisation et qui nont pas créé de doc 43
Negation as failure Les personnes qui sont membre dune organisation et qui nont pas créé de doc : SELECT * WHERE { ?x c:isMemberOf ?org. OPTIONAL { ?x c:hasCreated ?doc } FILTER (! bound(?doc)) } 44
Fonction externe (user defined) PREFIX fun: SELECT * WHERE { ?x c:age ?age. FILTER fun:prime(?age) } 45
Format Résultat XML <sparql xmlns=" 46
Format Résultat XML <sparql xmlns=" 47
Format Résultat XML r2 Bob 30 48