![]() |
A menudo me preguntan cómo se puede obtener la jerarquía de clases de DBpedia. Algo similar a lo que hay en http://mappings.dbpedia.org/server/ontology/classes/.
Por lo pronto, en esDBpedia NO está la ontología DBpedia. Muchas veces la incluyo para comodidad de los usuarios, pero no deberíamos contar con ella. Su sitio es DBpedia.
A continuación muestro la manera más sencilla que conozco: reaprovechando el ejemplo de árboles (hechos con la librería Javascript D3) de http://bl.ocks.org/d3noob/8329404. Este es el resultado: http://es.dbpedia.org/classtree.html
Todo comienza con esta SPARQL query sobre DBpedia (NO sobre esDBpedia), que muestra para cada clase su clase padre:
select * where{ ?s a owl:Class FILTER(regex(STR(?s), "http://dbpedia.org/ontology/", "i")) . optional {?s rdfs:subClassOf ?subOf } }order by asc(?s)
Si ejecutas esta query, verás que, en la columna de subOf, hay varios http://www.w3.org/2002/07/owl#Thing. Estas son las clases de primer nivel.
Para reaprovechar el código javascript mencionado, necesitamos los datos en este formato:
{ "name" : "Abbey", "parent" : "ReligiousBuilding" }, { "name" : "AcademicJournal", "parent" : "PeriodicalLiterature" }, { "name" : "AcademicSubject", "parent" : "TopicalConcept" }, { "name" : "Activity", "parent" : "null" },
Por tanto, tenemos que tratar los resultados de la query para hacer una concatenación (CONCAT) y varias sustituciones (REPLACE). La query queda así:
select (CONCAT ("{ \"name\"", " : \"", replace(str(?s), "http://dbpedia.org/ontology/", ""), "\", \"parent\"", " : \"", replace(replace(str(?subOf), "http://www.w3.org/2002/07/owl#Thing", "null"), "http://dbpedia.org/ontology/", ""), "\" },") as ?line) where{ ?s a owl:Class FILTER(regex(STR(?s), "http://dbpedia.org/ontology/", "i")) . optional {?s rdfs:subClassOf ?subOf } }order by asc(?s)
Si ejecutas esta query obtendrás resultados como estos:
{ "name" : "Abbey", "parent" : "ReligiousBuilding" }, { "name" : "AcademicJournal", "parent" : "PeriodicalLiterature" }, { "name" : "AcademicSubject", "parent" : "TopicalConcept" }, { "name" : "Activity", "parent" : "null" }, { "name" : "Actor", "parent" : "Artist" },
Ahora ya sólo hay que pegar los datos en el fichero javascript, teniendo cuidado con varios detalles:
1) El ejemplo no permite tener un árbol con varias raíces. Por tanto, hay que sustituir los null por DBpediaClass y crear una única raíz (null) que sea padre de DBpediaClass.
{ "name" : "DBpediaClass", "parent" : "null" },
2) También hay que tener cuidado con algunas clases que tienen varios padres, algunos no en la ontología DBpedia. Estos son algunos ejemplos:
{ "name" : "Band", "parent" : "http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#SocialPerson" }, { "name" : "Band", "parent" : "Group" }, { "name" : "Band", "parent" : "http://schema.org/MusicGroup" }, { "name" : "FilmFestival", "parent" : "SocietalEvent" }, { "name" : "FilmFestival", "parent" : "http://schema.org/Festival" }, { "name" : "Group", "parent" : "Organisation" }, { "name" : "Group", "parent" : "http://schema.org/Organization" }, { "name" : "Instrument", "parent" : "Device" }, { "name" : "Instrument", "parent" : "http://schema.org/Product" }, { "name" : "MusicalArtist", "parent" : "http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#NaturalPerson" }, { "name" : "MusicalArtist", "parent" : "Artist" }, { "name" : "MusicalArtist", "parent" : "http://schema.org/MusicGroup" }, { "name" : "Weapon", "parent" : "Device" }, { "name" : "Weapon", "parent" : "http://schema.org/Product" },
Para estos casos, he eliminado a mano los "padres NO DBpedia".
3) Tocar el tamaño del canvas para hacerlo más grande y que quepa todo el grafo.
¡Y ya está!. El resultado lo tienes en http://es.dbpedia.org/classtree.html.
Observa que puedes hacer búsquedas en la página.
Nota: Mi colega Nandana ha hecho algo similar sobre un grafo colapsable (pincha sobre cualquier nodo del grafo).
-Mariano Rico