Visualiser l’ontologie de DBPedia sous forme de graphe avec d3

Dans le cadre d’un projet exploitant DBPedia, j’ai ressenti le besoin de me faciliter l’exploration de l’ontologie de DBPedia.

Bien sûr, j’ai commencé par la télécharger.  J’ai pu constater qu’une fois décompressé, ‘il s’agit d’un fichier de 2,3 Mo, au format RDF/XML comportant 685 classes et 2795 propriétés.

Mon réflexe est, de plus en plus, de créer mes visualisations et mes interfaces pour le Web. Comme le fichier est un fichier de référence qui n’est pas supposé évoluer (version 2014 de l’ontologie), j’ai commencé à le mettre dans un format commode pour le Web: JSON. Je ne vais pas générer un fichier json quelconque, mais un fichier mis en forme pour les données liées: json-ld.

Le fichier étant relativement gros, je n’ai pas pu utiliser le très commode convertisseur Rdf-Translator. J’avais déjà rencontré ce problème (abordé ici et ici). Pour cela, j’ai fait appel au convertisseur rdfcat de Jena, avec la ligne de commande:

rdfcat -out JSON-LD dbpedia_2014.owl >dbpedia_2014.jsonld

qui me donne un fichier de 1,7 Mo.

Pour rendre le fichier encore plus exploitable, je suis allé faire un petit tour sur l’outil en ligne de test de json-ld: Json-ld Playground.

J’ai collé le contenu de dbpedia_2014.jsonld dans l’espace prévu pour mettre ses données, puis en cliquant sur l’onglet, j’ai constaté que le Playground n’aime pas mon fichier. Le message d’erreur m’indique que le fichier défini un terme par une chaîne de caractère vide, ce qui semble interdit. Une recherche dans le fichier m’a suggéré que c’est la ligne

«  » : « http://dbpedia.org/ontology/ »,

qui est fautive. Je l’ai remplacée par

« bug » : « http://dbpedia.org/ontology/ »,

et le problème a disparu. J’ai pu observer que le contexte défini dans le fichier pour sa mise en forme me convient.

Maintenant, je vais chercher à construire un graphe à partir de ces données. Pour cela, je vais utiliser d3. Pour commencer par un graphe simple, je vais créer un nœud du graphe pour chaque classe et un lien vers la ou les classes dont elle est une sous-classe.

Par exemple:

l’élément correspondant à la classe Abbey, a pour id

« @id » : « :Abbey »,

il est bien de type classe

« @type » : « owl:Class »,

et il est une sous-classe de Place:

« subClassOf » : « :Place »,

Une recherche d’exemples de graphes tracés avec d3 m’a amené  sur

et en particulier sur le premier exemple

http://bl.ocks.org/mbostock/1153292

(on trouve de nombreux autres exemples ici et ici)

Dans cet exemple les liens sont définis dans une table (links) qui contient un ensemble d’éléments ayant chacun une propriété ‘source’, une ‘target’ et une ‘type’. Les noeuds en sont déduits avec le code suivant:

links.forEach(function(link) {
  link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});
  link.target = nodes[link.target] || (nodes[link.target] = {name: link.target});
});

Au lieu d’utiliser une table links définie directement dans le code, je veux la créer à partir de l’ontologie de DBPedia. Voilà le code -un peu simplifié- qui lit le fichier jsonld de l’ontologie et crée des éléments avec les propriétés source et target:

d3.json("data/dbpedia_2014.jsonld", function(json) {
var nodes = {};
var links = json["@graph"]; 

links.forEach(function(entity) {
    if (entity["@type"]==="owl:Class") {
      if (typeof entity.subClassOf !== 'undefined') {
              entity.source = nodes[entity.subClassOf] || 
                  (nodes[entity.subClassOf] = {name: entity.subClassOf});
              entity.target = nodes[entity["@id"]] || 
                  (nodes[entity["@id"]] = {name: entity["@id"]});
              entity.value = "";
        }
      } // else, it's a root
    } else {
      // here, we need code to process other elements than owl:Class
    }
});

Le reste du code est celui de l’exemple.

Le résultat est ici

http://givingsense.eu/demo/dbpediaGraphs/ontodbpedia.htm

Comme le graphe contient de nombreux liens et nœuds, la mise en page automatique prend un peu de temps à se calculer et se stabiliser et il vaut mieux avoir un grand écran…

Voilà, c’est tout… ou preque.

J’ai ajouté un peu de code pour simplifier le graphe et ne donner que les noeuds voisins d’un noeud indiqué par le nom de sa classe.

Par exemple:

– pour la classe :Monument

http://givingsense.eu/demo/dbpediaGraphs/ontodbpedia.htm?id=:Monument

– pour la classe :Place

http://givingsense.eu/demo/dbpediaGraphs/ontodbpedia.htm?id=:Place

Nous verrons dans un prochain billet qu’il est simple de traiter l’ontologie en json-ld pour en avoir une version monolingue, beaucoup moins grosse et définir des fonctionnalités qui aident à parcourir et découvrir l’ontologie (plier et replier des branches…)

A propos Moissinac

Maitre de conférence à Télécom Paris, Département Image, Données, Signal - Groupe Multimédia Jean-Claude Moissinac a mené des recherches sur les techniques avancées pour la production, le transport, la représentation et l’utilisation des documents multimédia. Ces travaux d'abord ont évolué vers la représentation sémantique de données liées au multimédia (process de traitement de médias, description d'adaptations de média, description formelle d'interactions utilisateurs). Aujourd'hui, les travaux portent sur la constitution de graphes de connaissances. Principaux axes de recherche actuel : représentations sémantiques de connaissances, constitution de graphes de connaissances, techniques d'apprentissage automatique sur ces graphes
Ce contenu a été publié dans DBPedia, Visualisation. Vous pouvez le mettre en favoris avec ce permalien.