A interface SPARQL é un servizo que permite realizar consultas sobre datos almacenados en RDF mediante a linguaxe SPARQL. Ofrécelles aos desenvolvedores/profesionais unha gran potencia e flexibilidade á hora de realizar consultas e construír aplicacións.

Información almacenada

Toda a información que se pode consultar atópase cargada nunha base de datos semántica. Neste tipo de bases de datos a información almacénase en grafos.

A base de datos semántica de datos.gob.es conta con dous grafos:

Como se usa

As consultas fanse a través de peticións GET, que devolven os datos segundo os parámetros que se especifican na chamada.

O enderezo base do noso punto de SPARQL é o seguinte:

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

A este enderezo haille que engadir o parámetro “query” e a continuación a consulta que queremos realizar.

Por exemplo, se queremos executar a seguinte consulta, select distinct ?type where {?x a ?type} LIMIT 100, que obteñen os diferentes tipos que hai cargados no noso punto de SPARQL:

  1. Debemos codificala substituíndo os espazos por “+” da seguinte forma: select+distinct+?type+where+{?x+a+?type}+LIMIT+100
  2. Unha vez codificada e coñecendo o enderezo do noso punto de SPARQL, executaríase do seguinte xeito:

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

Se ao enderezo base do punto SPARQL, non lle engadimos o parámetro query coa consulta que queremos realizar, devolveranos un erro de páxina non encontrada.

O formato por defecto das respostas é HTML, pero pódese especificar outro a través do parámetro “format”. Este parámetro pode tomar os seguintes 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

Se ao realizar a consulta non se especifica ningún grafo, devolverase a información de todos os grafos que estean dispoñibles.

Pódense consultar os grafos dispoñibles con esta consulta:

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

Se queremos obter a que grafo pertence a información, pódese especificar do seguinte xeito onde a variable ?g imos ver en que grafo se encontra cada ?x.

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

Podemos obter os resultados de un só do seguinte xeito:

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

Agora só veremos as ?x que se encontren no grafo especificado

Para realizar as peticións tamén se pode utilizar un formulario. Este tipo de formularios ofrecen axuda ao desenvolvedor proporcionando unha área de texto que usa cores para resaltar a sintaxe, identifica erros de sintaxe, ten función autocompletado e permite a opción de executar as consultas, entre outros.

Exemplos

Obter todas as clases que hai no noso punto de SPARQL

Esta consulta é moi útil porque imos ver todos os tipos de información que hai almacenados.

Ademais para evitar obter información que non nos axuda, imos especificar os nosos grafos.

Primeiro especificamos o grafo do Catálogo:

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

Agora usaremos os dous grafos á vez grazas a VALUES

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

O resultado final é 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

Obter todos os conxuntos de datos do Catálogo

Agora que xa coñecemos os tipos, imos pedir todos os conxuntos de datos, que se corresponden con esta http://www.w3.org/ns/dcat#Dataset

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

O resultado é unha lista de URLs de todos os datasets.

Obter todas as propiedades que teñen os conxuntos de datos

Queremos obter máis información dos conxuntos de datos, pero só sabemos os seus URIs, imos preguntar por todas as súas propiedades:

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

Estas son todas as propiedades que teñen:

propiedade
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

Obter todos os organismos que publican datos

Imos utilizar a propiedade http://purl.org/dc/terms/publisher para obter todos os 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.
}

O resultado é o conxunto das URIs de todos os publicadores

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

Obter as propiedades dos organismos que publican datos

Coas URIs non sabemos o nome dos organismos, imos preguntar polas propiedades destas 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 as propiedades dos publicadores:

propiedade
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

Obter os nomes dos organismos que publican datos

Imos pedir a URI e a propiedade 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.
}

O resultado é unha lista moi longa:

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"

Obter os nomes dos dez organismos que máis conxuntos de datos teñen publicados e visualizar o número destes

Para realizar esta consulta imos ter que agrupar resultados, ordenalos e limitar o 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

O resultado é 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