Web des données

Option GCN - Polytech Nantes
09/10/2019


Benjamin Hervy
benjamin.hervy@mazedia.fr

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

  1. nés à Paris
  2. nés entre 1850 et 1920
  3. 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

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 :

  1. Trouvez la liste de toutes les femmes astronautes américaines.
  2. Est-ce que Carl Sagan est toujours en vie ?
  3. Combien d'objets célestes répertoriés sont en orbite autour du soleil ?
  4. Parmi eux, combien sont des astéroides ?
  5. Combien y a t-il d'observatoires astronomiques recensés dans Wikidata ?
  6. BONUS : Les placer sur une carte avec une infobulle et des liens

Quelques exemples de mashup

Chronoisidore

http://www.stephanepouyllau.org/labs/isidore/chronosidore/

Musées de France

OpenCat

Flybase

data.gov.uk

WD - SPARQL

By benjaminh

WD - SPARQL

  • 1,045