Punt SPARQL

La interfície SPARQL és un servei que permet fer consultes sobre dades emmagatzemades en RDF mitjançant el llenguatge SPARQL. Ofereix als desenvolupadors/professionals una gran potència i flexibilitat a l'hora de fer consultes i construir aplicacions.

Informació emmagatzemada

Tota la informació que es pot consultar està carrega en una base de dades semàntica. En aquest tipus de bases de dades la informació s'emmagatzema en grafs.

La base de dades semàntica de datos.gob.es té dos grafs:

Com s'utilitza

Les consultes es fan a través de peticions GET que tornen les dades segons els paràmetres que s'especifiquen en la crida.

L'adreça base del nostre punt de SPARQL és la següent:

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

S'ha d'afegir el paràmetre “query” a aquesta adreça i, a continuació, la consulta que volem fer.

Per exemple, si volem executar la consulta següent: select distinct ?type where {?x a ?type} LIMIT 100, s'obtenen els diferents tipus que hi ha carregats al nostre punt de SPARQL:

  1. L'hem de codificar substituint els espais per “+” de la manera següent: select+distinct+?type+where+{?x+a+?type}+LIMIT+100
  2. Una vegada codificada i coneixent l'adreça del nostre punt de SPARQL, s'executa d'aquesta manera:

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

Si no afegim a l'adreça base del punt SPARQL el paràmetre query amb la consulta que volem fer, ens tornarà un error de pàgina no trobada.

El format per defecte de les respostes és HTML, però se'n pot especificar un altre a través del paràmetre “format”. Aquest paràmetre pot prendre els valors següents:

ValorFormat
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 en fer la consulta no s'especifica cap graf, es tornarà la informació de tots els grafs que estiguin disponibles.

Es poden consultar tots els grafs disponibles amb aquesta consulta:

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

Si volem saber a quin graf pertany la informació, es pot especificar de la manera següent, ja que a la variable ?g veurem a quin graf es troba cada ?x.

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

Podem obtenir els resultats d'un sol graf de la manera següent:

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

Ara només veurem les ?x que es trobin al graf especificat.

Per fer les peticions també es pot utilitzar un formulari. Aquest tipus de formularis ofereixen ajuda al desenvolupador proporcionant una àrea de text que utilitza colors per destacar la sintaxi, identifica errors de sintaxi, té funció d'autoemplenament i permet l'opció d'executar les consultes, entre d'altres.

Exemples

Obtenir totes les classes del nostre punt de SPARQL

Aquesta consulta és molt útil perquè veurem tots els tipus d'informació que hi ha emmagatzemats.

A més, per evitar obtenir informació que no ens ajudi, especificarem els nostres grafs.

Primer especificarem el graf del catàleg:

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

Ara utilitzarem els dos grafs alhora gràcies a VALUES

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

El resultat final és aquest:

tipus
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

Obtenir tots els conjunts de dades del catàleg

Ara que ja coneixem els tipus, demanarem tots els conjunts de dades que es corresponen amb aquest URI: http://www.w3.org/ns/dcat#Dataset

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

El resultat és una llista d'URL de tots els conjunts de dades.

Obtenir totes les propietats que tenen els conjunts de dades

Volem obtenir més informació dels conjunts de dades, però només sabem els URI; per això, hem de demanar per totes les seves propietats:

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

Aquestes són totes les propietats que tenen:

propietat
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

Obtenir tots els organismes que publiquen dades

Utilitzarem la propietat http://purl.org/dc/terms/publisher per obtenir tots els organismes que publiquen dades.

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

El resultat és el conjunt dels URI de tots els publicadors.

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

Obtenir les propietats dels organismes que publiquen dades

Amb els URI no sabem el nom dels organismes i per això hem de demanar per les propietats d'aquests URI:

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

Aquestes són totes les propietats dels publicadors:

propietat
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

Obtenir els noms dels organismes que publiquen dades

Hem de demanar l'URI i la propietat 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 resultat és una llista molt llarga:

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"

Obtenir els noms dels deu organismes que tenen publicats més conjunts de dades i veure'n el número

Per fer aquesta consulta hem d'agrupar els resultats, ordenar-los i limitar-ne 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 resultat és aquest:

labelnúm.
"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