Grupo de Facebook DBpedia en español
Notify Twitter

Figura 1. Jerarquía de clases en DBpedia. Pincha en la imagen para ver el grafo completo.

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