SPARQL: Simple Protocol and RDF Query Language · La semantica (dal greco sémeìon, segno) è...

30
Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica Elaborato finale in Basi di Dati SPARQL: Simple Protocol and RDF Query Language Anno Accademico 2011/12 Candidato: Ernesto Erra matr. N46000493

Transcript of SPARQL: Simple Protocol and RDF Query Language · La semantica (dal greco sémeìon, segno) è...

Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica Elaborato finale in Basi di Dati

SPARQL: Simple Protocol and RDF Query Language Anno Accademico 2011/12 Candidato: Ernesto Erra matr. N46000493

III

Indice Introduzione 4 Capitolo 1. Il web semantico 5 1.1 I problemi della semantica nel web 7 1.2 Architettura del web semantico 9 Capitolo 2. Ontologie: concetti fondamentali 12 Capitolo 3. SPARQL: caratteristiche del linguaggio 15 3.1 Triple patterns matching 16 3.2 Sintassi di base 18 3.3 Graph patterns e filtraggio 19 3.4 Ricerca per opzioni e alternative 21 3.5 Negazione 22 3.6 Associazione 23 3.7 Aggregazioni 24 3.8 Sub-query e manipolazione del risultato 26 3.9 Query forms 27 Conclusioni 29 Bibliografia e Sitografia 30

SPARQL: Simple Protocol and RDF Query Language

4

Introduzione

Quest’elaborato inizia affrontando il problema del web semantico (Capitolo 1).

L'idea del Web Semantico nasce dalla necessità di estendere l'attuale web in modo da

favorire lo scambio di informazioni oltre che tra esseri umani anche tra programmi per

computer, tramite una rappresentazione che anche questi ultimi siano in grado di utilizzare

e, in un certo modo, di comprendere. Grazie a questa nuova concezione, la connessione fra

i testi e le parole va al di là del legame sintattico, ma si basa soprattutto sul significato dei

documenti pubblicati e sulla possibilità di metterli in relazione fra loro mediante

parole-chiave che "sostengono" il testo scritto.

Un passo fondamentale per arrivare al web semantico è la realizzazione di un modello

ontologico (Capitolo 2) in grado di descrivere le relazioni concettuali tra i dati e la

conoscenza dietro le informazioni.

L’ultima parte dell’elaborato è anche il suo cuore: SPARQL (Capitolo 3).

SPARQL è un elemento chiave del web semantico e consente di estrarre informazioni

dalle basi di conoscenza distribuite sul web. In quest’elaborato è affrontato in maniera

dettagliato il linguaggio.

SPARQL: Simple Protocol and RDF Query Language

5

Capitolo 1 Il web semantico

Il Web è ancora molto giovane, e la sua storia è in costante evoluzione. Nel 1989 l’inglese

Timothy John Berners-Lee ideò, assieme al belga Robert Cailliau, un sistema per

pubblicare e correlare tra di loro contenuti (per la maggior parte testi documentali), dove

qualunque individuo potesse aggiungere ulteriori contenuti al sistema, come anche

eventuali correlazioni tra questi nuovi contenuti a quanto già pubblicato. È la prima idea di

sistema ipertestuale. Questa è la nascita del Web, una vera e propria rete di informazioni,

che negli anni successivi si è diffusa sempre di più in tutto il mondo grazie alla

connessione esistente tra le macchine che Internet ha contribuito a creare.

Il Web ideato da Tim Berners-Lee era dunque una raccolta di contenuti, una specie di

grande biblioteca, caratterizzata però da:

relazioni tra le informazioni (i collegamenti ipertestuali tra le pagine)

una distribuzione universale delle informazioni (ovvero una diffusione mondiale, di

cui ha potuto godere grazie a Internet in breve tempo)

una universale partecipazione ai contenuti del sistema, e dunque a una globale

crescita dell’insieme e alla condivisione gratuita delle informazioni

Grazie all’idea di due uomini si è passati da Internet, vista come una rete di macchine, al

Web, vista come una rete di informazioni espresse in pagine; eppure Tim Berners-Lee

sognava di realizzare una rete di informazioni espresse in concetti.

SPARQL: Simple Protocol and RDF Query Language

6

Così questi due sognatori, dopo i primi dieci anni di vita del Web, cominciarono a lavorare

al Web Semantico più o meno agli inizi del 2001. L’idea era di costruire una rete di

informazioni che fosse più espressiva del semplice collegamento ipertestuale: ogni dato e

ogni parola sarebbe stata associata alle informazioni su ciò che quella parola esprimeva.

Pensiamo alla parola Pesca. Può assumere una molteplicità di significati. Con pesca

possiamo intendere il frutto oppure il verbo pescare. In pratica, abbiamo una parola, ma ci

manca il significato. Occorreva assegnare ad ogni singola informazione uno schema che

ne spiegasse il ruolo e il senso all’interno di una frase.

Ma fare in modo che una macchina abbia gli strumenti per comprendere e capire (o meglio

possedere) il senso di una parola è un lungo e complesso lavoro: ci sono tutta una serie di

informazioni che un lettore umano comprende in maniera naturale, ma che per ovvi motivi

una macchina ignora, che bisogna correlare al testo. Queste sono le meta-informazioni.

Sono necessari degli strumenti che in modo semi-automatico e indipendente dalla lingua

sono in grado di comprendere il senso della parola. Per tutto questo occorre del tempo.

Nel frattempo, il Web stava iniziando a modificarsi e ad assumere particolari

caratteristiche per conto suo e qualcuno cominciò a parlare di Web 2.0: un Web dove

l’accento è posto sulla condivisione delle informazioni e sulla correlazione tra le persone.

Wikipedia è un’enciclopedia dove chiunque può scrivere o correggere una voce; le

piattaforme di blogging permettono a chiunque di scrivere ciò di cui sanno o desiderano

parlare; Facebook è uno strumento con cui chiunque può mantenere intatti i rapporti

interpersonali che ha istituito nel mondo reale. La parola chiave del Web 2.0 è ‘Chiunque’.

La definizione del Web 2.0 non è mai stata accettata da Tim Berners-Lee perché a suo

avviso il Web è nato esattamente con questi scopi.

Tuttavia anche Tim Berners-Lee dovette adeguarsi alla fortuna di quell’etichetta: decise

così che il suo Web Semantico sarebbe stato il Web 3.0.

SPARQL: Simple Protocol and RDF Query Language

7

1.1 I problemi della semantica nel web

L’uso tipico del web è la ricerca e l’uso di informazioni. Alle informazioni sul web si

accede o tramite parole chiave digitate dall’utente (l’efficacia dipende dagli algoritmi usati

dai motori di ricerca) o dalle voci di una barra di navigazione (l’efficacia dipende da chi

ha organizzato e programmato i contenuti del sito).

Un motore di ricerca è un sistema automatico che analizza un insieme di dati, spesso da

esso stesso raccolti, e restituisce un indice dei contenuti disponibili classificandoli in base

a formule statistico-matematiche che ne indichino il grado di rilevanza data una

determinata chiave di ricerca. I motori di ricerca basati su parole chiave sono gli strumenti

principali dei sistemi web. Molto dipende dal potere evocativo della parola chiave. Nel

caso di navigazione attraverso parole chiave, può sorgere il problema dell’ambiguità: ad

esempio la parola albero può avere più significati a seconda che la materia di interesse sia

l’informatica, la botanica, o la nautica. Il problema dei motori di ricerca é costituito

dall’enorme quantità di informazioni, a volte completamente inutile, che i motori

restituiscono e ciò nonostante i continui miglioramenti delle tecniche di indicizzazione e

ricerca. Il problema più grande é che il significato del contenuto del web non é accessibile

alla macchina. É molto difficile per una macchina distinguere frasi semantiche. Sono

possibili due approcci. Il primo è l’approccio di elaborazione testi, basato su tecniche di

intelligenza artificiale e linguistica computazionale. Il secondo approccio è rendere la

rappresentazione del web in modo più comprensibile alla macchina: il web semantico.

La semantica (dal greco sémeìon, segno) è quella parte della linguistica che studia il

significato delle parole, degli insiemi delle parole, delle frasi e dei testi. In generale, la

semantica è ciò che mette in relazione le espressioni linguistiche con quello che il

contenuto di tali espressioni "vuole dire". Implica un processo di interpretazione.

SPARQL: Simple Protocol and RDF Query Language

8

Con il termine web semantico si intende la trasformazione del World Wide Web in un

ambiente dove i documenti pubblicati (pagine HTML, file, immagini, e così via) siano

associati ad informazioni e dati (metadati) che ne specifichino il contesto semantico in un

formato adatto all'interrogazione e l'interpretazione e, più in generale, all'elaborazione

automatica.

Con l'interpretazione del contenuto dei documenti che il Web semantico propone, saranno

possibili un’interpretazione più significativa del contenuto dei documenti stessi e ricerche

molto più evolute delle attuali, basate sulla presenza nel documento di parole chiave, e

altre operazioni specialistiche come la costruzione di reti di relazioni e connessioni tra

documenti secondo logiche più elaborate del semplice collegamento ipertestuale.

Il web semantico è circa due cose. Si tratta di formati comuni per l'integrazione e la

combinazione dei dati tratti da fonti diverse, a differenza del web originale che è

concentrato soprattutto sull'interscambio di documenti. Si tratta anche di linguaggio per

descrivere come i dati si riferiscono agli oggetti del mondo reale. Questo permette a una

persona, o una macchina, di iniziare in un unico database, per poi passare attraverso una

serie infinita di basi di dati che sono collegati non attraverso fili, ma attraverso un

significato comune.

Il primo passo per mettere le macchine in grado di operare in maniera più efficiente sono

dei documenti ben strutturati corredati da metadati. I metadati sono dati che descrivono

altri dati, ed esprimono parte di quello che c’è da sapere su un certo insieme di dati, e ciò

che da tale conoscenza è possibile inferire mediante regole di ragionamento. Questo

significa che il web semantico intende recuperare tutta la tradizione della ricerca in

intelligenza artificiale che va sotto il nome di rappresentazione della conoscenza,

focalizzandola tuttavia su un nuovo obiettivo molto ben delimitato e preciso. Lo strumento

tecnico elaborato per esprimere i metadati nel web semantico sono dei linguaggi di

annotazione o di marcatori costruiti a partire da XML, come RDF.

SPARQL: Simple Protocol and RDF Query Language

9

1.2 Architettura del web semantico

Le macchine devono essere in grado di ragionare sui dati. Per rendere i dati processabili,

abbiamo bisogno di:

identificatori non ambigui che permettano anche una associazione tra i dati e gli

oggetti del mondo reale;

un modello comune per i dati in modo da accedere, connettere e descrivere tali

oggetti;

un linguaggio per accedere a questo modello dei dati;

un vocabolario comune;

una logica per il ragionamento.

Il web semantico ha l’obiettivo di rispondere a queste esigenze, attraverso una estensione

dell’attuale web, fornendo una infrastruttura per l’integrazione dei dati sul web. Gli

strumenti adottati sono URI (gli identificatori non ambigui), RDF (modello comune di

dati), SPARQL (linguaggio per accedere al modello), RDFS e OWL (vocabolario comune)

e OWL e RULES (la logica).

Lo sviluppo del web semantico procede a livelli, con l’obiettivo di ottenere consenso su

piccoli passi. I livelli del web semantico sono mostrati in figura 1.2.1.

Figura 1.2.1 Architettura del web semantico

SPARQL: Simple Protocol and RDF Query Language

10

Le URI (Uniform Resource Identifier) sono le fondamenta del web semantico. Difatti,

viene richiesto di identificare ogni cosa in modo univoco per mezzo di una stringa di

caratteri nello spazio globale delle URI.

XML (eXtensible Markup Language) è un linguaggio di marcatori che ci permette di

strutturare i documenti Web con un vocabolario definito dall’utente. Il linguaggio XML

permette di definire dei tag, ossia delle etichette che commentano porzioni di pagina.

L’uso di questi tag non permette di esplicitarne una semantica.

L’RDF (Resource Data Freamwork) è il modello base per i dati che permette di scrivere

frasi su oggetti web, cioè sulle risorse, e ha una sintassi basata su XML. L’RDF è lo

strumento base proposto da W3C per la codifica, lo scambio e il riutilizzo di metadati

strutturati e consente l'interoperabilità tra applicazioni che si scambiano informazioni sul

web. Interoperabilità significa non solo l’abilità di programmi progettati

indipendentemente e implementati su piattaforme diverse di scambiarsi dati, ma

soprattutto di cooperare tra di loro sulla base di una comprensione del significato dei dati

oggetto di scambio. L’RFD è costituito da due componenti: RDF modello e sintassi, che

espone la struttura del modello RDF e descrive una possibile sintassi; RDF Schema, che

espone la sintassi per definire schemi e vocabolari per i metadati. L’RDF schema mette a

disposizione delle primitive per organizzare gli oggetti web in gerarchie, utilizzando la

loro descrizione RDF.

L'OWL (Ontology Web Language) è un linguaggio di marcatori per rappresentare

esplicitamente il significato e la semantica di termini con vocabolari e relazioni tra gli

stessi. Esistono varie versioni del linguaggio, che differiscono molto tra di loro. Lo scopo

di OWL è descrivere delle basi di conoscenze, effettuare delle deduzioni su di esse e

integrarle con i contenuti delle pagine web. L’OWL è un linguaggio che permette di

esprimere relazioni complesse fra risorse.

SPARQL: Simple Protocol and RDF Query Language

11

Il modello dei dati di RDF si basa su tre principi chiave:

qualunque cosa può essere identificata da un URI;

minima potenza, cioè utilizzare il linguaggio meno espressivo per definire

qualunque cosa;

qualunque cosa può dire qualunque cosa su qualunque cosa.

Qualunque cosa descritta da RDF è detta risorsa. Principalmente una risorsa è reperibile

sul web, ma RDF può descrivere anche risorse che non si trovano direttamente sul web.

Ogni risorsa è identificata da un URI. Il modello di dati RDF è formato da risorse,

proprietà e valori. Le proprietà sono delle relazioni che legano tra loro risorse e valori, e

sono anch'esse identificate da URI. Un valore, invece, è un tipo di dato primitivo, che può

essere una stringa contenente l'URI di una risorsa.

L'unità base per rappresentare un'informazione in RDF è lo statement. Uno statement è

una tripla del tipo (soggetto-predicato-oggetto), dove il soggetto è una risorsa, il predicato

è una proprietà e l'oggetto è un valore, e quindi anche un URI che punta ad un'altra risorsa.

Uno statement può essere rappresentato mediante un grafo come in figura 1.2.2.

Figura 2.2.2 Statemet RDF

In questo modo, RDF è un grafico dei dati diretto provvisto di etichette per la

rappresentazione delle informazioni nel web. Il modello dei dati RDF permette di definire

un modello semplice per descrivere le relazioni tra le risorse, in termini di proprietà

identificate da un nome e relativi valori. Tuttavia, il modello dei dati RDF non fornisce

nessun meccanismo per dichiarare queste proprietà, né per definire le relazioni tra queste

proprietà ed altre risorse. Tale compito è delegato a RDF Schema. In RDF Schema ogni

predicato è in relazione con altri predicati e permette di dichiarare l'esistenza di proprietà

di un concetto, che permettano di esprimere con metodo sistematico affermazioni simili su

risorse simili. RDF Schema permette di definire nuovi tipi di classe. Inoltre specificando il

concetto di classe e sottoclasse, consente di definire gerarchie di classi. In RDF si possono

rappresentare le risorse come istanze di classi e definire sottoclassi e tipi.

SPARQL: Simple Protocol and RDF Query Language

12

Capitolo 2 Ontologie: concetti fondamentali

L’ontologia è lo studio della natura dell’essere. Il termine deriva dal greco e significa

letteralmente discorso sull’essere. L’ontologia è la branca della metafisica avente lo scopo

di identificare le cose esistenti e come descriverle.

È uno di quei termini di cui l’informatica si è appropriata, modificandone il significato

originario: si parla infatti di una ontologia, non di Ontologia.

Secondo la definizione di Tom Gruber, una ontologia costituisce una descrizione esplicita

e formale di una concettualizzazione condivisibile.

Stando a questa definizione, in informatica, il termine ontologia si riferisce specificamente

ad un tentativo di formulare una concettualizzazione esaustiva e rigorosa nell'ambito di un

dato dominio. Si tratta generalmente di una struttura dati gerarchica che contiene tutte le

entità rilevanti, le relazioni esistenti fra di esse, le regole, gli assiomi ed i vincoli specifici

del dominio. Tale struttura viene normalmente formalizzata per mezzo di linguaggi

semantici che devono rispondere alle leggi della logica formale, ed è per questo che si usa

il termine di ontologia formale. Una ontologia descrive dunque formalmente il dominio di

un discorso. Tipiche ontologie consistono in una lista finita di termini e nelle relazioni tra

questi termini. Un termine denota un concetto, o meglio una classe di oggetti, nel dominio

di interesse. Nel contesto del web, una ontologia permette allora una comprensione

condivisa del dominio stesso.

SPARQL: Simple Protocol and RDF Query Language

13

Il termine ontologia formale è entrato in uso nel campo dell'intelligenza artificiale e della

rappresentazione della conoscenza, per descrivere il modo in cui diversi schemi vengono

combinati in una struttura dati contenente tutte le entità rilevanti e le loro relazioni in un

dominio. I programmi informatici possono usare l'ontologia per una notevole varietà di

scopi, tra cui il ragionamento induttivo, la classificazione, e svariate tecniche per la

risoluzione di problemi.

Tipicamente, le ontologie informatiche sono strettamente legate a vocabolari controllati,

cioè a repertori di concetti classificati in un'ontologia fondamentale, in base al quale tutto

il resto deve essere descritto (entro il modello utilizzato). Un vocabolario è una lista di

termini, esplicitamente enumerati, in cui tutti i termini devono avere un’unica definizione

e non essere ambigui.

Abbiamo le seguenti definizioni:

Ontologia: insieme di tecnologie per la modellazione di conoscenza.

Modello ontologico: modello che definisce in modo esplicito le relazioni e la

semantica delle entità di un dominio.

Linguaggio ontologico: linguaggio per la descrizione di un modello ontologico

Un modello Ontologico si compone di classi, attributi, relazioni ed individui; un modello

ontologico, come si nota dalla figura 2.1, è simile ad un modello ad oggetti.

Figura 2.1 Modello ontologico

SPARQL: Simple Protocol and RDF Query Language

14

Le classi sono insiemi, collezioni o tipi di oggetti. Gli attributi sono proprietà,

caratteristiche o parametri che gli oggetti possono avere e condividere. Le relazioni sono

modi in cui gli oggetti possono essere messi in relazione gli uni con gli altri. Gli individui

sono istanze del modello, sono gli elementi di base. Le relazioni tra classi includono:

gerarchie tra classi; proprietà; restrizioni di valori; statement di disgiunzione; specifiche di

relazioni logiche tra oggetti. In particolare si individuano due principali tipi di relazione:

sussunzione e meronimia. La relazione di sussunzione è usata per creare una gerarchia, o

un grafo aciclico, di classi; è una relazione del tipo ‘è una superclassi di’. La relazione di

meronimia serve a descrivere come i concetti si combinano insieme per formarne di nuovi;

è una relazione del tipo ‘è parte di’.

Esistono molti tipi di modelli ontologici, e si distinguono in:

Fundation Ontology: modello ontologico relativo a quei concetti che si possono

applicare a domini diversi;

Domain Ontology: modello che descrive i concetti di un dominio specifico;

Specialized Ontology: estensione di un Domain Ontology con scopi molto specifici.

Le operazioni tipiche che si effettuano su un modello ontologico sono:

costruire un modello ontologico estendendone uno esistente;

eseguire il mapping tra i concetti di un modello ontologico con quelli di un altro;

unire in un unico modello le informazioni provenienti da sorgenti diverse.

Le informazioni sulle relazioni sono codificate nel tesauro da utilizzare per abilitare la

ricerca semantica nel motore di ricerca documentale. Il termine tesauro indica una

collezione di termini priva di definizioni, che hanno in comune fra loro degli aspetti sul

significato. Una tassonomia è una collezione di termini di un vocabolario controllato

organizzati in una struttura gerarchica attraverso relazioni di specializzazione. Un tesauro

è una rete di termini di un vocabolario controllato. Questo significa che un tesauro adopera

relazioni associative in aggiunta a quelle di specializzazione. Le informazioni rilevanti

estratte dal dominio sono o concetti o relazioni semantiche tra essi. Possono essere

codificate nel tesauro in base alle specifiche definite o da OWL e RDF.

SPARQL: Simple Protocol and RDF Query Language

15

Capitolo 3 SPARQL: caratteristiche del linguaggio

SPARQL (acronimo di: Simple Protocol and RDF Query Language) è un linguaggio di

interrogazione per Resource Description Framework (RDF) reso standard dal Data Access

Working Group, gruppo di lavoro del consorzio W3C, che lo ha reso raccomandazione

ufficiale il 15 gennaio 2008.

SPARQL è un elemento chiave del web semantico e consente di estrarre informazioni

dalle basi di conoscenza distribuite sul web. RDF descrive i concetti e le relazioni su di

essi attraverso l'introduzione di triple (soggetto-predicato-oggetto); se tali triple hanno

degli elementi in comune emerge un grafo di conoscenza. SPARQL non fa altro che

ricercare dei sotto-grafi corrispondenti alla richiesta dell'utente che effettua la query.

L'elemento chiave di RDF sono le URI, che identificano le risorse in maniera univoca e

consentendo a chi usa SPARQL di scrivere query ben definite e non ambigue.

L'elaborazione in SPARQL avviene introducendo due informazioni: il grafo dei dati

(presente sul Web) e il grafo di query (descritto attraverso triple dall'utente). L'output può

essere di più tipi, ma principalmente si utilizzano interrogazioni di tipo esistenziale (esiste

o meno il sotto-grafo ricercato?) o tabellare (elencami i risultati possibili).

SPARQL può essere usato per esprimere query attraverso varie fonte di dati, se i dati sono

memorizzati in modo nativo come RDF o visualizzati come RDF attraverso middleware.

SPARQL: Simple Protocol and RDF Query Language

16

SPARQL contiene funzionalità per l'esecuzione di query su pattern graph obbligatori e

facoltativi con le loro congiunzioni e disgiunzioni. SPARQL supporta anche l’esecuzione

di query attraverso un grafico sorgente RDF. I risultati delle query SPARQL possono

essere gruppi di risultati o grafici RDF.

SPARQL adotta la sintassi Turtle, un'estensione di N-Triple, alternativa estremamente

sintetica e intuitiva al tradizionale RDF/XML. Si considerino le seguenti triple RDF:

@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

angolari. I letterali di tipo stringa sono contrassegnati da virgolette.

Da un punto di vista sintattico, SPARQL può ricordare SQL (Structured Query Language),

il linguaggio per interrogare basi di dati, anche sei due modelli di rappresentazione

sottostanti presentano notevoli differenze. Un database relazionale è caratterizzato da

record organizzati in tabelle e il processo di identificazione degli oggetti informativi

memorizzati tramite record avviene tramite le primary e foreign key. In RDF, ogni risorsa

è identificata da un URI. Più grafi RDF possono essere connessi in un unico grafo e

l’insieme delle informazioni circa una risorsa può essere recuperato tramite un

meccanismo di unificazione sulle URI.

3.1 Triple patterns matching

Le query SPARQL si basano sul meccanismo del "pattern matching" e in particolare su un

costrutto, il "triple pattern". I triple patterns sono come triple RDF, salvo che ciascun

SPARQL: Simple Protocol and RDF Query Language

17

soggetto del predicato, e oggetto può essere una variabile. In questo modo, i triple pattern

forniscono un modello flessibile per la ricerca di corrispondenze. Ad esempio nella tripla ?titolo cd:autore ?autore.

in luogo del soggetto e dell'oggetto sono previste due variabili, contrassegnate con un

punto interrogativo. 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 assoceranno i propri termini alle variabili corrispondenti.

La maggior parte delle forme di query SPARQL contengono una serie di triple patterns

chiamato basic graph pattern. Un basic graph pattern corrisponde a un sottografo dei dati

RDF quando i termini RDF di tale sottografo possono essere sostituiti con delle variabili.

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 ?anno . }

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ù insiemi di dati.

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 all’insieme di triple del precedente esempio, si ottiene il risultato:

titolo autore anno "Amber" "Autechre" 1994

SPARQL: Simple Protocol and RDF Query Language

18

Il collegamento (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.

Le IRI sono una generalizzazione di URI e sono compatibili con URI e URL. L'insieme

dei termini RDF include riferimenti URI, mentre i termini SPARQL includono IRI.

La parola chiave PREFIX associa un'etichetta prefisso con un IRI. Un nome prefisso è

composto da un'etichetta prefisso e da una parte locale, separati da due punti ":". Un nome

prefisso è mappato a un IRI concatenando l’IRI associato al prefisso e la parte locale.

L'etichetta prefisso o la parte locale può essere vuota. Si noti che i nomi locali SPARQL

consentono di iniziare con delle cifre e caratteri non alfanumerici (mediante escape

backslash), a differenza dei nomi locali XML, che invece non lo permettono.

3.2 Sintassi di base

La sintassi generale per letterali è una stringa (racchiusa tra virgolette doppie, "...", o

singoli apici, '...'), con o un tag di lingua opzionale (introdotto da @) o un tipo di dati IRI

opzionale o un nome prefisso (introdotto dal ^ ^).

Per comodità, i numeri interi possono essere scritti direttamente (cioè senza le virgolette e

senza un esplicito tipo di dati IRI) e vengono interpretati come valori letterali di tipo

xsd:integer; i numeri decimali con il '.' nel numero, ma con nessun esponente, sono

interpretati come xsd:decimal; e i numeri con esponenti sono interpretati come

xsd:double. I valori di tipo xsd:boolean sono scritti come true o false.

Per facilitare la scrittura di valori letterali che contengono virgolette o che sono lunghe e

contengono caratteri di nuova riga, SPARQL permette di inserire tali caratteri

racchiudendoli in tre singoli apici.

SPARQL: Simple Protocol and RDF Query Language

19

Una variabile di query viene contrassegnata con l'uso di una "?" o "$", il "?" o "$" non fa

parte del nome della variabile. In una query, $abc e ?abc identificano la stessa variabile.

I nodi vuoti nei pattern grafici agiscono da variabili. I nodi vuoti sono indicati come

"_:abc", o nella forma abbreviata "[]". Un nodo vuoto viene utilizzato in maniera

univoca per formare il triple pattern. Un nodo vuoto con etichetta viene utilizzato come

oggetto di tutte le coppie predicato-oggetto contenute. Il nodo vuoto creato può essere

utilizzato anche in altri triple pattern nelle posizioni soggetto e oggetto. Ad esempio, le

forme [ :p "v" ] e [] :p "v" allocano un nodo vuoto univoco e nell’espressione

[ :p "v" ] :q "w" viene utilizzato come soggetto in un triple pattern, mentre

nell’espressione :x :q [ :p "v" ] viene utilizzato come oggetto del triple pattern.

I triple pattern con un soggetto comune possono essere scritti in modo che il soggetto sia

scritto solo una volta e viene utilizzato al posto di più triple pattern utilizzando la

notazione ";", come ad esempio ?x foaf:name ?name ; foaf:mbox ?mbox. Se invece i

triple pattern condividono sia il soggetto che il predicato, allora gli oggetti possono essere

separati da una “,”, come ad esempio ?x foaf:nick "Alice" , "Alice_".

Le RDF collection possono essere scritte nei triple pattern utilizzando la sintassi

"(elemento1 elemento2 ...)". Sono assegnati triple pattern con nodi vuoti quando vengono

utilizzati elementi nella collection, come ad esempio (1 ?x 3 4). Il nodo vuoto alla testa

della collection può essere utilizzato come soggetto o oggetto in altri triple patterns. I nodi

vuoti assegnati a una sintassi di una collection non occorrono in altre parti della query.

3.3 Graph patterns e filtraggio

I basic graph pattern sono insiemi di triple pattern. Lo SPARQL graph pattern matching è

definito in termini di combinazione dei risultati della corrispondenza dei basic graph

patterns. Una sequenza di triple pattern, con filtri opzionali, comprende un unico modello

grafico di base. Qualsiasi altro graph pattern termina con un basic graph pattern.

SPARQL: Simple Protocol and RDF Query Language

20

In una stringa query SPARQL, un gruppo di graph pattern è delimitato dalle parentesi

graffe {}. Ad esempio PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?mbox WHERE { ?x foaf:name ?name . ?x foaf:mbox ?mbox . }

Il pattern di gruppo {} corrisponde a qualsiasi grafo (compreso il grafo vuoto) con una

soluzione che non vincola le variabili. Per esempio SELECT ?x WHERE {}

corrisponde a una soluzione in cui la variabile x non è vincolata.

Un vincolo, espresso dalla parola chiave FILTER, è una restrizione delle soluzioni su tutto

il gruppo in cui il filtro appare. È dunque possibile porre restrizioni sui valori da associare

alle variabili. Un esempio di applicazione del filtraggio con FILTER è il codice PREFIX cd: <http://example.org/cd/> SELECT ?titolo ?anno FROM <http://cd.com/listacd.ttl> WHERE {?titolo cd:anno ?anno. FILTER (?anno > 2000). }

Sono messi a disposizione diversi operatori specifici del linguaggio: tra questi, in

particolare abbiamo regexp, valido corrispettivo dei criteri di ricerca LIKE dell'SQL che

permette di adoperare espressioni regolari per il matching dei letterali. Si consideri: 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". Otteniamo il risultato: titolo autore

"Amber" "Autechre"

SPARQL: Simple Protocol and RDF Query Language

21

3.4 Ricerca per opzioni e alternative

I basic graph patterns consentono alle applicazioni di effettuare query in cui l’intera query

pattern deve corrispondere alla possibile soluzione. Per ogni soluzione di una query

contenente solo gruppi di graph pattern con almeno un basic graph pattern, ogni variabile è

associata ad un termine RDF nella soluzione. Tuttavia, strutture regolari e complete non

possono essere assunte in tutti i grafici RDF.

Tutte le query viste finora hanno catturato esclusivamente le triple dotate di tutti i termini

richiesti, escludendo le triple che possedevano soltanto alcuni termini. È utile poter

disporre di query che permettono l’aggiunta di informazioni alla soluzione nel caso in cui

tale informazione è disponibile, ma senza rifiutare una soluzione perché una parte del

query pattern non corrisponde. Questi servizi sono offerti da associazioni opzionali: se la

parte opzionale non corrisponde, anche se non crea un binding, quantomeno non elimina la

soluzione. Le parti opzionali del graph pattern possono essere specificate sintatticamente

con la parola chiave OPTIONAL applicato ad un graph pattern. È possibile formulare le

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). Il 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.

SPARQL: Simple Protocol and RDF Query Language

22

I graph pattern vengono definiti in modo ricorsivo. Un graph pattern può avere zero o più

graph pattern opzionali, e qualsiasi parte di un query pattern può avere un componente

opzionale. Nell’esempio seguente ci sono due graph pattern opzionali. PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?mbox ?hpage WHERE { ?x foaf:name ?name . OPTIONAL { ?x foaf:mbox ?mbox } . OPTIONAL { ?x foaf:homepage ?hpage } }

con un output del tipo name Mbox hpage

"Alice" <http://work.example.org/alice/> "Bob" <mailto:[email protected]>

SPARQL fornisce un mezzo di combinazione di graph pattern in modo che si possa

trovare una corrispondenza tra diversi graph pattern alternativi. Questi pattern alternativi

sono sintatticamente specificati con la parola chiave UNION. Questo è un altro modo per

assicurare una certa elasticità nel reperimento dei dati. Consideriamo l’esempio 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 quelli che soddisfano il primo, sia

quelli che soddisfano il secondo.

3.5 Negazione

Il linguaggio di query SPARQL incorpora due tipi di negazione, una basata sul filtraggio

dei risultati a seconda che un graph pattern trova o non trova una corrispondenza nel

contesto delle soluzioni filtrate, e l'altra basata sulla eliminazione delle soluzioni relative

ad un altro pattern.

SPARQL: Simple Protocol and RDF Query Language

23

La negazione del filtraggio delle soluzioni di una query viene fatto all'interno di

un'espressione FILTER con NOT EXISTS e EXISTS. Si noti che le regole di filtraggio si

applicano a tutto il gruppo in cui il filtro appare.

L’espressione NOT EXISTS del filtro verifica se un graph pattern non corrisponde

all’insieme dei dati dei valori delle variabili nel gruppo di graph pattern in cui opera il

filtro. Esso non genera altre associazioni di binding.

È prevista anche una espressione EXISTS del filtro. In questo caso si verifica se il pattern

può essere trovato nei dati; esso non genera altre associazioni.

L'altro stile di negazione disponibile in SPARQL è MINUS che valuta entrambi gli

argomenti e quindi calcola le soluzioni nel lato sinistro che non sono compatibili con le

soluzioni sul lato destro. Un esempio di codice che utilizza MINUS è PREFIX : <http://example/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT DISTINCT ?s WHERE { ?s ?p ?o . MINUS { ?s foaf:givenName "Bob" .} }

3.6 Associazione

Il valore di un'espressione può essere aggiunto ad una soluzione di mapping associando ad

una nuova variabile il valore dell'espressione, che è un termine RDF. In SPARQL, questa

associazione all'interno di una soluzione di una query non cambia mai. Questa variabile

può quindi essere utilizzata nella query e può anche essere restituita nei risultati.

Tre forme di sintassi permettono questo: la parola chiave BIND, le espressioni nella

clausola SELECT e le espressioni nella clausola GROUP BY. La forma di assegnazione è

(espressione AS ?var). Se la valutazione dell'espressione genera un errore, la variabile

rimane non associata a tale soluzione. I dati possono anche essere direttamente inclusi in

una query attraverso la clausola BINDINGS.

SPARQL: Simple Protocol and RDF Query Language

24

La forma BIND consente l’assegnazione di un valore a una variabile in un gruppo di graph

pattern. L’uso di BIND è un elemento separatore di gruppi di graph pattern e termina

qualsiasi basic graph pattern. Un esempio di codice che usa BIND è PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX ns: <http://example.org/ns#> SELECT ?title ?price { ?x ns:price ?p . ?x ns:discount ?discount BIND (?p*(1-?discount) AS ?price) FILTER(?price < 20) ?x dc:title ?title . }

Una clausola BINDINGS in una query fornisce una sequenza di soluzioni non ordinata che

si combina con i risultati valutati dalla query da un'operazione di join. Può essere

utilizzato da un'applicazione per fornire requisiti specifici sui risultati della query e anche

dalle implementazioni del SPARQL query engine che forniscono query con la parola

chiave SERVICE per inviare più di un vincolo di query a un servizio di query remoto. PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX : <http://example.org/book/> PREFIX ns: <http://example.org/ns#> SELECT ?book ?title ?price { ?book dc:title ?title ; ns:price ?price . } BINDINGS ?book { (:book1) }

3.7 Aggregazioni

Gli aggregati applicano espressioni su gruppi di soluzioni. Per impostazione predefinita,

un insieme di soluzioni è costituito da un singolo gruppo, che contiene tutte le soluzioni.

Il raggruppamento può essere impostato con la sintassi GROUP BY. Gli aggregati definiti

in SPARQL sono COUNT, SUM, MIN, MAX, AVG, GROUP_CONCAT e SAMPLE.

Gli aggregati sono utilizzati quando si desidera visualizzare il risultato di una query

SPARQL: Simple Protocol and RDF Query Language

25

calcolato su un gruppo di soluzioni, piuttosto che su una singola soluzione. Ad esempio, il

valore massimo assunto da una particolare variabile, invece di ogni singolo valore.

Consideriamo i dati @prefix : <http://books.example/> . :org1 :affiliates :auth1, :auth2 . :auth1 :writesBook :book1, :book2 . :book1 :price 9 . :book2 :price 5 . :auth2 :writesBook :book3 . :book3 :price 7 . :org2 :affiliates :auth3 . :auth3 :writesBook :book4 . :book4 :price 7 .

e la query PREFIX : <http://books.example/> SELECT (SUM(?lprice) AS ?totalPrice) WHERE { ?org :affiliates ?auth . ?auth :writesBook ?book . ?book :price ?lprice . } GROUP BY ?org HAVING (SUM(?lprice) > 10)

con il risultato

Questo esempio mostra due caratteristiche degli aggregati: GROUP BY, che raggruppa le

soluzioni della query secondo una o più espressioni (in questo caso ?org), e HAVING,

che è analogo all’espressione FILTER, ma opera su raggruppamenti di soluzioni, piuttosto

che su singole soluzioni.

L'esempio è prodotto da soluzioni di raggruppamento in base alla espressione GROUP BY

(vale a dire tutte le soluzioni dove ?org assume un particolare valore all'interno dello

stesso gruppo), e la valutazione della funzione SUM su tale gruppo. I gruppi vengono

filtrati dall'espressione HAVING, che rimuove tutti i gruppi che hanno il valore

SUM(?lprice) non maggiore di 10.

Per calcolare valori aggregati di una soluzione, la soluzione è prima divisa in uno o più

gruppi, e il valore aggregato viene calcolato per ciascun gruppo. Se gli aggregati sono

totalPrice 21

SPARQL: Simple Protocol and RDF Query Language

26

utilizzati nelle clausole SELECT, HAVING o ORDER BY ma il termine GROUP BY non

è usato, allora questo è considerato come un unico gruppo implicito, a cui appartengono

tutte le soluzioni.

All'interno delle clausole GROUP BY la parola chiave AS per gli alias può essere

utilizzata; ad esempio GROUP BY (x? + ?y AS ?z) è equivalente a {...BIND (x? + ?y

AS ?z)} GROUP BY ?z. Va notato che come per le funzioni, le espressioni di

aggregazione devono essere alias (in modo simile alla clausola BIND, utilizzando la

parola chiave AS) per proiettarli su query o sub-query. Nell'esempio questo viene fatto

usando la variabile ?TotalPrice. È un errore per gli aggregati proiettare variabili con un

nome già utilizzato in altre proiezioni aggregate, o nella clausola WHERE.

Nella query di aggregazione e nelle sub-query, le variabili che compaiono nel query

pattern, ma che non compaiono nella clausola GROUP BY, possono essere solo proiettati

o utilizzati in espressioni di selezione se sono aggregati. L'aggregato SAMPLE può essere

utilizzato per questo scopo.

3.8 Sub-query e manipolazione del risultato

Le sub-query sono un modo per inserire delle query SPARQL in altre query, al fine di

raggiungere risultati che non possono essere conseguiti diversamente, come ad esempio la

limitazione del numero dei risultati di alcuni sotto espressioni nella query. A causa della

natura bottom-up di valutazione delle query SPARQL, le sub-query vengono valutate

logicamente prima, ed i risultati sono proiettati fino alla query esterna. Si noti che solo le

variabili proiettate fuori dalle sub-query fino alla query più esterna saranno visibili.

Normalmente una sequenza di soluzioni fornite da una query SPARQL prevede la

possibilità di mostrare soluzioni duplicate. Come in SQL, è possibile escludere dal

risultato i valori duplicati mediante la parola chiave DISTINCT, ad esempio: SELECT DISTINCT ?titolo ?autore

SPARQL: Simple Protocol and RDF Query Language

27

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

ORDER BY DESC(?autore) OFFSET 10 LIMIT 10

L'espressione ORDER BY imposta l'ordine dei risultati della query: i risultati verranno

presentati in ordine crescente se è utilizzata la clausola ASC o nessuna clausola, o in

ordine decrescente se è utilizzata la clausola DESC (come nell’esempio basato sulla

variabile ?autore).

OFFSET fa in modo che le soluzioni generate iniziano dopo il numero di soluzioni

specificate; in pratica permette di saltare un certo numero di risultati, escludendo, stando

all'esempio, i primi 10. Un OFFSET di 0 non ha alcun effetto.

LIMIT pone un limite superiore al numero dei risultati che vengono restituiti, limitandoli,

secondo quanto indicato nell'esempio, ai soli primi 10.

3.9 Query forms

SPARQL ha quattro query forms. Queste query forms utilizzano le soluzioni di pattern

matching per formare un insieme di risultati o grafi RDF. Le query forms sono:

SELECT: restituisce tutti, o un sottoinsieme, delle variabili vincolate a un query

pattern match;

CONSTRUCT: restituisce un grafo RDF costruito sostituendo le variabili in un

insieme di triple pattern;

ASK: restituisce un valore booleano che indica se è stata trovata una corrispondenza

al query pattern oppure no;

DESCRIBE: restituisce un grafo RDF che descrive le risorse trovate.

La query form CONSTRUCT restituisce un singolo grafo RDF specificato da un graph

template. Il risultato è un grafo RDF formato prendendo ogni soluzione della query nella

sequenza di soluzioni, sostituendole alle variabili nel graph template, e combinando le

SPARQL: Simple Protocol and RDF Query Language

28

triple in un unico grafo RDF. Se una qualsiasi istanziazione produce una tripla contenente

una variabile unbound o un costrutto RDF illegale, come un letterale nella posizione

soggetto o predicato, allora la tripla non è inclusa nel grafo RDF di output. Il graph

template può contenere triple senza variabili (note come ground triples o triple esplicite), e

questi appaiono anche nel grafo RDF restituito in uscita dalla forma query CONSTRUCT.

Ad esempio, con i dati di partenza @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name "Alice" . _:a foaf:mbox <mailto:[email protected]> .

la query PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#> CONSTRUCT { <http://example.org/person#Alice> vcard:FN ?name } WHERE { ?x foaf:name ?name }

produce in uscita le proprietà vcard @prefix vcard: <http://www.w3.org/2001/vcard-rdf/3.0#> . <http://example.org/person#Alice> vcard:FN "Alice" .

Le applicazioni possono utilizzare la form ASK per testare se un query pattern ha una

soluzione oppure no. Nessuna informazione è restituita dalle possibili soluzioni della

query, dice solo se una soluzione esiste oppure no. Restituisce o false o true.

La form DESCRIBE restituisce un unico grafo RDF come risultato contenente i dati

relativi alle risorse RDF. Il query pattern viene utilizzato per creare un insieme di risultati.

La forma DESCRIBE prende ciascuna delle risorse individuate in una soluzione, insieme a

tutte le risorse nominate direttamente dall'IRI, e assembla un unico grafo RDF prendendo

una "descrizione", che può provenire da qualsiasi informazione disponibile, compreso il

Dataset RDF. La sintassi DESCRBE * è una abbreviazione che descrive tutte le variabili

in una query.

SPARQL: Simple Protocol and RDF Query Language

29

Conclusioni

SPARQL consente di interrogare modelli RDF e OWL sfruttando le relazioni semantiche

rappresentate nel modello ed ha i requisiti necessari per diventare il linguaggio di query

standard del Web Semantico. Soddisfa pienamente i requisiti di un buon linguaggio di

interrogazione, ma non la proprietà safety (è verificata quando una query corretta

restituisce un insieme finito di risultati). Infatti, una ricerca potrebbe generare un numero

indefinito di risultati oppure richiedere un eccessivo uso della memoria a causa dei modelli

di definizioni caricati o della loro complessità. Pertanto l’accuratezza della risposta

potrebbe non essere adeguata.

Per il resto, possiamo dire che SPARQL è un ottimo linguaggio, dato che il problema della

safety è comune praticamente a tutti i linguaggi. Infatti, è stato scelto dal W3C proprio per

la sua completezza, espressività e semplicità d’uso, nonché per l’esecuzione di query

remote come Web Service o richieste/risposte HTTP.

Le caratteristiche che più lo contraddistinguono rispetto ad altri linguaggi sono: possibilità

di esprimere pattern opzionali; eseguire query in cui il matching viene effettuato

sull’unione di pattern; trasformazione dei dati da fonti eterogenee, con possibilità di

specificare i grafi e diversi documenti RDF; possibilità di specificare i predicati come

variabili all’interno dei pattern, consentendo operazioni di path searching per grafi RDF ed

ontologie.

30

Bibliografia e Sitografia

[1] http://sicapisce.wordpress.com/2009/06/08/il-web-semantico/,

“Come siamo arrivati al Web Semantico.”

[2] Valeriano Sandrucci, “Introduzione alle Ontologie”, dalle slide per Eventi e

convegni organizzati dall'ITTIG 2007

[3] Armando Stellato, “Linguaggi di Interrogazione per il Web Semantico”, dalle slide

del corso Gestione dei Dati e della conoscenza 2010

[4] Beniamino Di Martino, “Stato dell’arte ed analisi delle metodologie, dei linguaggi

standard e degli engines per il querying semantico”, dal Technical Report: 2.4.6 del

LC3 – Laboratorio pubblico-privato di ricerca sul tema della Comunicazione delle

Conoscenze Culturali

[5] http://it.wikipedia.org/wiki/SPARQL, “SPARQL”

[6] http://it.wikipedia.org/wiki/Web_semantico, “Web semantico”

[7] http://it.wikipedia.org/wiki/Ontologia, “Ontologia”

[8] http://paoloratto.blogspot.it/2010/01/web-semantico-una-facile-introduzione.html,

“Web Semantico: una facile introduzione”

[9] http://www.w3.org/TR/2012/WD-sparql11-query-20120105/,

W3C Working Draft 05 January 2012, “SPARQL 1.1 Query Language”

[10] http://lau.csi.it/realizzare/accessibilita/linguaggi_programmazione/SPARQL/

rdf.shtml#turtle, “Interrogare l'RDF con SPARQL”

[11] Antonio Picariello, “Verso il Web Semantico”, dalle slide del corso di Sistemi

Multimediali 2012