Web des données
Option GCN - Polytech Nantes
08/10/2017
Benjamin Hervy
Stéphane Loret
{prenom}.{nom}@univ-nantes.fr
Programme
- Introduction au web des données (web sémantique, LinkedOpenData)
- Modélisation RDF (TD)
- Introduction au langage SPARQL
- TP Requêtes SPARQL et Mashup données
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 <http://dbpedia.org/class/yago/FrenchNovelists>.
?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 <http://dbpedia.org/class/yago/FrenchNovelists>.
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
Quelques exemples de mashup
http://www.stephanepouyllau.org/labs/isidore/chronosidore/
Exercice
L'entreprise X, spécialisée dans le tourisme en France, vous demande d'établir un rapport sur l'intégration des données liées ouvertes dans le site web dédiée à son activité. La direction souhaite en effet développer l'agrégation de contenu et la sérendipité pour les utilisateurs du site. Dans ce cadre, il est demandé :
- un champ de recherche avec auto-complétion des noms de commune liés à la base GeoNames
- à partir d'une requête sur un nom de commune, que la page de résultats retourne, outre les données essentielles de la commune, des connaissances sur :
- des lieux à visiter (haut-lieu, musée, etc.), des écrivains célèbres, etc.
- des idées d'ouvrage sur le lieu en question...
- des idées d'hôtel dans la mesure du possible.
- toute autre information qui participe de l'objectif initial dans la limite des contraintes techniques.
Le rapport comprendra une partie brève sur les avantages et les inconvénients de la techno.
Web des données - SPARQL
By benjaminh
Web des données - SPARQL
- 2,067