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:
- http://datos.gob.es/catalogo: este grafo contiene todo el Catálogo de datos de datos.gob.es
- http://datos.gob.es/nti: contiene las URIs correspondientes a la taxonomía de sectores primarios y a la identificación de cobertura geográfica definidas en los Anexos IV y V de la Norma Técnica de Interoperabilidad de Reutilización de recursos de la información (NTI)
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:
- Debemos codificarla sustituyendo los espacios por “+”, de la siguiente forma:
select+distinct+?type+where+{?x+a+?type}+LIMIT+100
- 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:
Valor | Formato |
---|---|
text/html | HTML |
application/vnd.ms-excel | Spreadsheet |
text/tab-separated-values | TSV |
application/sparql-results+xml | XML |
application/sparql-results+json | JSON |
application/javascript | Javascript |
text/turtle | Turtle |
application/rdf+xml | RDF/XML |
text/plain | N-Triples |
text/csv | CSV |
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:
publicador | label |
---|---|
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:
label | num |
---|---|
"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 |