• Non ci sono risultati.

Graph Pattern

Nel documento Un sistema di tipi per SPARQL (pagine 33-38)

1.3 SPARQL Protocol and RDF Query Language

1.3.3 Graph Pattern

Il graph pattern è la componente della query con la quale viene selezionato il sottografo RDF del risultato. È una componente base di una query SPARQL ed è ottenuta dalla composizione di strumenti diversi. Il graph pattern è delimitato dalle parentesi grae.

Basic Graph Pattern

Il BGP, già introdotto precedentemente, è il componente elementare di un Graph Pattern. Nell'esempio seguente viene mostrato un unico basic graph pattern costituito da due triple pattern. Il risultato della query è il prodotto relazionale tra le due tabelle di binding ottenute dai matching tra i singoli triple pattern e l'active graph.

PREFIX foaf : <http : / / xmlns . com / foaf /0.1/ >

SELECT ? name ? mbox

WHERE { ?x foaf : name ? name .

?x foaf : mbox ? mbox }

La stessa soluzione può essere ottenuta dalla seguente query, che raggrup- pa due basic graph pattern, uno per ogni triple pattern.

PREFIX foaf : <http : / / xmlns . com / foaf /0.1/ >

SELECT ? name ? mbox

WHERE { { ?x foaf : name ? name } { ?x foaf : mbox ? mbox } }

Graph Pattern vuoto

E' possibile specicare un basic graph pattern vuoto che confrontato con qualsiasi grafo ritorna la soluzione in cui le variabili sono unbound.

CAPITOLO 1. RDF, SPARQL E OWL 25

Graph Pattern con restrizione

La parola chiave filter restringe il risultato prodotto da un graph pat- tern matching alle soluzioni che soddisfano l'espressione ltrante.

Dataset

@prefix dc : <http : / / purl . org /dc/ elements /1.1/ > . @prefix : <http : / / example . org / book/> .

@prefix ns : <http : / / example . org /ns#> . : book1 dc : title " SPARQL Tutorial " .

: book1 ns : price 42 .

: book2 dc : title " The Semantic Web " .

: book2 ns : price 23 .

Query

PREFIX dc : <http : / / purl . org /dc/ elements /1.1/ > PREFIX ns : <http : / / example . org /ns#>

SELECT ? title ? price

WHERE { ?x ns : price ? price . FILTER (? price < 3 0 . 5 )

?x dc : title ? title . }

Risultato

title price The Semantic Web 23

Se non ci fosse stata la restrizione sul prezzo del libro anche la tupla (SPARQL TUTORIAL,42) sarebbe apparsa nel risultato. E' possibile avere più restrizioni all'interno della clausola where.

. . .

WHERE { ?x ns : price ? price . FILTER (? price < 3 0 . 5 ) FILTER (? price > 20) FILTER ( bound (? price ) )

SPARQL permette di applicare ai termini di un grafo RDF e alle variabili una serie di funzioni e operatori per ltrare il risultato. Alcuni sono propri del linguaggio, altri invece vegnono implementati invocando delle funzioni o usando operatori XPath e XQuery. Nella sezione 11.3 di [6] vi è una tabella in cui ogni riga è composta da un operatore, i tipi degli argomenti attesi, la funzione invocata e il tipo del risultato. In tabella 1.2 sono riportate alcune righe della tabella citata in [6].

Operatore Tipo (A/B) Funzione Risultato BOUND(A) variabile bound(A) xsd:boolean isIRI(A) isURI(A) termine RDF isIRI(A) xsd:boolean isBLANK(A) termine RDF isBlank(A) xsd:boolean isLITERAL(A) termine RDF isLiteral(A) xsd:boolean sameTERM(A,B) termine RDF sameTerm(A,B) xsd:boolean langMATCHES(A,B) simple literal langMatches(A,B) xsd:boolean REGEX(S,P) simple literal fn:matches(S,P) xsd:boolean

Tabella 1.2: Operatori SPARQL

La funzione bound restituisce true se la variabile passata come argo- mento ha un valore non vuoto, isIri2 se il termine è un IRI, isLiteral se

è un literal e isBlank se è un blank node. sameTerm restituisce true se i parametri sono lo stesso termine, langMatches se il tag di linguaggio A è presente nell'insieme dei tag di linguaggi B.

Operatore Tipo (A) Funzione Risultato STR(A) literal str(A) simple literal STR(A) IRI str(A) simple literal LANG(A) literal lang(A) simple literal DATATYPE(A) typed literal datatype(A) IRI

DATATYPE(A) simple literal datatype(A) IRI Tabella 1.3: Funzioni accessorie SPARQL

La Tabella 1.3 elenca alcune funzioni usate da SPARQL. str restituisce la stringa corrispondente al valore del literal o dell'IRI passato come parametro,

2isURI invoca questa funzione in quanto SPARQL usa gli IRI (una sequenza di caratteri

CAPITOLO 1. RDF, SPARQL E OWL 27

lang restituisce il solo tag di linguaggio di un literal (se non è denito rende una stringa vuota), datatype rende la IRI relativa al tipo del literal se questo è un typed literal, altrimenti rende xsd:string se è plain literal.

Optional Graph Pattern

Le parti opzionali di un graph pattern possono essere specicate sintat- ticamente con la parola chiave optional applicata ad un graph pattern. La parola chiave OPTIONAL è associativa da sinistra, quindi i seguenti pattern sono equivalenti

pattern OPTIONAL { pattern } OPTIoNAL { pattern }

{ pattern OPTIONAL { pattern } } OPTIONAL { pattenr }

Consideriamo il seguente esempio: Dataset:

@prefix foaf : <http : / / xmlns . com / foaf /0.1/ > . _ : a foaf : name " Alice " .

_ : a foaf : homepage <http : / / work . example . com / alice/> . _ : b foaf : name " Bob " .

_ : b foaf : mbox <mailto : bob@work . example> .

Query:

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 } }

Risultato:

name mbox hpage

Alice <http://work.example.org/alice/>

Alternative Graph Pattern

SPARQL fornisce la possibilità di unire i diversi risultati ottenuti da più graph pattern specicati prima e dopo la parola chiave union. Di seguito è mostrato un esempio. I pressi dc10 e dc11 stanno rispettivamente per versione 1.0 e 1.1 dello schema Dublin Core. Questa query vuole selezionare i titoli dei libri memorizzati, indipendentemente dalla versione del Dublin Core usata.

Dataset:

@prefix dc10 : <http : / / purl . org /dc/ elements /1.0/ > @prefix dc11 : <http : / / purl . org /dc/ elements /1.1/ > _ : a dc10 : title " SPARQL Query Language Tutorial " . _ : a dc10 : creator " Alice " .

_ : b dc11 : title " SPARQL Protocol Tutorial " . _ : b dc11 : creator " Bob " .

_ : c dc10 : title " SPARQL " .

_ : d dc11 : title " SPARQL ( updated ) " .

Query:

PREFIX dc10 : <http : / / purl . org /dc/ elements /1.0/ > PREFIX dc11 : <http : / / purl . org /dc/ elements /1.1/ >

SELECT ? title

WHERE { { ? book dc10 : title ? title } UNION { ? book dc11 : title ? title } }

Risultato:

title

SPARQL Protocol Tutorial SPARQL

SPARQL (updated)

SPARQL Query Language Tutorial

Se invece si volesse tener traccia della versione, si potrebbero utilizzare due variabili diverse al posto della sola ?title come mostrato di seguito

CAPITOLO 1. RDF, SPARQL E OWL 29

Query:

PREFIX dc10 : <http : / / purl . org /dc/ elements /1.0/ > PREFIX dc11 : <http : / / purl . org /dc/ elements /1.1/ >

SELECT ?x ?y

WHERE { { ? book dc10 : title ?x} UNION { ? book dc11 : title ?y} }

Risultato:

?x ?y

SPARQL Protocol Tutorial SPARQL

SPARQL (updated) SPARQL Query Language Tutorial

Nel documento Un sistema di tipi per SPARQL (pagine 33-38)

Documenti correlati