Ejemplos de consultas y exploración en DBPedia

En este capítulo veremos como podemos realizar consultas SPARQL en DBpedia (utilizaremos la versión en español, pero la versión en inglés es similar) y cómo podríamos navegar entre los datos a través de las URI.

Consultas SPARQL

Estas consultas de ejemplo las realizaremos desde el endpoint de la DBpedia en castellano.

Listado de películas en español

En esta primera consulta obtendremos el listado de URIs de las películas en español recogidas en la DBpedia. Para ello, ejecutaremos la siguiente consulta:

PREFIX dcterms: <http://purl.org/dc/terms/>
SELECT ?Pelicula WHERE {
 ?Pelicula dcterms:subject <http://es.dbpedia.org/resource/Categoría:Películas_en_español> .
 }

En las primeras líneas de cualquier consulta debemos indicar las ontologías de las propiedades que vamos a utilizar. En este caso, vamos a utilizar el vocabulario "dcterms:" de Dublin Core. Así que en la primera línea declaramos ese prefijo con su URL correspondiente.

La sentencia "SELECT" nos permite elegir el atributo o los atributos que van a mostrarse en el resultado. En este caso hemos señalado que queremos mostrar lo que guardemos en "?Pelicula". Podríamos usar un "*" para que aparezcan todos los atributos que hemos usado en la consulta.

Dentro de las llaves de la estructura "WHERE" es donde debemos indicar las condiciones que nos devolverán un resultado. Cada condición debe expresarse con tres elementos (sujeto, predicado y objeto). En este caso, estamos seleccionando los elementos que hemos llamado "?Pelicula" cuya propiedad "dcterms:subject" apunte a la categoría de las películas en español (las URL se ponen entre <>). Es decir, seleccioname todos los elementos que a partir de ahora voy a llamar "?Pelicula" que tengan como valor en la propiedad "dcterms:subject" la categoría de películas en español.

Esta consulta nos devolverá un listado de las URIs de los elementos que cumplan esa condición, por lo que nos mostrará todas las películas incluidas en esa categoría. Algo parecido a lo que se muestra en la siguiente imagen.

Director de una película

Partimos del resultado anterior. Imagínate que ahora queremos saber cuál es el director de alguna de las películas, por ejemplo, Solas. Este dato se especifica en la propiedad "dbpedia-owl:director" de la película en concreto. Realizamos la siguiente consulta:

PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> 
SELECT ?Nombre WHERE {
 <http://es.dbpedia.org/resource/Solas_(película)> dbpedia-owl:director ?Director .
 ?Director dbpedia-owl:abstract ?Nombre .
 }

Podemos ver como primero volvemos a indicar la dirección de la ontología que vamos a usar. Luego seleccionamos mostrar el valor de "?Nombre" (Ahora veremos que estamos almacenando ahí). Esta vez tenemos dos condiciones en "WHERE", cuando hay más de una condición deben terminar con un espacio y un punto. En la primera le estamos diciendo que almacene en "?Director" el valor de la propiedad "dbpedia-owl:director" de la URI que se refiere a la película Solas (Devuelta en la consulta anterior). El problema es que ahora en "?Director" hay otra URI, la que apunta al director de la película en concreto. Para mostrar un resultado más legible y completo, en la segunda condición le vamos a pedir el abstract (resumen) de ese director. Para ello ponemos la URI de "?Director" en sujeto, que la propiedad que mire sea "dbpedia-owl:abstract" y el valor lo almacene en "?Nombre". Y esto último es lo que elegimos mostrar con SELECT. El resultado será el siguiente:

Películas españolas estrenadas después del año 2000

PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
SELECT ?Nombres ?Fecha WHERE {
 ?Pelicula dcterms:subject <http://es.dbpedia.org/resource/Categoría:Películas_en_español> .
 ?Pelicula foaf:name ?Nombres .
 ?Pelicula <http://es.dbpedia.org/property/estreno> ?Fecha 
 FILTER (?Fecha > 2000) 
 }

En esta ocasión utilizaremos dos ontologías diferentes, "dcterms:" y "foaf:", por lo que lo indicamos en las primeras líneas. Esta vez tenemos tres sentencias en "WHERE". La primera ya la conocemos, es exactamente igual a la primera consulta realizada en el capítulo. Estamos poniendo en "?Pelicula" todas las URIs de las películas de la categoría "Películas en español". En la segunda, podemos ver como almacenamos en "?Nombres" los valores a los que apunta la propiedad "foaf:name" en cada película. Esta propiedad almacena el nombre de la película en un formato de texto plano. Por último, guardamos en "?Fecha" el contenido de la propiedad "http://es.dbpedia.org/property/estreno". Esta propiedad indica la fecha de estreno de la película. Por lo tanto, ya tenemos los nombres con sus correspondientes fechas de estreno. Pero aún vamos un paso más allá, y ponemos un filtro (FILTER). Esto nos permite restringir los resultados a ciertas condiciones. En este caso, indicamos que la fecha debe ser mayor que 2000, para que se muestren únicamente las películas estrenadas después de este año. En "SELECT" seleccionamos "?Nombre" y "?Fecha" por lo que el resultado será algo parecido a la siguiente imagen.

A continuación seguiremos refinando la misma búsqueda. Podrás comprobar en la imagen que los datos no están ordenados de ninguna forma. En la siguiente consulta ordenaremos los resultados por fecha de estreno:

PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
SELECT ?Nombres ?Fecha WHERE {
 ?Pelicula dcterms:subject <http://es.dbpedia.org/resource/Categoría:Películas_en_español> .
 ?Pelicula foaf:name ?Nombres .
 ?Pelicula <http://es.dbpedia.org/property/estreno> ?Fecha 
 FILTER (?Fecha > 2000) 
 } ORDER BY (?Fecha)

Como puedes ver, fuera de la estructura de "WHERE" podemos poner una claúsula "ORDER BY" para indicar si queremos ordenar los resultados por una o varias variables, en orden ascendente o descendente. Tendremos ahora una respuesta parecida a la siguiente imagen.

Por último, podemos limitar también la cantidad de resultados a mostrar. En la siguiente consulta estamos limitando a 20 resultados:

PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
SELECT ?Nombres ?Fecha WHERE {
 ?Pelicula dcterms:subject <http://es.dbpedia.org/resource/Categoría:Películas_en_español> .
 ?Pelicula foaf:name ?Nombres .
 ?Pelicula <http://es.dbpedia.org/property/estreno> ?Fecha 
 FILTER (?Fecha > 2000) 
 } ORDER BY (?Fecha)
LIMIT 20

Para ello sólo es necesario añadir "LIMIT" y el número de resultados que queremos mostrar.

Consultar marido/mujer

En la siguiente consulta estamos preguntando por el esposo de Concha Velasco. Igual podríamos preguntar por los hijos, padres, parejas de los hijos o cualquier parentesco familiar. Siempre que esté recogido en la Wikipedia en el formato adecuado, podremos consultarlo.

PREFIX esdbp: <http://es.dbpedia.org/property/> 
PREFIX esres: <http://es.dbpedia.org/resource/> 
SELECT ?esposo WHERE { 
    esres:Concha_Velasco    esdbp:cónyuge   ?esposo. 
}

En este caso el resultado es una URI a la página en DBpedia del marido de Concha Velasco.

Grupos musicales en un rango de años

En esta consulta pediremos los grupos musicales de rock que estuvieron en activo en los años 70. Definimos como tipo "MusicalArtist" según el vocabulario de la DBpedia y que el estilo sea "Rock". Hay que tener en cuenta que sólo aparecerán los que estuvieron en activo durante esos 10 años. Si se mantuvieron en activo hasta más tarde, no aparecerán.

PREFIX esdbpp: <http://es.dbpedia.org/property/> 
PREFIX esdbpr: <http://es.dbpedia.org/resource/> 
SELECT ?grupo  WHERE{
  ?grupo  rdf:type                         dbpedia-owl:MusicalArtist .
  ?grupo  dbpedia-owl:activeYearsStartYear ?inicio .
  ?grupo  dbpedia-owl:activeYearsEndYear   ?fin .
  ?grupo  esdbpp:estilo                    esdbpr:Rock .
  FILTER ( (?inicio > "1970-01-01T00:00:00Z"^^xsd:dateTime  && ?inicio < "1980-01-01T00:00:00Z"^^xsd:dateTime ) ||
           (?fin    > "1970-01-01T00:00:00Z"^^xsd:dateTime  && ?fin < "1980-01-01T00:00:00Z"^^xsd:dateTime ) ||
           (?inicio < "1970-01-01T00:00:00Z"^^xsd:dateTime  && ?fin > "1980-01-01T00:00:00Z"^^xsd:dateTime ) 
         ) 
}ORDER BY DESC(?inicio)
LIMIT 20

Hemos ordenado de forma descendente por el año de inicio y también hemos puesto un límite de 20 resultados para mostrarlos en la siguiente imagen.

Exploración de los datos

Si entramos en cualquier URI de la DBpedia, veremos todos los enlaces que están relacionados con esta entidad. Por ejemplo, en la siguiente imagen podemos ver un fragmento de la URI de Benito Zambrano.

Podemos ver dos columnas, en la izquierda aparece cada propiedad y en la derecha los posibles valores de esa propiedad (descripciones u otras URIs). Así, por ejemplo, podemos ver que está relacionado con la página de los premios Goya y podemos navegar hasta ella.

Incluso podemos saber más sobre una propiedad. Por ejemplo, si pulsamos en "country", nos llevará a una página que nos dice que es la misma propiedad que "country" en la versión en inglés. Y en esa página podremos ver datos de la propiedad.

Así, podríamos explorar y navegar por las distintas entidades de forma infinita, ya que son cíclicas. Puede ser útil para descubrir relaciones que no sabíamos que existían. Y para ver datos sobre cualquier entidad de una forma mucho más lógica y ordenada que leyendo una larga descripción en la Wikipedia.

results matching ""

    No results matching ""