L'objectif de cette scéance de TP est de vous familiariser avec le modèle de données RDF et ses différents formats de sérialisation.

Exercice 1 : Explorer le web des données à partir de DBpedia

"DBpedia est un projet universitaire et communautaire d'exploration et extraction automatiques de données dérivées de Wikipédia. Son principe est de proposer une version structurée et sous forme de données normalisées au format du web sémantique des contenus encyclopédiques de chaque fiche encyclopédique. DBpedia vise aussi à relier à Wikipédia (et inversement) des ensembles d'autres données ouvertes provenant du Web des données." (http://fr.wikipedia.org/wiki/DBpedia)

a) Ressource DBpedia

A chaque page Wikipedia dont l'URL de la forme https://en.wikipedia.org/wiki/XXXXcorrespond une ressource DBpedia dont l'URI est http://dbpedia.org/resource/XXXXXXXX désigne le sujet de la page. Par exemple, à la page consacrée à Grenoble (https://en.wikipedia.org/wiki/Grenoble) correspond la ressource http://dbpedia.org/resource/Grenoble.

  1. Quelle l'URI désignant dans DBpedia l'Université Grenoble Alpes ?

    Solution
  2. Que se passe-t-il lorsque vous saisissez cette URI dans la barre de navigation de votre navigateur ?

    1. Que représente la page affichée dans le navigateur ?

    2. Quelle est l'URL affichée dans la barre de navigation ? Pourquoi diffère-t-elle de l'URI que vous avez saisie ?

    3. Quels ont été les échanges (requêtes et réponses HTTP) entre votre navigateur et le serveur dbpedia.org ?

    Solution
  3. Est-il possible de récupérer la description RDF de cette ressource dans le format de sérialisation Turtle ? Comment ?

    Solution
  4. Recupérez la description en Turtle de la ressource DBpedia. Que contient la ligne 14 ?

    Solution

b) Parcourir le graphe de données DBpedia

Le 3 juin 1950 Maurice Herzog et Louis Lachenal réussirent la première ascencion de l'Annapurna. Parmis les alpinistes qui participèrent à l'expédition ayant permis cette victoire se trouve Jean Couzy. Lui même a été le vainqueur de plusieurs sommets de l'Himalaya, mais savez-vous lesquels ? A quelles dates ? Et avec qui ?

Question 1: Faites une recherche sur le web pour trouver les réponses à ces questions.

Les informations précédentes sont présentes dans Wikipedia et ont été extraites pour être intégrées au graphe de données de DBpedia. On pourrait facilement les retrouver à l'aide d'une simple requête SPARQL, mais pour le moment nous allons nous contenter de les obtenir en parcourant manuellement DBpedia

Question 2: En partant de la ressource représentant Jean Couzy dans DBpedia retrouvez les informations de la question 1. Dessinez le graphe présentant les ressources de DBpedia que vous avez parcourues et les prédicats les reliant.

Solution

Dans vos réponses aux questions précédentes vous avez certainement du trouver le Makalu qui se situe dans l'Himalaya, à la frontière entre le Tibet (zone autonome Chinoise) et le Népal. Mais savez-vous dans laquelle des quatorze zones administratives* de ce pays se trouve le versant népalais de ce sommet ? Et quelle est la capitale de cette région ?

Les zones administratives du Népal (ce découpage en 14 zones a été abandonné lors de la mise en oeuvre d'une nouvelle constitution en 2015).

Question 3: Toujours en explorant le graphe RDF de DBpedia répondez à ces questions (région administrative où se trouve le versant népalais du Makalu et capitale de celle-ci) et complétez le dessin de votre graphe RDF.

Solution

Ces données ne sont pas directement dans le graphe DBpedia, mais dans un autre graphe de données auquel DBpedia est lié : Wikidata.

Wikidata is a free and open knowledge base that can be read and edited by both humans and machines. Wikidata acts as central storage for the structured data of its Wikimedia sister projects including Wikipedia, Wikivoyage, Wikisource, and others. Wikidata also provides support to many other sites and services beyond just Wikimedia projects! The content of Wikidata is available under a free license, exported using standard formats, and can be interlinked to other open data sets on the linked data web. http://www.wikidata.org

Les ressources DBpedia sont reliées aux ressources Wikidata par un lien owl:sameAs

Pouvez-vous trouver des sommets proches du Makalu ? Par exemple pourriez-vous nommer ces 4 sommets ?

sommets voisins du Makalu

Question 4: Toujours en vous servant des données DBpedia répondez à cette question.

Solution

Ces données ne sont pas directement dans le graphe DBpedia, mais dans un autre graphe de données issus du gazeeter open source Geonames.

GeoNames est une base de données géographiques gratuite et accessible par Internet sous une licence Creative Commons. L'interface est de type wiki et les utilisateurs peuvent ajouter des données, les améliorer ou corriger les données présentes.
La base de données1 contient plus de 8 millions de noms géographiques qui correspondent à plus de 6,5 millions de lieux existants. Ces noms sont classés en 9 catégories et 645 sous-catégories. Des données comme la latitude, la longitude, l'altitude, la population, la subdivision administrative, le code postal sont disponibles en plusieurs langues pour chaque emplacement. https://fr.wikipedia.org/wiki/GeoNames

Les ressources DBpedia sont reliées aux ressources issues de GeoNames par un lien owl:sameAs. Dans DBpedia, ces ressources sont identifiées par des URI préfixées par le préfixe geodata:.

La video ci-dessous vous montre comment accéder aux données geonames depuis DBpedia.

Exercice 2: Le langage Turtle

Parmi les nombreux langages de sérialisation de RDF (N-Triple, RDF/XML, JSON-LD, ....), il est important de connaître Turtle, ceci pour plusieurs raisons:

  • C'est un format concis et lisible, relativement facile à manipuler (éditer) comparativement aux autres formats de sérialisation du RDF,
  • La syntaxe du langage SPARQL utilisé pour interroger des jeux de données RDF est basée sur Turtle pour représenter des motifs de graphes (graph patterns). Connaître Turtle vous facilitera donc l'apprentissage de SPARQL.

2.1 Lire du Turtle

Soit le fichier Turtle suivant :

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix dbr: <http://dbpedia.org/resource/> .
@prefix geodata: <http://sws.geonames.org/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix schema: <http://schema.org/> .
@prefix ex: <http://example.net/people#> .

ex:Amelie_Ponet a foaf:Person ;
        foaf:givenname "Amélie";
        foaf:familyName "Ponet";
        foaf:knows ex:Ivan_Noe.

ex:Ivan_Noe a foaf:Person, schema:Person ;
    foaf:givenname "Ivan", "Iván"@hu ;
    foaf:familyName "Noe" ;
    foaf:birthday "1985-02-24"^^xsd:date ;
     schema:address [ a schema:Address ;
            schema:addressLocality "Grenoble" ;
            schema:url dbr:Grenoble;
            rdfs:seeAlso geodata:3014728
     ] ;
    foaf:knows ex:Amelie_Ponet, 
               <https://www.w3.org/People/Berners-Lee/card#i> .

Ce fichier décrit des personnes en utilisant en particulier les vocabulaires FOAF (Friend Of A Friend) et schema.org.

Question 1 : à quelles URIs correspondent foaf:Person et schema:Person ?

Tapez ces URIs dans votre navigateur. Que se passe-t-il ?

Pouvez vous obtenir un représentation RDF de ces ressources ?

Solution

Pour obtenir du RDF il faut utiliser la négociation de contenu en spécifiant dans les en-têtes Accept de la requête HTTP GET un type MIME correspondant à du RDF : application/xml+rdf pour obtenir du code RDF/XML ou bien text/turtle pour du code Turtle. Vous pouvez effectuer ces requêtes depuis la ligne de commande avec wget ou curl (voir slide 22 du cours n°2 URIs).

Question 2 : donnez une représentation graphique du graphe RDF défini par le fichier turtle ci-dessus.

Solution

2.2 Ecrire du Turtle

Le graphe ci-dessous représente des données extraites du graphe de connaissances DBpedia concernant le chanteur/compositeur britannique Joe Strummer.

graphe RDF  de Joe Strummer
Graphe de données sur Joe Strummer extrait de DBpedia. Cliquez ICI pour avoir l'image en grand format.

Question : écrivez une représentation de ce graphe en Turtle et vérifiez que celle-ci est syntaxiquement corrrecte.

Pour effectuer cette validation, vous pouvez utiliser soit des outils en ligne soit des outils en ligne de commande. Parmi ceux-ci en voici quelques uns :

Solution

Exercice 3: Modéliser en RDF

La table suivante montre un échantillon des données que la librairie ARTEMIS Bookstore conserve sur les livres qu'elle possède en stock. Ces données sont pour le moment stockées dans un tableur, il s'agit de les représenter en utilisant le modèle de données RDF.

données artemis excel
artemisBookstroreData.xlsx

Question 1: dessinez un graphe RDF qui reflète le contenu de la table (vous ne vous intéresserez qu'aux données contenues dans les deux premières lignes de la table).

Pour les URIs vous pouvez utiliser les préfixes suivants:

  • http://www.artemisbokkstore.com/ontology# pour les ressources qui correspondent à une propriété ou une classe,

  • http://www.artemisbokkstore.com/resource/ pour les autres ressources.

Solution

Question 2: Créez un fichier texte artemis.ttl dans le lequel vous écrirez une sérialisation de votre graphe en Turtle. Comme pour l'exercice 2.2 vérifiez que la syntaxe est correcte.

Solution

Exercice 4: Extraire des données RDFa

La page http://www.ebusiness-unibw.org/ de l'E-Business and Web Science Research Group de l'Université Militaire de Munich, contient des données structurées (décrites à l'aide de RDFa).

Question 1: Que contiennent ces données ? Représentez ces données en Turtle et dessinez le graphe RDF correspondant.

Solution

Vous pouvez bien entendu observer le code source de la page et produire manuellement le fichier turtle puis le graphe. Cependant de nombreux outils existent pour extraire le RDFa d'un document HTML et le convertir dans différents format. Pourquoi s'en priver ? Vous pouvez par exemple utiliser RDFa 1.1. Distiller and Parser ou des convertisseurs tels RDF Translator.

Question 2: Google search recommande d' utiliser JSON-LD plutôt que du RDFa pour annoter des documents web. Produisez une sérialisation en JSON-LD que vous pourriez subsituer au code RDFa dans la page http://www.ebusiness-unibw.org/ (pensez à utiliser un convertisseur pour produire la sérialisation en JSON-LD).

Solution

Exercice 5 : Générer des données RDF.

Question 1: Ecrivez un programme qui lit le fichier CSV artemisBookstoreData-v1.csv contenant les données de la librairie ArtemisBookstore vues à la question 1 de l'exercice 3 et qui produit un fichier RDF au format turtle (artemisBookstoreData-v1.ttl).

Verifiez que le fichier rdf généré est syntaxiquement correct en utilisant l'un des outils de validation vus dans les exercices précédants.

Attention : dans le fichier artemisBookstoreData-v1.csv le séparateur utilisé est non pas une , mais le ;

Solution

Pour vous aider à créer ce programme en Java vous pouvez partir du projet maven AppliArtemisBookStore.zip qui lit le fichier CVS et affiche son contenu sur la console (Ce projet utilise mavenwrapper, vous n'avez donc pas besoin d'avoir Maven installé sur votre ordinateur, il vous suffit d'avoir un JDK 17 ou une version ultérieure).

La figure ci-dessous vous montre comment les données RDF seront générées à partir des données CSV.

RDF généré
Génération du RDF à partir du fichier CSV

Les URIs pour identifier les resources représentant un auteur, un éditeur et un livre seront de la forme abr:uudi

  • abr: est le préfixe commun à toutes les resources d'ArtemisBookStore, défini en Turtle par la directive
    @prefix abr: <http://artemisBookstore.com/resource/>

  • uuid est un identifiant unique universel ou UUID (Universally Unique Identifier). Les UUIDs sont utilisés pour identifier de manière unique des informations dans des systèmes informatiques. Ils sont généralement représentés par une chaîne de 36 caractères, comprenant des chiffres et des lettres, structurée en cinq groupes séparés par des tirets. Par exemple : 971fd38a-c35e-433c-af86-650c43c6c10b est l'UUID qui a été généré pour l'auteur Edward Abbey.

    Les UUID sont conçus pour être uniques à travers le temps et l'espace, ce qui signifie qu'il est extrêmement improbable que deux UUID identiques soient générés indépendamment. Ils sont souvent utilisés dans les bases de données, les systèmes distribués, et les applications où des identifiants uniques sont nécessaires.

Pour générer un UUID en java vous pouvez utiliser la classe standard du JDK java.util.UUID comme le montre le programme ci-dessous.

import java.util.UUID;

public class UUIDExample {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("Generated UUID: " + uuid.toString());
    }
}

Attention à ne créer qu'une seule ressources (un seul UUID) pour des auteurs ou des éditeurs apparaissant plusieurs fois dans le fichier CSV. Pour cela vous pouvez utiliser deux Map dont la clé serait respectivement le nom complet (nom+prénom) de l'auteur ou le nom de l'éditeur et la valeur l'UUID associé.

  • Si pour un auteur ou un editeur donné il n'y a pas d'UUID dans la Map, il faut alors alors créer une nouvelle ressource et stocker dans la Map correspondante l'UUID généré pour l'identifier avec comme clé le nom complet de l'auteur ou le nom de l'éditeur.

  • Si au contraire il existe déjà une entrée dans la Map, on ne créera pas de nouvelle ressource, mais on utilisera l'UUID stocké dans celle-ci pour identifier l'auteur et/ou l'éditeur du livre à créer.

Exercice 6 : Manipuler du RDF avec l'API Jena

Cet exercice est optionnel. Pour vous aider vous pouvez vous référer à l'introduction au framework Jena accessible depuis la page TPs du site web du cours.

Question 1: En vous inspirant du programme réalisé à l'exercice 5, écrivez un nouveau programme qui permet de lire le fichier artemisBookstoreData-v1.csv contenant les données de la librairie ArtemisBookstore et de produire en sortie un graphe RDF dans l'un des formats de sérialisation (RDF/XML, Turtle, JSON-LD...) choisi par l'utilisateur.

Pour cela le programme pourra procéder comme suit

  • lire le fichier CSV ligne par ligne
  • créer au fur et à mesure que le fichier CSV est lu un modèle RDF avec l'API core de Jena
  • une fois la lecture terminée et le modèle RDF créé en mémoiren, proposer une sortie dans l'un différents formats de sérialisation (RDF/XML, Turtle, JSON-LD...) proposée par l'api riot de Jena.

Question 2: En utilisant l'API Jena Core écrire un programme Java qui lit le fichier RDF (artemisBookstoreData-v1.ttl) au format turtle que vous avez produit à l'exercice précédent et qui étant donné le nom d'un auteur trouve et affiche le titre de tous les livres dont il est l'auteur.