Travaux pratiques (LODAS – version Notebook / Maison)

1 TP – XPath

Préparation

  • installer Anaconda/Jupyter (si nécessaire: vous pouvez ausssi essayer de lancer jupyter-notebook )
  • installer GraphViz (si nécessaire: sur Linux, graphviz est souvent installé par défaut)
  • créez un repertoire LODAS/notebooks
  • téléchargez et décompressez les fichiers lodas_notebooks_tme_data et lodas_notebooks_tme1 disponibles sur Moodle.

1.1 Exercices XPath

Exercice : Ouvrir le notebooks xpath. Exécutez les expressions XPath et analysez les réponses.

Exercice: Complétez le notebook avec les expression manquantes pour les deux documents  data/roisdefrance.xml et data/roisdefranceplat.xml

1.2 Exercices XQuery (optionnel)

Exercice: Exprimez les requêtes XPath du notebook avec XQuery en utilisant le logiciel BaseX

  • Installer et lancer BaseX
  • Créer une nouvelle base de données (Database->new)
    • ouvrir le répertoire data (tous les fichiers XML de ce répertoire sont chargés)
  • On peut écrire les requêtes XQuery dans le frame Editor:
    • Les noms des épouses de rois:
      for $a in //Roi/epouse return $a/*/nom
    • Les titres des oeuvres de Shakespeare
      for $a in //PLAY return $a/TITLE
    • Les personnage d’Hamlet
      for $a in //PLAY 
      where $a/TITLE = "The Tragedy of Hamlet, Prince of Denmark"
      return $a//PERSONA
    • La scène avec les paroles ‘To be, or not to be…’:
      for $a in //PLAY, $s in $a//SCENE,$p in $s//SPEECH, $x in $p//SPEAKER
      where $a/TITLE = "The Tragedy of Hamlet, Prince of Denmark"
        and $p//LINE = "To be, or not to be: that is the question:"
      return <SCENE>{ $s/TITLE, $x, $p } </SCENE>
    • Les titres des scènes avec les paroles de Hamlet:
      for $a in //PLAY,  $s in $a//SCENE
      where $a/TITLE = "The Tragedy of Hamlet, Prince of Denmark"
      return <SCENE>{ $s/TITLE,
                      for $p in $s//SPEECH, $x in $p//SPEAKER
                      let $l:=$p//LINE
                      where fn:starts-with($x,"HAMLET")
                      return ($x, $l) }
      </SCENE>

2 TP – Manipulation RDF

On utilise les outils suivants:

Téléchargez et décompressez le fichier lodas_notebooks_tme2 (sur Moodle) dans le repertoire LODAS/notebooks créé pendant le premier TP

Exercice: Exécutez et complétez le noteboock manipulationrdf.

3 TP – SPARQL

Préparation:

Téléchargez et décompressez le fichier lodas_notebooks_tme3 (sur Moodle) dans le répertoire LODAS/notebooks

Exercice :

  1. Lancez le serveur Jena/Fuseki (startfuseki)
  2. Creez un dataset TDB2 avec le nom tpsparql en utilisant l’interface du serveur Fuseki http://localhost:3030 :
    1. manage datasets-> add new dataset
    2. Dataset name : tpsparql
    3. Dataset type : TDB2
  3. Chargez le fichier data/roisdbpedia.nt dans le graphe nommé http://localhost:3030/roisdbpedia du dataset tpsparql  :
    1. dataset -> upload files (choisir Dataset tpsparql)
    2. Destination graph name: http://localhost:3030/roisdbpedia
    3. select files : data/roisdbpedia.nt
    4. upload all

3.1 Interrogation d’un seul graphe

Exercice: Evaluez les requêtes SPARQL suivantes sur le graphe RDF roisdbpedia en utilisant l’interface de Fuseki (localhost:3030)

  • dataset -> query (choisir Dataset tpsparql)

Une alternative est d’utiliser le notebook sparqlkernel qui nécessite l’installation d’un noyeau notebook SPARQL (https://github.com/paulovn/sparql-kernel)

Exercice : Exécutez les requêtes suivantes

  • Les classes (types) et les propriétes de tous les objets:
PREFIX asws: <http://www.asws.com/rois#>
PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT distinct ?c ?p
FROM <http://localhost:3030/roisdbpedia>
WHERE { ?a a ?c; ?p ?b }
ORDER BY ?c ?p
  • Les noms des rois avec leur date de naissance (obligatoire).
    PREFIX asws: <http://www.asws.com/rois#>
    PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    SELECT ?n ?d
    FROM <http://localhost:3030/roisdbpedia>
    WHERE { ?a a asws:Roi; asws:nom ?n; asws:datenaiss ?d }
    ORDER BY ?d

Exercice : Ecrivez et évaluez les requêtes suivantes

  1. Les noms des rois avec leur date de naissance (optionnel)
  2. Les noms des reines avec les noms des époux.
  3. Les noms des reines qui sont nées la même année que leurs époux avec les noms de leurs époux (il faut utiliser la fonction year).
  4. Les noms des rois sans fils (deux solutions).

Exercice : Expliquez le résultat de la requête suivante:

PREFIX asws: <http://www.asws.com/rois#>
PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?n
FROM <http://localhost:3030/roisdbpedia
WHERE { { ?a asws:nom ?n } MINUS { ?b asws:fils ?f } }

3.4 Interrogation de plusieurs graphes nommées

Exercice : Créez dans le dataset tpsparql un graphe nommé  http://localhost:3030/roisschema et chargez le fichier data/rois_schema.ttl dans ce graphe .

  1. dataset -> upload files (choisir Dataset tpsparql)
  2. Destination graph name: http://localhost:3030/roisschema
  3. select files : data/rois_schema.ttl
  4. upload all

Exercice: Interrogation de schéma RDFS:

  • Toutes les propriétés

PREFIX asws: <http://www.asws.com/rois#>
PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?a
FROM <http://localhost:3030/roisschema>
WHERE { ?a a rdf:Property }
ORDER BY ?a

Exercice : Ecrivez et évaluez les requêtes suivantes

  • Toutes les propriétés et leurs sous propriétes (optionnel)
  • Toutes les classes et leurs sous-classes.

Exercice: Evaluez et expliquez les réponse des requêtes suivantes:

  • Requête 1:
PREFIX asws: <http://www.asws.com/rois#>
PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?a ?v
 FROM  <http://localhost:3030/roisdbpedia>
 FROM  <http://localhost:3030/roisschema>
 WHERE {
 ?a ?q ?v . ?v rdf:type rdfs:Class .
 ?a asws:fils asws:Louis_XI . }
  • Requête 2:
PREFIX asws: <http://www.asws.com/rois#>
PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?h ?j ?a ?v
 FROM  NAMED <http://localhost:3030/roisdbpedia>
 FROM  NAMED <http://localhost:3030/roisschema>
 WHERE {
 GRAPH ?h { ?a ?q ?v . ?a asws:fils asws:Louis_XI . }
 GRAPH ?j { ?v rdf:type rdfs:Class . }
 }

  • Requête 3:
PREFIX asws: <http://www.asws.com/rois#>
PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT ?h ?j ?a ?v
 FROM  NAMED <http://localhost:3030/roisdbpedia>
 FROM  NAMED <http://localhost:3030/roisschema>
 WHERE {
 GRAPH ?h { ?a ?q ?v . ?a asws:fils asws:Louis_XI . }
 GRAPH ?h { ?v rdf:type rdfs:Class . }
 }
  • Requête 4:
PREFIX asws: <http://www.asws.com/rois#>
PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?a ?v
 FROM NAMED <http://localhost:3030/roisdbpedia>
 FROM NAMED <http://localhost:3030/roisschema>
 WHERE {
 ?a ?q ?v . ?v rdf:type rdfs:Class .
 ?a asws:fils asws:Louis_XI . }

Exercice: Définissez et évaluez les requêtes SPARQL suivantes sur le graphe RDF roisdbpedia et le schéma RDFS roisschema:

  • Toutes les instances des sous-classes de la classe asws:Homme.
  • Tous les triplets (?a ?p ?b) qui relient une ressource ?a du graphe data/roisdbpedia.ttl à une ressource ?b du graphe data/rois_schema.ttl (graphes nommés).

3.5 Expressions de chemins

Exercice : Ajoutez le fichier succdbpedia.ttl au graphe nommé  http://localhost:3030/roisdbpedia . Il y a deux propriétes:

  • asws:successeur : le/la successeur directe d’une personne.
  • asws:enfant : les enfants d’une personne

Exercice: Définissez et évaluez les requêtes SPARQL suivantes sur le graphe RDF roisdbpedia:

  • Tous les successeurs directes et indirectes de Louis XVI.
  • Les noms de toutes les instances de sous-classes directes et indirectes de la classe asws:Personne.
  • Les noms des personnes et de leurs conjoints.
  • Les noms des personnes et de leurs enfants:
    • en utilisant la propriété asws:enfant
    • en utilisant les propriétés asws:fils, asws:fille, asws:pere, asws:mere
  • Les noms des personnes et de leurs descendants.

3.6 Requêtes d’aggrégation

  • Le nombre de successeurs par roi ou reine.
  • Le nombre d’enfants par roi ou reine.
  • Le nombre d’époux par reine.
  • Le nombre de roi et de reines par dynastie.
  • Le nombre de descendants et d’ancêtres par roi ou reine.

4 TP – Règles RDF

  1. Téléchargez et décompressez le fichier lodas_notebooks_tme4 (sur Moodle) dans le répertoire LODAS/notebooks
  2. Suivez les instructions du notebook.

5 TP – OWL et SPARQL

5.1 Préparation

  • Téléchargez et décompressez le fichier lodas_notebooks_tme5
  • Le programme owlsparql permet d’exécuter des requêtes SPARQL sur des graphes RDF (ABOX) avec une ontology OWL (TBOX):
    usage: java owlsparql
     -d,--data <arg>     data file path
     -f,--format <arg>   output format (optional): TURTLE (default) NT JSON-LD
                         RDF/XML-ABBREV
     -n,--newfacts       produce only new facts
     -o,--owl <arg>      OWL ontology file path (optional)
     -q,--query <arg>    SPARQL query file path (optional)
  • Il existe déjà une version compilée (owlsparql.class) que vous pouvez tester. Si nécessaire, vous pouvez rompilez le programme owlsparql.java :
    cd owl
    mkdir gendata
    cp data/* gendata
    javac owlsparql.java

5.2 Exercice

Exercice: Suivez les instructions du notebook owl.

6 TP – SPARQL et Optimisation

Version Notebook

  1. Décompressez le fichier lodas_notebooks_tme6.zip dans le répertoire LODAS/notebooks
  2. Exécutez le notebook optimisation.ipynb

Version Shell

  1. Décompressez le fichier lodas_notebooks_tme6.zip dans le répertoire LODAS/notebooks
  2. Créer la base dbpedia.tdb:
    1. Option 1
      1. télécharger le fichier suivant et le décompresser dans le répertoire /tmp/ à la place:
      2. https://moodle-sciences.upmc.fr/moodle-2020/mod/resource/view.php?id=93127
    2. Option  2
      1. Télécharger https://downloads.dbpedia.org/repo/dbpedia/mappings/mappingbased-objects/2020.10.01/mappingbased-objects_lang=en.ttl.bz2 (21M triplets)
      2. exécuter la commande tdbloader2 –loc=$RDFDB mappingbased-objects_lang=en.ttl.bz2
      3. d’autres fichiers sont disponible ici: https://wiki.dbpedia.org/develop/datasets/latest-core-dataset-releases

Linux / Mac ?

export LODAS_HOME="/home/..."
cd $LODAS_HOME
-- télécharger et decompresser lodas_notebooks_tme6.zip
cd sparql
wget https://downloads.dbpedia.org/repo/dbpedia/mappings/mappingbased-objects/2020.10.01/mappingbased-objects_lang=en.ttl.bz2
export JENA_HOME=$LODAS_HOME/apache-jena-3.16.0 
export PATH=$JENA_HOME/bin:$PATH 
export JVM_ARGS="-Xms512m -Xmx2048M -XX:-UseGCOverheadLimit -XX:+UseParallelGC" 
export RDFDB=/tmp/dbpedia.tdb 
tdbloader2 --loc=$RDFDB mappingbased-objects_lang=en.ttl.bz2

Windows

set LODAS_HOME=\Users\...
cd %LODAS_HOME%
-- télécharger et decompresser lodas_notebooks_tme6.zip
cd sparql
-- https://downloads.dbpedia.org/repo/dbpedia/mappings/mappingbased-objects/2020.10.01/mappingbased-objects_lang=en.ttl.bz2
set JENA_HOME=%LODAS_HOME%\apache-jena-3.16.0\
set PATH=%JENA_HOME%\bat;%PATH%
set JVM_ARGS=-Xms512m -Xmx2048M -XX:-UseGCOverheadLimit -XX:+UseParallelGC
set RDFDB=\tmp\dbpedia.tdb
mkdir \tmp
tdbloader.bat --loc=%RDFDB% mappingbased-objects_lang=en.ttl.bz2

Commandes

Génération de statistiques sur une base TDB

tdbstats --loc=DIR [--graph=URI]
  • DIR indique l’entrepôt RDF ($RDFDB)
  • URI indique l’URI d’un graphe dans l’entrepôt

Les statistiques sont décrites sous forme de motifs

((subj pred obj) count)

  • subj, pred et obj peuvent prendre la valeur VAR (une variable), TERM (un terme), ANY (une variable ou un terme) ou indiquer une URI;
  • count indique le nombre d’occurrences.

Par exemple:

  • ((TERM TERM TERM) 1) indique que chaque triplet a une occurrence.
  • ((TERM p:prop VAR) 1) indique que la propriété p:prop est une propriété fonctionnelle

Le motif (predicate count) est un raccourci pour:

((TERM predicate ANY) X)
((ANY predicate TERM) Y)
((ANY predicate ANY) count)

X et Y dépendent de la taille du graphe. Voir https://jena.apache.org/documentation/tdb/optimizer.html pour plus de détails.

Interrogation d’une base TDB

tdbquery [--time] [--debug] [--explain] --loc=DIR  --query=<FILE>
  • –time (optionnel) retourne le temps d’exécution de la requête
  • –debug (optionnel) affiche le plan d’exécution de la requête
  • –explain (optionnel) affiche le plan d’exécution de la requête plus d’autres informations (voir partie optimisation)
  • DIR indique l’entrepôt RDF ($RDFDB)
  • FILE indique le fichier avec la requête SPARQL

Interrogation d’une base TDB

Désactivez l’optimiseur SPARQL de Jena/TDB:

Linux:

rm $RDFDB/*.opt; touch $RDFDB/none.opt

Windows:

del %RDFDB%\*.opt
echo none > %RDFDB%\none.opt

Exercice: Affichez et évaluez la requête tdb/q1.sparql

Linux:
tdbquery --time --loc=$RDFDB --query=tdb/q1.sparql

Windows:
tdbquery.bat --time --loc=%RDFDB% --query=tdb/q1.sparql

 

Exercice: Affichez et évaluez les deux requêtes SPARQL suivantes sur la base yago.tdb et comparez les performances en utilisant l’option –time (vous pouvez arrêter l’évaluation d’une requête avec CTL-C):

Linux:

tdbquery --time --loc=$RDFDB --query=<requête>
Windows:
tdbquery.bat  --time --loc=%RDFDB% --query=<requête>

tdb/q2a.sparql

tdb/q2b.sparql

Qu’est-ce que vous observez ?

Exercice: Affichez et évaluez les deux requêtes SPARQL précédentes sur la base $RDFDB et comparez les plans d’exécution et le temps d’exécution en utilisant les options –debug et –time:

Linux:
tdbquery --time --debug --loc=$RDFDB --query=<requête>
Windows:
tdbquery.bat  --time --debug --loc=%RDFDB% --query=<requête>

Qu’est-ce que vous observez ?

Exercice: Affichez et évaluez les equêtes SPARQL suivantes sur la base $RDFDB et comparez les plans d’exécution et le temps d’exécution (vous pouvez arrêter l’évaluation d’une requête avec CTL-C):

  1. sparql/tdb/q3a.sparql
  2. sparql/tdb/q3b.sparql
  3. sparql/tdb/q3c.sparql
  4. sparql/tdb/q4a.sparql
  5. sparql/tdb/q4b.sparql
  6. sparql/tdb/q5a.sparql
  7. sparql/tdb/q5b.sparql
  8. sparql/tdb/q6a.sparql
  9. sparql/tdb/q6b.sparql
  10. sparql/tdb/q6c.sparql
  11. sparql/tdb/q6d.sparql

Qu’est-ce que vous observez ?

Optimisation de requêtes

TDB Optimizer est un outil d’optimisation de requêtes (https://jena.apache.org/documentation/tdb/optimizer.html) avec trois stratégies d’optimisation. La stratégie est choisie par la présence d’un fichier dans le répertoire de l’entrepôt RDF;

  • none.opt ne modifie pas le plan d’origine et exécute les motifs de triplets dans l’ordre de la requête
  • fixed.opt réordonne les motifs de triples par le nombre de variables dans le motif
  • stats.opt utilise des statistiques sur les données de l’entrepôt interrogé

Chaque filtre est appliqué immédiatement après l’instanciation de toutes les variables nécessaires.

Exercice: Remplacez le fichier $YAGO_DB/none.opt par un fichier (vide) $RDFDB/fixed.opt:

Linux:

rm $RDFDB/*.opt; touch $RDFDB/fixed.opt

Windows:

del %RDFDB%\*.opt
echo none > %RDFDB%\fixed.opt

 

Exercice: Affichez et évaluez les requêtes SPARQL précédentes et comparez les performances et les plans d’exécution. Qu’est-ce que vous observez ?

Exercice: Générez et affichez les statistiques de la base $RDFDB:

Linux:
tdbstats --loc=$RDFDB > rdfdb.stats less rdfdb.stats

Windows:
tdbstats.bat --loc=%RDFDB% > rdfdb.stats type rdfdb.stats
 

Exercice: Copiez les statistiques dans la base RDF:

Linux:

rm $RDFDB/*.opt ; cp rdfdb.stats $RDFDB/stats.opt

Windows:

del %RDFDB%\*.opt
copy rdfdb.stats %RDFDB%\stats.opt

Exercice: Affichez et évaluez les requêtes SPARQL précédentes et comparez les performances et les plans d’exécution. Qu’est-ce que vous observez ?

Exercice: Donnez un exemple de requête que l’optimiseur « statistique » peut optimiser, mais pas l’optimiser « règles fixes ».

7 TP – Linked-Open-Data

7.1 Préparation

  1. Téléchargez et décompressez le fichier lodas_notebooks_tme7
  2. Le notebook utilise SPARQLWrapper

7.2 Interrogation de DBPedia

Dans cet exercice on interroge deux endpoints SPARQL pour DBpedia et MusicBrainz.

  • Exécutez et complétez le notebook lod

7.4 Silk (optionnel)

Silk Workbench est une application Web qui guide l’utilisateur tout au long du processus d’intégration différentes sources de données RDF. Silk Workbench offre les fonctionnalités suivantes:

  • Il permet à l’utilisateur de gérer différents ensembles de sources de données RDF et de définir des tâches d’intégration et de résolution d’entités.
  • La résolution d’entités étant généralement un processus itératif, Silk Workbench permet à l’utilisateur d’évaluer rapidement les liens générés par la spécification de lien en cours.
  • Il permet à l’utilisateur de créer et de modifier un ensemble de liens existants pour évaluer la spécification de lien en cours.

Installez Silk: http://silkframework.org/download

  • Attention: je n’ai pas réussi l’installation sur Windows à cause d’un problème de « maximal PATH length ».

Lancez Silk Workbench et ouvrez la page http://localhost:9000:

silk-workbench

Exemple:

  • Chargez l’exemple (onglet Start)
  • Ouvrez le projet movies (double-click sur movies.
  • Examinez la tache linking movies
    • les entités reliés (bouton Properties)
    • la règle de matching appliquée (bouton Open)
  • Affichez les liens owl:sameAs générés par les règles (onglets Generate Links/Start)
  • Affichez les liens référence (onglet Reference Links) positifs, negatifs et non-étiquetés (Positive/Negative/Unlabeled).
  • Triez les règles par leurs scores (ascendant)
  • Examinez le détails des liens (bouton Expand All) par rapport aux scores obtenus.
  • Augmentez et diminuez les bornes (Treshold) dans compareTitle et compareReleaseDates et vérifiez les nouveaux liens générés ou effacés.

Exercice: Nettoyage du graphe Rois:

  • Créez un nouveau projet rois (onglet Workspace)
  • Chargez la ressource data/roisdbpedia.nt (onglet Resources)
  • Ajoutez le prefix asws:http://www.asws.com/rois# (bouton Prefixes)
  • Créez un nouveau dataset rois à partir de la ressource chargée (onglet Dataset / RDF Dump)
  • Examinez le contenu du dataset rois : Bouton Open et Onglet Sparql
  • Ajoutez le type: asws:Personne et owl:Thing à toutes les ressources du dataset rois (onglet Transform):
    • Ajoutez une tache add_personne (avec le dataset rois comme source et output)
    • Ouvrez la tache add_personne
    • Onglets Add Type Mapping, Evaluate et Execute
  • Définissez et testez une règle de matching qui créé des liens owl:sameAs entre toutes les ressources désignant la même entité.