# SPARQL

SPARQL (acrònim recursiu de SPARQL Protocol and RDF Query Language) és un llenguatge estandarditzat pel World Wide Web Consortium (W3C) per a la consulta i manipulació de bases de dades o arxius RDF.
SPARQL fou adoptat pel W3C el 2008. La versió actual és la 1.1, publicada el 2013.

## Estructura bàsica d'una consulta en SPARQL

SPARQL és un llenguatge molt complet, amb una gran capacitat expressiva. L'estructura bàsica, però, és simple, i està basada en dues clàusules: SELECT i WHERE, que tenen una certa semblança amb les del mateix nom en el llenguatge SQL per a bases de dades relacionals.
Les consultes SPARQL s'executen en un processador de consultes SPARQL. El processador accedeix a un conjunt de dades RDF i obté la resposta a la consulta plantejada. Per als exemples d'aquesta pàgina, usarem el processador WQDS (Wikidata Query Service) que accedeix a una versió del Wikidata en RDF.
Per familiaritzar-se amb l'eina, es pot seguir el seu tutorial en català del qual s'han extret els següents exemples.

### Exemple 1: Select i Where amb un sol patró de terna

La consulta següent, si s'executa en WQDS, dona la llista de tots els presidents de la Generalitat de Catalunya que hi ha hagut fins ara:
SELECT ?persona
WHERE {?persona wdt:P39 wd:Q16933549}
El resultat de l'execució és una llista d'identificadors de l'espai de noms amb el prefix wd (<http://www.wikidata.org/entity/>), tals com, per exemple, wd:Q1806213. Cada identificador correspon a una persona que té o ha tingut el Càrrec (P39) de President de la Generalitat de Catalunya (Q16933549).
La consulta consta de dues parts: SELECT i WHERE. En aquest exemple, la WHERE consta d'un sol patró de terna:
?persona wdt:P39 wd:Q16933549
Un patró de terna està format per un subjecte (?persona), predicat (wdt:P39) i objecte (wd:Q16933549). En un patró de terna hi ha d'haver almenys una variable, que s'expressa amb un nom qualsevol començat per ?. En l'exemple, l'única variable és ?persona. Les variables poden ser el subjecte, el predicat o l'objecte. En l'exemple, el predicat no és una variable, sinó el P39, de l'espai de noms amb el prefix wdt (<http://www.wikidata.org/prop/direct/%5BEnllaç+no+actiu%5D>), que correspon a "tenir o haver tingut el càrrec". L'objecte del patró és wd:Q16933549, que correspon al càrrec "President de la Generalitat de Catalunya".
La clàusula SELECT indica que es vol obtenir l'identificador dels subjectes (variable ?persona) de les ternes que encaixen amb el patró de terna indicat a la WHERE.
L'execució de la consulta en WQDS dona el conjunt d'identificadors pels quals existeix una terna que encaixa amb el patró de terna de la WHERE. En aquest cas, si P és un d'aquests identificadors, llavors existeix al conjunt de dades del WQDS la terna:
P wdt:P39 wd:Q16933549
Per exemple, un resultat que s'obté és wd:Q1806213, perquè és una de les persones que ha tingut el càrrec wd:Q16933549.

### Exemple 2: Select i Where amb dos patrons de terna

La consulta de l'exemple anterior dona els identificadors (en l'espai de noms wd) de les persones que han estat o són presidents de la Generalitat de Catalunya. Si el que es desitja és l'identificador i el nom d'aquestes persones, llavors la consulta podria ser:
$_{SELECT?persona?nom}$
$_{WHERE{?personawdt:P39wd:Q16933549.}$
$_{?personardfs:label?nom}}$
En aquest exemple hi ha dos patrons de terna, que s'han de separar per un punt. El primer patró és el mateix que el de l'exemple anterior. El segon patró té el mateix subjecte (?persona), però el predicat és rdfs:label i l'objecte és la variable ?nom. El predicat label en l'espai de noms rdfs correspon a la propietat "tenir el nom". L'objecte d'una terna amb el predicat rdfs:label és un literal en una certa llengua, que és el nom del subjecte de la terna en aquella llengua. En principi, un mateix subjecte pot tenir més d'un nom en la mateixa o diferents llengües, cadascun dels quals seria una terna diferent. L'objecte del segon patró és la variable ?nom.
La clàusula SELECT indica que es vol obtenir l'identificador (?persona) i el nom (?nom) de les ternes que encaixen amb el patrons de terna indicats a la WHERE.
L'execució de la consulta en WQDS dona totes les parelles (P, N) tals que al processador WQDS existeixen les ternes:
$_{Pwdt:P39wd:Q16933549}$
$_{Prdfs:labelN}$
Per exemple, un resultat que s'obté és (wd:Q1806213, "Francesc Macià i Llussà"@ca) perquè el conjunt de dades que hi ha al WQDS inclou els fets (ternes):
$_{wd:Q1806213wdt:P39wd:Q16933549}$
$_{wd:Q1806213rdfs:label"FrancescMaciàiLlussà"@ca}$

### Exemple 3: FILTER

En la consulta anterior, si a Wikidata hi hagués un sol nom per a cada president, llavors el nombre de parelles ?persona i ?nom que s'obtindrien en executar-la seria el mateix que el nombre de presidents. El fet, però, és que hi ha el nom en diverses llengües, la qual cosa fa que el nombre de resultats sigui molt gran. Si es vol obtenir el nom en una sola llengua, es pot filtrar els resultats com s'indica a continuació:
SELECT ?persona ?nom
WHERE {?persona wdt:P39 wd:Q16933549 .
?persona rdfs:label ?nom .
FILTER (lang(?nom) = 'ca')}
La clàusula FILTER, amb la condició lang(?nom) = 'ca', indica que només estem interessats en aquelles ternes del predicat rdfs:label en les quals el nom estigui en la llengua catalana. Amb aquesta clàusula, ara WQDS proporciona només el nom en català de cada president.

### Exemple 4: ORDER BY

Un processador de consultes SPARQL proporciona els resultats sense cap ordre predeterminat. Dues execucions diferents de la mateixa consulta haurien de donar les mateixes respostes, però podrien ser presentades en ordres diferents. Si es vol un ordre en concret, cal usar la clàusula ORDER BY, com s'il·lustra en l'exemple següent:
SELECT ?persona ?nom
WHERE {?persona wdt:P39 wd:Q16933549 .
?persona rdfs:label ?nom .
FILTER (lang(?nom) = 'ca')}
ORDER BY ASC(?nom)
Aquesta consulta és la mateixa que l'anterior, però amb l'afegit de la clàusula ORDER BY, que indica que els resultats s'han de presentar en ordre ascendent de nom.

## Punts d'accés SPARQL

Un punt d'accés SPARQL (en anglès, endpoint) és un servei que els usuaris (humans o aplicacions) poden usar per consultar un conjunt de dades RDF usant el llenguatge SPARQL.Per als usuaris humans, aquest punt d'accés pot ser una aplicació autònoma o una aplicació web. Per a les aplicacions, aquest punt d'accés és un conjunt d'APIs que poden usar per accedir al servei.
Els punts d'accés SPARQL poden ser genèrics o específics. Un punt d'accés genèric pot accedir a qualsevol conjunt de dades RDF que estigui emmagatzemat localment o que sigui accessible via web. Un punt d'accés específic està lligat a un conjunt de dades RDF concret.
Hi ha molts punts d'accés SPARQL. Alguns dels més populars són:
* Wikidata Query Service. És el punt d'accés específic usat en els exemples d'aquesta pàgina. Conté una versió de Wikidata en RDF.
* DBpedia, És un punt d'accés específic a la versió anglesa de DBpedia.
* DBLP. És un punt d'accés específic al "The DBLP Computer Science Bibliography" (DBLP).
* YAGO. És un punt d'accés especific a l'ontologia YAGO.

## Vegeu també

* Tutorial en català

## Referències

* 1 2 «SPARQL 1.1 Overview» (en anglès). W3C SPARQL Working Group, 21-03-2013. [Consulta: 10 juliol 2018].
* ↑ «SPARQL Query Language for RDF» (en anglès). Eric Prud'hommeaux, Andy Seaborne, 15-01-2008. [Consulta: 11 juliol 2018].
* ↑ Angles, Renzo; Gutiérrez, Claudio «The Expressive Power of SPARQL». ISWC 2008, LNCS 5318, Springer, 2008, pàg. 114-129.
* 1 2 «Wikidata Query Service». [Consulta: 18 juliol 2018].
* ↑ Yu, Liyang. A developer's guide to the semantic web (en anglès). Second. Springer, 2015, p. 828. ISBN 978-3-662-43795-7.
* ↑ «SparqlEndpoints» (en anglès). [Consulta: 4 agost 2018].
* ↑ «SPARQL endpoints status» (en anglès). Arxivat de l'original el 2020-08-10. [Consulta: 4 agost 2018].
* ↑ «[SPARQL Explorer for http://dbpedia.org/sparql http://dbpedia.org/snorql/]» (en anglès). [Consulta: 4 agost 2018].
* ↑ «Snorql: Exploring https://dblp.l3s.de/d2r/sparql» (en anglès). Arxivat de l'original el 2018-06-17. [Consulta: 4 agost 2018].
* ↑ «DBLP: Computer science bibliography» (en anglès). [Consulta: 4 agost 2018].
* ↑ «Virtuoso SPARQL Query Editor» (en anglès). Arxivat de l'original el 2019-10-21. [Consulta: 12 octubre 2018].