Option GCN - Polytech Nantes
08/10/2017
Benjamin Hervy
Stéphane Loret
{prenom}.{nom}@univ-nantes.fr
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
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 }
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 . }
}
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
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
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
opérateurs de tests |accéder aux attributs |transformer/caster les valeurs etc...
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)
}
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 }
}
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 .}
}
}
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
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
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
}
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 .
}
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
}
Communication via HTTP :
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>
Quelles sont les communes de la région Ile de France ?
data.insee.fr
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 .
(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)
}
}
Présentation Wikidata et exemple de projet
Protégé : protege.stanford.edu
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
…
Gephi : https://gephi.org/
Semantic Web Import Plugin
Aussi : Sigma.js, D3.js, etc.
http://blog.sparna.fr/
http://www.stephanepouyllau.org/labs/isidore/chronosidore/
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é :
Le rapport comprendra une partie brève sur les avantages et les inconvénients de la techno.