Vai ai contenuti

LAU



Home > realizzare > accessibilità: linguaggi di programmazione > Interrogare l'RDF con SPARQL


Interrogare l'RDF con SPARQL

Introduzione a SPARQL, linguaggio di interrogazione dell'RDF, con particolare riferimento alle specifiche W3C dell'aprile 2006.

a cura di: Mario Picarelli | 14 settembre 2006


1. Perchè SPARQL?

SPARQL, linguaggio di interrogazione dell' RDF [link esterno] asceso da qualche mese al rango di W3C Candidate Recommendation, è stato accolto entusiasticamente come l'agognato ultimo tassello per l'edificazione del Web semantico (si legga a questo proposito l'articolo di Jonathan Bennett "The semantic web is upon us, says Berners-Lee". [link esterno])

Nei prossimi capitoli introdurrò - senza pretese di esaustività - le caratteristiche essenziali di questo linguaggio, rifacendomi alle specifiche SPARQL Query Language for RDF [link esterno] e Query Results XML Format [link esterno].

Ma perchè SPARQL? Era davvero necessario un linguaggio di interrogazione specifico per l'RDF?
In SQL, XQuery, and SPARQL - What's Wrong With This Picture? [link esterno] Jim Melton si propone di rispondere a queste domande analizzando affinità e divergenze tra SPARQL, XQuery e SQL.

È innanzitutto possible rilevare notevoli somiglianze tra i Data Model su cui si basano i tre linguaggi. L'RDF Data Model, ad esempio, trova corrispondenza con il modello Entity-Relationship: l'asserzione RDF:

soggetto predicato oggetto
id1234 anno 1994

è facilmente "traducibile" come segmento di riga della tabella di un database relazionale nella forma "chiave - nome colonna - valore colonna":

ID anno .....
1234 1994 .....

Discorso analogo vale per l'XPath Data Model, su cui è basato il linguaggio di interrogazione dell'XML, XQuery.

Se è possibile trasporre un Data Model in un altro, ragiona Jim Melton, è altresì possibile trasporre l'un nell'altro i rispettivi linguaggi di interrogazione. Avvalendosi di questi isomorfismi, l'autore procede al confronto tra SPARQL, XQuery e SQL, concludendo:

Gli scopi di SQL e di SPARQL sono abbastanza diversi tra loro da giustificare la creazione di un linguaggio specifico per l'interrogazione dell'RDF. Ci conforta la convinzione che è possibile tradurre espressioni SPARQL in espressioni SQL, permettendo così a chi ne fa uso di immagazzinare i propri dati RDF in database relazionali e di scrivere le query, a seconda dei casi, in SQL oppure in SPARQL. Sebbene sia parimenti possibile trasformare espressioni SPARQL in espressioni XQuery, non crediamo che molti intraprenderanno questa strada.

Per considerazioni dettagliate circa caratteristiche e vantaggi di SPARQL in rapporto al Data Model dell'RDF, consiglio vivamente la lettura integrale dell' articolo SQL, XQuery and SPARQL [link esterno].

torna su

2. Turtle

SPARQL adotta la sintassi Turtle, un'estensione di N-Triples, alternativa estremamente sintetica e intuitiva al tradizionale RDF/XML.

Si considerino le seguenti triple RDF, che saranno utilizzate nel corso dell'articolo come riferimento per le query d'esempio:

@prefix cd: <http://example.org/cd/>
@prefix: <http://example.org/esempio/> :Permutation cd:autore "Amon Tobin".
:Bricolage cd:autore "Amon Tobin".
:Amber cd:autore "Autechre".
:Amber cd:anno 1994.

Le asserzioni sono espresse in concise sequenze soggetto-predicato-oggetto e delimitate da un punto fermo. @prefix introduce prefissi e namespace; i due punti senza prefisso (seconda riga) definiscono il namespace di default. Gli URI sono inclusi tra parentesi uncitate. I letterali di tipo stringa sono contrassegnati da virgolette.

Si veda Turtle - Terse RDF Triple Language [link esterno]

torna su

3. Il "triple" pattern matching

Le query SPARQL si basano sul meccanismo del "pattern matching" e in particolare su un costrutto, il "triple pattern", che ricalca la configurazione a triple delle asserzioni RDF fornendo un modello flessibile per la ricerca di corrispondenze.

?titolo cd:autore ?autore.

In luogo del soggetto e dell'oggetto questo "triple pattern" prevede due variabili, contrassegnate con ?.

Le variabili fungono in un certo senso da incognite dell'interrogazione, cd:autore funge invece da costante: le triple RDF che trovano riscontro nel modello associeranno i propri termini alle variabili corrispondenti.

Per chiarire, ecco una semplice query di selezione SPARQL:

PREFIX cd: <http://example.org/cd/>
SELECT ?titolo ?autore ?anno
FROM <http://cd.com/listacd.ttl>
WHERE {?titolo cd:autore ?autore.
?titolo cd:anno ?ann .
}

L'analogia con SQL è lampante.

PREFIX dichiara prefissi e namespace.

SELECT definisce le variabili di ricerca da prendere in considerazione nel risultato (nell'esempio: titolo, autore e anno).

FROM specifica il set di dati su cui dovrà operare la query (si suppone che le triple siano immagazzinate presso l'indirizzo fittizio "http://cd.com/listacd.ttl").

È inoltre possibile ricorrere a clausole FROM NAMED e alla parola chiave GRAPH per specificare più set di dati: per dettagli circa questa utilissima funzionalità, si vedano le sezioni "7. RDF Dataset" e "8. Querying Dataset" della specifica SPARQL Query Language for RDF. [link esterno]

La clausola WHERE , infine, definisce il criterio di selezione specificando tra parentesi graffe uno o più "triple patterns" separati da punto fermo.

Applicando la query al set di triple del capitolo precedente, si ottiene il seguente risultato:

titolo autore anno
"Amber" "Autechre" 1994

Il "binding" tra variabili e termini reperiti corrispondenti (in questo caso, un termine per ciascuna variabile) è reso in forma di tabella come un rapporto campo-valore: le righe rappresentano i singoli risultati, le intestazioni di cella rappresentano le variabili definite nella clausola SELECT , le celle i termini associati alle variabili.

torna su

4. Ricerca per opzioni e alternative

La query precedente ha catturato esclusivamente le triple dotate di tutti e tre i termini richiesti (titolo, autore, anno), escludendo le triple che ne possedevano due soltanto (titolo, autore).

È possibile riformulare la query in modo più elastico, prevedendo l'eventuale assenza di alcuni termini.

PREFIX cd: <http://example.org/cd/>
SELECT ?titolo ?autore ?anno
FROM <http://cd.com/listacd.ttl>
WHERE {?titolo cd:autore ?autore.
OPTIONAL {?titolo cd:anno ?anno}
}

Nell'esempio, il secondo pattern è dichiarato opzionale: l'informazione è aggiunta al risultato solo se disponibile, altrimenti le variabili compariranno prive di valore (unbound). Risultato della query:

titolo autore anno
"Permutation" "Amon Tobin"  
"Bricolage" "Amon Tobin"  
"Amber" "Autechre" 1994

Le risorse sprovviste della proprietà anno sono mostrate ugualmente e le celle dei valori mancanti sono lasciate vuote.

Un altro modo per assicurare una certa elasticità nel reperimento dei dati è il seguente:

PREFIX cd: <http://example.org/cd/>
SELECT ?titolo ?autore ?anno
FROM <http://cd.com/listacd.ttl>
WHERE{
{?titolo cd:autore ?autore}
UNION
{?titolo cd:anno ?anno}
}

La parola chiave UNION esprime un OR logico: la query non si limita pertanto alle triple che soddisfano entrambi i triple patterns, ma cattura sia quelle che soddisfano il primo, sia quelle che soddisfano il secondo.

torna su

5. Restrizioni sui valori

È possibile porre restrizioni sui valori da associare alle variabili. Ad esempio:

PREFIX cd: <http://example.org/cd/>
SELECT ?titolo ?anno
FROM <http://cd.com/listacd.ttl>
WHERE {?titolo cd:anno ?anno.
FILTER (?anno > 2000).
}

In questo caso, la restrizione è effettuata mediante l'operatore di confronto > : il filtro esclude i termini che non soddisfano la condizione definita tra le parentesi tonde: il risultato in questo caso è nullo (il dataset di riferimento non prevede valori maggiori di 2000 per la proprietà anno ).

Per l'elenco completo degli operatori supportati da SPARQL si veda la sezione 11.3 Operator Mapping della specifica SPARQL Query Language for RDF [link esterno].

Nella sezione successiva, 11.4 Operators Definitions, sono descritti gli operatori specifici del linguaggio: tra questi, mi limito a segnalare regexp, valido corrispettivo dei criteri di ricerca LIKE dell'SQL che permette di adoperare espressioni regolari per il matching dei letterali. Si consideri il seguente esempio:

PREFIX cd: <http://example.org/cd/>
SELECT ?titolo ?autore
FROM <http://cd.com/listacd.ttl>
WHERE { ?titolo cd:autore ?autore .
FILTER regex(?autore, “^au”, “i”)
}

Il filtro seleziona, senza riguardo per maiuscole o minuscole, solo gli autori che iniziano per "au".

titolo autore
"Amber" "Autechre"

Per l'elenco completo delle espressioni regolari supportate da SPARQL, si veda XQuery 1.0 and XPath 2.0 Functions and Operators [link esterno]

torna su

6. Manipolazione del risultato

Come in SQL, è possibile escludere dal risultato i valori duplicati mediante la parola chiave DISTINCT, ad esempio:

SELECT DISTINCT ?titolo ?autore

Altri costrutti supportati da SPARQL per la manipolazione del risultato sono:

ORDER BY DESC(?autore) 
LIMIT 10
OFFSET 10

L'espressione ORDER BY imposta l'ordine dei risultati della query: stando all'esempio, i risultati verranno presentati in ordine decrescente (DESC) in base alla variabile ?autore.

LIMIT pone restrizioni al numero dei risultati, limitandoli, secondo quanto indicato nell'esempio, ai soli primi 10.

OFFSET permette di "saltare" un certo numero di risultati, escludendo, stando all'esempio, i primi 10.

torna su

7. Output XML

La già citata Candidate Recommendation SPARQL Query Results XML Format [link esterno]descrive una sintassi XML per i risultati delle query SPARQL .

Si consideri la seguente query:

PREFIX cd: <http://example.org/cd/>
SELECT ?titolo ?autore
FROM <http://cd.com/listacd.ttl>
WHERE {?titolo cd:autore ?autore}

Il risultato in formato tabulare è:

titolo autore
"Permutation" "Amon Tobin"
"Bricolage" "Amon Tobin"
"Amber" "Autechre"

Il risultato in formato XML è:

<?xml version=”1.0”?>
<sparql xmlns=http://www.w3.org/2005/sparql-results#>
<head>
  <variable name=”titolo” />
  <variable name=”autore” />
</head>
<results ordered=”false” distinct=”false”>
 <result>
 <binding name=”titolo”>
  <literal>Permutation</literal>
 </binding>
 <binding name=”autore”>
  <literal>Amon Tobin</literal>
 </binding>
 </result>
 <result>
 <binding name=”titolo”>
  <literal>Bricolage</literal>
 </binding>
 <binding name=”autore”>
  <literal>Amon Tobin</literal>
 </binding>
 </result>
 <result>
 <binding name=”titolo”>
  <literal>Amber</literal>
 </binding>
 <binding name=”autore”>
  <literal>Autechre</literal>
 </binding
 </result>
</results>
</sparql>

La sintassi è intuitiva, leggibile e facile da gestire mediante fogli di stile.

Sparql è l'elemento radice, l'attributo xmlns definisce, come di consueto, il namespace di riferimento.

Nella sottosezione head sono elencate, nello stesso ordine in cui compaiono nella SELECT della query, le variabili da prendere in considerazione nel risultato, indicate come valori dell'attributo name degli elementi vuoti variable.

La seconda sottosezione, results , contiene una sequenza di elementi result che esprimono, per ciascun risultato della query, il binding tra variabili, indicate come valore dell'attributo name dell'elemento binding, e rispettivi valori (nel caso dell'esempio, letterali di tipo stringa).

I valori booleani degli attributi ordered e distinct dell'elemento results indicano se prendere in considerazione o meno gli eventuali costrutti ORDER BY o SELECT DISTINCT della query.

torna su

8. Webografia

torna su

[ Torna all’inizio della pagina ]



Sito realizzato dal Laboratorio di Accessibilità e Usabilità del CSI-Piemonte - Dichiarazione di accessibilità

[ Torna all’inizio della pagina ]