Punto SPARQL
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:
- http://datos.gob.es/catalogo: este grafo contén todo o Catálogo de datos de datos.gob.es
- http://datos.gob.es/nti: contén as URIs correspondentes á taxonomía de sectores primarios e á identificación de cobertura xeográfica definidas nos Anexos IV e V da Norma Técnica de Interoperabilidade de Reutilización de recursos da información (NTI)
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:
- Debemos codificala substituíndo os espazos por “+” da seguinte forma:
select+distinct+?type+where+{?x+a+?type}+LIMIT+100
- 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:
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 |
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:
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" |
… | … |
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:
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 |