[{Image src='DBpediaClasses.banner.png' align='left' link='es.dbpedia.org/classtree.html' caption='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:
%%prettify 
{{{
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:
%%prettify 
{{{
{ "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í:

%%prettify 
{{{
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:
%%prettify 
{{{
{ "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.
%%prettify 
{{{
{ "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:
%%prettify 
{{{
{ "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|http://nandana.github.io/dbpedia/2015-10/class-langs.html] (pincha sobre cualquier nodo del grafo).
\\
\\
-Mariano Rico