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…)