Programme
- Introduction au web des données (web sémantique, LinkedOpenData)
- Modélisation RDF (TD)
- Introduction au langage SPARQL
- TP Requêtes SPARQL
SPARQL
1 - définitions
S-PARQL Protocole And Request Query Language est un langage de requêtes du W3C pour RDF/RDFS
- recommandation W3C du 15-01-2008 pour le langage SPARQL 1.0
- recommandation W3C du 21-03-2013 pour le langage SPARQL 1.1
- Le langage utilise du pattern matching sur la donnée graphe
On cherche les valuations des variables qui soient des sous-graphes de la donnée.
2 - Parcours d'un graphe pas à pas...
2 - Parcours d'un graphe pas à pas...
2 - Parcours d'un graphe pas à pas...
3 - Exemple basique
4 - COMPOSITION D'UNE REQUETE SPARQL
4 - COMPOSITION D'UNE REQUETE SPARQL
- SELECT permet de sélectionner des résultats à partir de variables (notées avec un $ ou un ?) inclus dans le WHERE
- La clause DISTINCT permet de supprimer les doublons automatiquement
- Possibilité de créer des valeurs à partir d'expressions : la clause CONCAT par exemple :
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ( CONCAT(?G, " ", ?S) AS ?name )
WHERE { ?P foaf:givenName ?G ; foaf:surname ?S }
Autres requêtes possibles :
ASK -> permet de vérifier la présence de triplets
CONSTRUCT -> permet de re-modéliser des nouveaux triplets
CONSTRUCT { ?resource dc:title ?label } WHERE { ?resource rdfs:label ?label }
ASK { ?resource dc:title ?label }
Cibler un graphe à fouiller
FROM
PREFIX mit: <http://mit.edu#>
SELECT ?student
FROM <http://mit.edu/data.rdf>
WHERE
{ ?student mit:registeredAt ?y .
}
PREFIX mit: <http://mit.edu#>
SELECT ?student
FROM <http://mit.edu/data.rdf>
WHERE
{
GRAPH <http://mit.edu/data.rdf> { ?student mit:registeredAt ?y . }
}
Triplets et noeuds blancs
Triplets et noeuds blancs
La clause WHERE
permet de définir l'ensemble des contraintes à vérifier
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/ >
SELECT ?auteur ?depiction WHERE {
?auteur a dbpedia:Writer.
?auteur foaf:depiction ?depiction.
?auteur dbpedia:birthPlace <http://dbpedia.org/resource/Paris>.
}
des clauses peuvent être ajoutées :
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/ >
SELECT ?auteur ?depiction WHERE {
?auteur a dbpedia:Writer.
OPTIONAL {?auteur foaf:depiction ?depiction.}
?auteur dbpedia:birthPlace <http://dbpedia.org/resource/Paris>.
}
OPTIONAL
Filtrer les résultats
PREFIX ex: <http://msh.univ-nantes.fr/schema#>
SELECT ?personne ?name
WHERE
{ ?personne rdf:type ex:Person ;
ex:name ?name ;
ex:age ?age .
FILTER (xsd:integer(?age) >= 18)
}
Opérateurs de test
- >=, >, =, !=, etc.
- regex(?x, "A.*")
- isURI(), isBlank(), isLiteral()
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbpedia2: <http://dbpedia.org/property/>
SELECT ?name ?birthname WHERE {
?x foaf:name ?name .
?x dbpedia2:birthName ?birthname .
FILTER regex (str(?name), "^Amade*", "i")
FILTER (lang(?name) = 'en')
} LIMIT 100
- - lang(), datatype(), str()
- - xsd:integer(?x)
- - YEAR(date)…
- - ABS(), MD5()…
opérateurs de tests |accéder aux attributs |transformer/caster les valeurs etc...
Filtrer les résultats
Instruction de test
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT *
WHERE
{ ?x foaf:name ?name ; foaf:age ?age .
FILTER (if (langMatches(lang(?name), "FR")), ?age>=18, ?age>=21)
}
Filtrer les résultats
IN, EXISTS
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT *
WHERE
{ ?x foaf:name ?name .
FILTER ( ?name IN ("benjamin", "stephane") )
}
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT *
WHERE
{ ?x foaf:name ?name .
FILTER NOT EXISTS { ?x foaf:age -1 }
}
La clause UNION
UNION permet d'exprimer l'opérateur booléen "OU" (inclusif)
SELECT ?auteur WHERE {
?auteur a dbpedia-owl:Person .
{
{?auteur dbpedia-owl:birthPlace dbpedia-fr:Paris .}
UNION
{?auteur dbpedia-owl:birthPlace dbpedia-fr:Besançon .}
}
}
Trier, filtrer, limiter, aggréger
ORDER BY, LIMIT, OFFSET, GROUP BY
PREFIX mit: <http://mit.edu#>
SELECT ?student ?score
FROM <http://mit.edu/data.rdf>
WHERE
{ ?student mit:score ?score .
}
GROUP BY ?student
HAVING (AVG(?score) >= 10)
LIMIT 100
Négations : Not exists, Minus
Comment récupérer les auteurs qui n'ont pas le prédicat ?depiction
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/ >
SELECT ?auteur ?depiction WHERE {
?auteur a <http://dbpedia.org/class/yago/FrenchNovelists>.
?auteur foaf:depiction ?depiction.
?auteur dbpedia:birthPlace <http://dbpedia.org/resource/Paris>.
}
SELECT ?auteur ?depiction WHERE {
?auteur a <http://dbpedia.org/class/yago/FrenchNovelists>.
FILTER NOT EXISTS { ?auteur foaf:depiction ?depiction. }
?auteur dbpedia:birthPlace <http://dbpedia.org/resource/Paris>.
}
FILTER NOT EXISTS
SELECT ?auteur ?depiction WHERE {
?auteur a <http://dbpedia.org/class/yago/FrenchNovelists>.
MINUS { ?auteur foaf:depiction ?depiction. }
?auteur dbpedia:birthPlace <http://dbpedia.org/resource/Paris>.
}
MINUS
Requête imbriquée
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE
{
{
SELECT (max(?age) as ?max)
WHERE { ?person foaf:age ?age }
}
?senior foaf:age ?max .
?senior foaf:name ?name
}
Modifier un graphe RDF
INSERT, DELETE
PREFIX ex: <http://example.org/>
DELETE { ?x a ex:Musician }
INSERT { ?x a ex:Artist }
WHERE { ?x a ex:Musician }
PREFIX ex: <http://example.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
INSERT DATA
{
ex:Jimmy foaf:name "Jimmy" ;
foaf:knows ex:John, ex:Robert .
}
METHODOLOGIE : découvrir les données d'un SPARQL Endpoint pas à pas
1 - découvir les types de ressources présentes dans l'entrepôt
SELECT DISTINCT ?Concept WHERE
{
?s a ?Concept
}
2 - Explorer les prédicats distincts liés à une ressource d'un type
SELECT DISTINCT ?predicat WHERE
{
?sujet a <http://xmlns.com/foaf/0.1/Person> .
?sujet ?predicat ?objet.
}
3 - Rechercher les ressources de ce type en associant un des prédicats trouvés.
SELECT DISTINCT ?sujet ?objet WHERE
{
?sujet a <http://xmlns.com/foaf/0.1/Person> .
?sujet <http://www.w3.org/2000/01/rdf-schema#label> ?objet .
}
4 - Rechercher tous les triplets dont une ressource particulière est sujet
select distinct ?predicat ?objet
where
{
<http://dbpedia.org/resource/Bill_Clinton> ?predicat ?objet.
}
5 - Compliquer la requête pour commencer à parcourir le graphe
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix dbpr: <http://dbpedia.org/property/>
select distinct ?label
where
{
<http://dbpedia.org/resource/Bill_Clinton> dbpr:placeOfBirth ?objet.
?objet rdfs:label ?label
}
Protocole d'échange
Communication via HTTP :
- GET /sparql?query=<encoded query>
- Host: fr.dbpedia.org
- User-agent : my-sparql-client/0.1
Protocole d'échange
Service web via SOAP :
POST /services/sparql-query HTTP/1.1
Content-Type: application/soap+xml
Accept: application/soap+xml, multipart/related, text/*
User-Agent: Axis/1.2.1
Host: www.example
SOAPAction: ""
Content-Length: 438
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<query-request
xmlns="http://www.w3.org/2005/09/sparql-protocol-types/#">
<query>
SELECT ?z {?x ?y ?z . FILTER regex(?z, 'Harry')}
</query>
</query-request>
</soapenv:Body>
</soapenv:Envelope>
Exercice
À partir de http://fr.dbpedia.org/page/Victor_Hugo
Chercher la liste des écrivains
- nés à Paris
- nés entre 1850 et 1920
- avec leur nom en chinois
Exercice
Quelles sont les communes de la région Ile de France ?
data.insee.fr
Exercice
Que retourne cette requête ?
prefix foaf: <http://xmlns.com/foaf/0.1/>
select distinct ?x ?z where {
?x foaf:knows ?y .
?z foaf:knows ?y
filter (?x != ?z)
}
ex:John foaf:knows ex:Jack, ex:James .
ex:Jim foaf:knows ex:James, ex:Jack .
Exercice
Que fait cette requête ?
(traduire la requête en question)
prefix ex: <http://example.org/>
delete { ?x ex:age ?a }
insert { ?x ex:age ?i }
where {
select ?x (xsd:integer(?a) as ?i)
where {
?x ex:age ?a
filter(datatype(?a) = xsd:string)
}
}
Exercice
Trouver les noms des présidents américains sur wikidata
Présentation Wikidata et exemple de projet
Boîte à outils
Boîte à outils
Linked data frameworks
- Apache Jena : https://jena.apache.org/
- Virtuoso : https://virtuoso.openlinksw.com/
- DataLift : http://www.datalift.org
- RDF4j (Sesame) : http://rdf4j.org/
- Corese (INRIA) : http://wimmics.inria.fr/corese
- … https://fr.wikipedia.org/wiki/Triplestore
Boîte à outils
Conception d'une ontologie
Protégé : protege.stanford.edu
Boîte à outils
SPARQL Editors
Twinkle : http://www.ldodds.com/projects/twinkle/
Et plein d'autres sur le web :
http://yasqe.yasgui.org/, http://sparql.carsten.io/
data.bnf.fr/sparql/
fr.dbpedia.org/sparql
…
Boîte à outils
Visualisation de données
Gephi : https://gephi.org/
Semantic Web Import Plugin
Aussi : Sigma.js, D3.js, etc.
http://blog.sparna.fr/
Travaux pratiques
En utilisant le SPARQL Endpoint de DBPedia ou Wikidata, répondez aux questions suivantes en précisant les classes, propriétés et entités manipulées :
- Trouvez la liste de toutes les femmes astronautes américaines.
- Est-ce que Carl Sagan est toujours en vie ?
- Combien d'objets célestes répertoriés sont en orbite autour du soleil ?
- Parmi eux, combien sont des astéroides ?
- Combien y a t-il d'observatoires astronomiques recensés dans Wikidata ?
- BONUS : Les placer sur une carte avec une infobulle et des liens
Quelques exemples de mashup
http://www.stephanepouyllau.org/labs/isidore/chronosidore/
WD - SPARQL
By benjaminh
WD - SPARQL
- 1,149