Punto SPARQL

La interfaz SPARQL es un servicio que permite realizar consultas sobre datos almacenados en RDF mediante el lenguaje SPARQL. Ofrece a los desarrolladores/profesionales una gran potencia y flexibilidad a la hora de realizar consultas y construir aplicaciones.

Información almacenada

Toda la información que se puede consultar se encuentra cargada en una base de datos semántica. En este tipo de bases de datos la información se almacena en grafos.

La base de datos semántica de datos.gob.es cuenta con dos gráfos:

Cómo se usa

Las consultas se hacen a través de peticiones GET, que devuelven los datos según los parámetros que se especifican en la llamada.

La dirección base de nuestro punto de SPARQL es la siguiente:

http://datos.gob.es/virtuoso/sparql

A esta dirección hay que añadir el parámetro "query" y a continuación la consulta que queremos realizar.

Por ejemplo, si queremos ejecutar la siguiente consulta, select distinct ?type where {?x a ?type} LIMIT 100, que obtienen los diferentes tipos que hay cargados en nuestro punto de SPARQL:

  1. Debemos codificarla sustituyendo los espacios por “+”, de la siguiente forma: select+distinct+?type+where+{?x+a+?type}+LIMIT+100
  2. Una vez codificada y conociendo la dirección de nuestro punto de SPARQL, se ejecutaría de la siguiente manera:

    http://datos.gob.es/virtuoso/sparql?query=select+distinct+?type+where+{?x+a+?type}+LIMIT+100

Si a la dirección base del punto SPARQL, no le añadimos el parámetro query con la consulta que queremos realizar, nos devolverá un error de página no encontrada.

El formato por defecto de las respuestas es HTML, pero se puede especificar otro a través del parámetro "format". Este parámetro puede tomar los siguientes valores:

ValorFormato
text/htmlHTML
application/vnd.ms-excelSpreadsheet
text/tab-separated-valuesTSV
application/sparql-results+xmlXML
application/sparql-results+jsonJSON
application/javascriptJavascript
text/turtleTurtle
application/rdf+xmlRDF/XML
text/plainN-Triples
text/csvCSV

Si al realizar la consulta no se especifica ningún grafo, se devolverá la información de todos los grafos que estén disponibles.

Se pueden consultar los grafos disponibles con esta consulta:

select distinct ?uri where { graph ?uri { ?s a ?t } }

Si queremos obtener a qué grafo pertenece la información, se puede especificar de la siguiente manera donde la variable ?g vamos a ver en que grafo se encuentra cada ?x.

select distinct ?g ?type where { graph ?g { ?x a ?type. } } limit 100

Podemos obtener los resultados de un solo de la siguiente manera:

select distinct ?type where { graph <http://datos.gob.es/catalogo> { ?x a ?type. } } limit 100

Ahora solo veremos las ?x que se encuentren en el grafo especificado

Para realizar las peticiones también se puede utilizar un formulario. Este tipo de formularios ofrecen ayuda al desarrollador proporcionando un área de texto que usa colores para resaltar la sintaxis, identifica errores de sintaxis, tiene función autocompletado y permite la opción de ejecutar las consultas, entre otros.

Ejemplos

Obtener todas las clases que hay en nuestro punto de SPARQL

Esta consulta es muy útil porque vamos a ver toda los tipos de información que hay almacenados.

Además para evitar obtener información que no nos ayuda, vamos a especificar nuestros grafos.

Primero especificamos el grafo del Catálogo:

select distinct ?tipo where
{
graph <http://datos.gob.es/catalogo> {
?x a ?tipo.
}
}

Ahora usaremos los dos grafos a la vez gracias a VALUES

select distinct ?tipo where
{
graph ?grafo {
?x a ?tipo.
}
VALUES ?grafo { <http://datos.gob.es/catalogo> <http://datos.gob.es/nti> }
}

El resultado final es este:

tipo
http://www.w3.org/ns/dcat#Dataset
http://www.w3.org/2004/02/skos/core#Concept
http://www.w3.org/ns/dcat#Catalog
http://www.w3.org/2006/time#DurationDescription
http://purl.org/dc/terms/Frequency
http://purl.org/dc/terms/IMT
http://purl.org/dc/terms/PeriodOfTime
http://www.w3.org/ns/dcat#Distribution
http://vocab.linkeddata.es/datosabiertos/def/sector-publico/territorio#ComunidadAutonoma
http://vocab.linkeddata.es/datosabiertos/def/sector-publico/territorio#CiudadAutonoma
http://vocab.linkeddata.es/datosabiertos/def/sector-publico/territorio#Pais
http://vocab.linkeddata.es/datosabiertos/def/sector-publico/territorio#Provincia

Obtener todos los conjuntos de datos del Catálogo

Ahora que ya conocemos los tipos, vamos a pedir todos los conjuntos de datos, que se corresponden con esta URI: http://www.w3.org/ns/dcat#Dataset

select distinct ?dataset where
{
?dataset a <http://www.w3.org/ns/dcat#Dataset>
}

El resultado es una lista de URLs de todos los datasets.

Obtener todas las propiedades que tienen los conjuntos de datos

Queremos obtener más información de los conjuntos de datos, pero sólo sabemos sus URIs, vamos a preguntar por todas sus propiedades:

select distinct ?propiedad where
{
?dataset a <http://www.w3.org/ns/dcat#Dataset> . ?dataset ?propiedad ?valor .
}

Estas son todas las propiedades que tienen:

propiedad
http://www.w3.org/1999/02/22-rdf-syntax-ns#type
http://purl.org/dc/terms/modified
http://www.w3.org/ns/dcat#distribution
http://www.w3.org/ns/dcat#keyword
http://www.w3.org/ns/dcat#theme
http://purl.org/dc/terms/accrualPeriodicity
http://purl.org/dc/terms/description
http://purl.org/dc/terms/identifier
http://purl.org/dc/terms/issued
http://purl.org/dc/terms/language
http://purl.org/dc/terms/publisher
http://purl.org/dc/terms/spatial
http://purl.org/dc/terms/title
http://purl.org/dc/terms/references
http://purl.org/dc/terms/temporal
http://purl.org/dc/terms/conformsTo
http://purl.org/dc/terms/valid

Obtener todos los organismos que publican datos

Vamos a utilizar la propiedad http://purl.org/dc/terms/publisher para obtener todos los organismos que publican datos.

select distinct ?publicador where
{
?x a <http://www.w3.org/ns/dcat#Dataset> .
?x <http://purl.org/dc/terms/publisher> ?publicador.
}

publicador
http://datos.gob.es/recurso/sector-publico/org/Organismo/A02002834
http://datos.gob.es/recurso/sector-publico/org/Organismo/A04003003
http://datos.gob.es/recurso/sector-publico/org/Organismo/A05003638

Obtener las propiedades de los organismos que publican datos

Con las URIs no sabemos el nombre de los organismos, vamos a preguntar por las propiedades de estas URIs

select distinct ?propiedad where
{
?x a <http://www.w3.org/ns/dcat#Dataset> .
?x <http://purl.org/dc/terms/publisher> ?publicador.
?publicador ?propiedad ?valor.
}

Estas son todas las propiedades de los publicadores:

propiedad
http://www.w3.org/1999/02/22-rdf-syntax-ns#type
http://www.w3.org/2004/02/skos/core#prefLabel
http://www.w3.org/2004/02/skos/core#notation

Obtener los nombres de los organismos que publican datos

Vamos a pedir la URI y la propiedad http://www.w3.org/2004/02/skos/core#prefLabel

select distinct ?publicador ?label where
{
?x a <http://www.w3.org/ns/dcat#Dataset> .
?x <http://purl.org/dc/terms/publisher>
?publicador. ?publicador <http://www.w3.org/2004/02/skos/core#prefLabel> ?label.
}

El resultado es una lista muy larga:

publicadorlabel
http://datos.gob.es/recurso/sector-publico/org/Organismo/A02002834"Gobierno de Aragón"
http://datos.gob.es/recurso/sector-publico/org/Organismo/A04003003"Gobierno de las Islas Baleares"
http://datos.gob.es/recurso/sector-publico/org/Organismo/A05003638"Comunidad Autónoma de Canarias"
http://datos.gob.es/recurso/sector-publico/org/Organismo/A07002862"Junta de Castilla y León"

Obtener los nombres de los diez organismos que más conjuntos de datos tienen publicados y visualizar el número de éstos

Para realizar esta consulta vamos a tener que agrupar resultados, ordenarlos y limitar el total a 10.

select distinct ?label count(?x) as ?num {
?x a <http://www.w3.org/ns/dcat#Dataset> .
?x <http://purl.org/dc/terms/publisher> ?publicador.
?publicador <http://www.w3.org/2004/02/skos/core#prefLabel> ?label.
}
group by (?label)
order by desc(?num)
limit 10

El resultado es este:

labelnum
"Gobierno de Aragón"2659
"Comunidad Autónoma de País Vasco"2208
"Centro de Investigaciones Sociológicas"2107
"Ayuntamiento de Málaga"651
"Ayuntamiento de Gijón"627
"Xunta de Galicia"315
"Generalitat Valenciana"313
"Ayuntamiento de Madrid"231
"Instituto Nacional de Estadística"205
"Junta de Castilla y León"196