Grupo de Facebook DBpedia en español
Notify Twitter

Muchas veces 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: es.dbpedia.org/classtree.html(info)

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). a 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 de 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

-Mariano Rico