Corso di Laurea Specialistica in Ingegneria Informatica
XQuery
Eufemia TINELLI
Corso di Linguaggi e Tecnologie Web
A. A. 2011 - 2012
Contenuti
• XQuery come linguaggio di interrogazione di XML data
• Modello dei dati: Sequenze
• Espressioni
– F (For) L (Let) W (Where) O (Order) R (Return)
– espressioni condizionali (if then-else), confronti, operatori logici e
aritmetici, quantificatori (esiste/per ogni)
• Funzioni
• Esercitazione RecipeML
E. TINELLI – LTW A. A. 20112011-2012
2
XQuery
• XQuery è un linguaggio di interrogazione per dati espressi in XML, e può
essere dunque utilizzato per accedere a documenti strutturati e semistrutturati
• E’ diventato una Recommendation del W3C nel gennaio 2007
• Principali obiettivi di progetto: XQuery deve …
– essere capace di trasformare e creare documenti XML
– essere capace di combinare informazioni provenienti da sorgenti diverse
– essere dichiarativo
– gestire i namespace
– compatibile con XML Schema e supportare simple e complex datatype
– Avere almeno una sintassi XML ed almeno una human-readable
E. TINELLI – LTW A. A. 20112011-2012
3
XQuery, XPath e XSLT
• XQuery è un linguaggio case sensitive (come XML), estende
l’ultima versione di XPath e ha funzionalità analoghe a XSLT
• XQuery e XPath
– XQuery 1.0 è progettato per essere un superinsieme proprio di XPath 2.0
– Potere espressivo: XQuery rispetto a XPath permette la combinazione di informazione
proveniente da sorgenti diverse e la creazione di nuovi frammenti XML
– Uso di funzioni: XQuery supporta user-defined mentre XPath implementation-defined
function
• XQuery e XSLT
– Entrambi sono usati per combinare e trasformare dati XML da sorgenti diverse
• XQuery è progettato da zero a partire da SQL
ricorsione
data-centric
application
• XSLT è progettato per estendere e potenziare CSS
ricorsione ☺
documentcentric application
– Potere espressivo: a livello tecnico equivalente ma XSLT ha implementazioni molto
efficienti
E. TINELLI – LTW A. A. 20112011-2012
4
XML e Database (1)
E. TINELLI – LTW A. A. 20112011-2012
5
XML e Database (2)
•
•
I dati relazionali corrispondo a qualche albero mentre i dati XML a tutti gli alberi
Il supporto dato dal modello relazionale puro ad XML prevede dei meccanismi di mappatura
delle strutture XML sulle relazioni:
–
–
–
•
Document-Centric - il documento XML come tale è il dato da inserire nel DB (ricerche “base”
tramite XPath o espressioni regolari)
Data-Centric - la struttura del documento XML è parte fondamentale dei dati da conservare (XML
recuperato dalle tabelle, query sofisticate, elevato numero di join)
Ibrido - il documento XML viene mappato in modo data-centric, ma alcuni sottoalberi vengono
trattati in maniera document-centric (implementazione complessa)
Strategie di supporto per la memorizzazione (non ci sono standard)
–
–
Database XML nativi - permettono di gestire documenti XML come collezioni di dati indicizzati,
interrogandoli tramite XPath e XQuery (Tamino di SoftwareAG, XIndice di Apache, eXist disponibile su
sourceforge)
Database estesi con supporto ad XML - permettono di gestire documenti XML in maniera
document-centric o data-centric
• intero documento XML memorizzato in un unico attributo, uno per tupla, utilizzando un nuovo tipo di
dato SQL (XMLType) (Oracle, IBM)
• documento XML è suddiviso e memorizzato in più attributi, tabelle e tuple: 1) schema relazionale ad
hoc per il particolare documento o 2) schema generico adatto a tutti i documenti (MS SQL Server)
•
Elenco completo di prodotti che offrono supporto XML
http://www.rpbourret.com/xml/XMLDatabaseProds.html
E. TINELLI – LTW A. A. 20112011-2012
6
XQuery ed SQL
•
•
I dati XML organizzati in tabelle sono più complicati da leggere ma estrarre XML a
partire da tabelle è sempre possibile (qualsiasi dato rappresentabile in una tabella è
anche rappresentabile in XML)
Strategie per estrarre XML da database:
– Tramite viste predefinite (soluzione ad hoc poco flessibile)
– Tramite SQL, con operatori che producono output in XML (non utilizzabile per DBMS
nativi, espressività ridotta)
• SQL/XML è un’estensione di SQL per costruire dati XML come risultato di query SQL
– Tramite mappatura delle tabelle in XML e interrogazione tramite XQuery (poche
implementazioni)
•
Es. SQL/XML
xmlelement(name, "Students", SELECT xmlelement(name,"record",xmlattributes(s.id, s.name,s.age))
FROM Students )
<Students>
<record id="100026" name="Joe Average“ age="21"/>
<record id="100078" name="Jack Doe“ age="18"/>
</Students>
E. TINELLI – LTW A. A. 20112011-2012
7
Sequenze
• XQuery opera su sequenze, che possono contenere:
– Valori atomici
– Nodi
• Un’espressione XQuery riceve in input zero (nel caso di
costruttori) o più sequenze e produce una sequenza
• Qualche proprietà
– Le sequenze sono in generale ordinate, per cui:
• (1, 2) è diversa da (2, 1).
– Le sequenze non sono annidate, per cui:
• (( ), 1, (2, 3)) è uguale a (1, 2, 3).
– Non c’è differenza tra un item e una sequenza con lo stesso
item:
• (1) è uguale a 1.
E. TINELLI – LTW A. A. 20112011-2012
8
Operatori
• Per manipolare le sequenze XQuery mette a disposizione i
seguenti operatori:
– , (virgola) e to
• Es. di sintassi alternative
(1, 2, 3)
(1, (), (2, 3))
(1 to 3)
(1, 2 to 3)
– union (anche nella forma equivalente |), intersect, except
(A) union (A, B) -> (A, B)
(A, B) intersect (B, C) -> (B)
(A, B) except (B) -> (A)
E. TINELLI – LTW A. A. 20112011-2012
9
XQuery: Prologo + query
• Una query può essere preceduta da un prologo, in cui vengono
dichiarate informazioni necessarie per la sua esecuzione
Dichiarazioni di
parametri e setting
per processore
XQuery
Dichiarazioni
implicitamente definite
in qualsiasi
implementazione di
XQuery
E. TINELLI – LTW A. A. 20112011-2012
10
Espressioni racchiuse
• Le espressioni XML possono essere calcolate dinamicamente
mediante l’uso di “espressioni racchiuse”: { expr }
• Le espressioni racchiuse possono essere utilizzate nei
costruttori
E. TINELLI – LTW A. A. 20112011-2012
11
Costruttori …
… espliciti
…di tipo
E. TINELLI – LTW A. A. 20112011-2012
12
FLWOR (pronuncia “flower”)
• Una espressione FLWOR è simile ad uno statement SQL (Select-FromWhere) ed è definita in termini di binding di variabili
• E’ composta da 5 parti, tutte opzionali tranne l’ultima:
– For: lega una variabile ad ogni elemento restituito dall’espressione
XPath; la clausola for è una iterazione; possono esserci più clausole
for in una espressione FLWOR
– Let: associa ad una variabile il risultato di una espressione XPath
• For e Let generano sequenza ossia creano un elenco con tutte le associazioni
possibili, chiamate anche “tuple” nella specifica di XQuery
– Where: filtra l’elenco di associazioni in base ad una condizione
– Order by: ordina l’elenco di associazioni
– Return: costruisce il risultato dell’espressione FLWOR
• Queste espressioni, così come ogni altra espressione XQuery, possono
essere commentate utilizzando i simboli (: e :)
Es. (: Questo è un commento (: con un commento annidato… :) :)
E. TINELLI – LTW A. A. 20112011-2012
13
Clausola FOR: esempio
• Query: Per ogni libro della collezione elenca anno e titolo
for $b in doc("esempio.xml")/bib/libro
return
<libro anno="{ $b/@anno }">
{ $b/titolo }
</libro>
• OSS. 1 - Le parentesi graffe delimitano un’espressione XQuery, che deve
essere valutata per creare il risultato
• OSS. 2 - All’interno della clausola RETURN puo’ essere specificata una
qualsiasi espressione XQuery. In questo caso, stiamo utilizzando
costruttori che generano XML, e che si scrivono direttamente
utilizzando la sintassi XML
E. TINELLI – LTW A. A. 20112011-2012
14
Clausola FOR: Esecuzione
1.
2.
•
•
Si selezionano tutti i libri (doc("esempio.xml")/bib/libro)
Valutazione espressione del for
si ottiene una sequenza di nodi
Ciascun nodo (libro in questo esempio )che viene
associata alla variabile $b
1. Per ogni associazione ($b) è restituita l’espressione in
return
E. TINELLI – LTW A. A. 20112011-2012
15
Clausola FOR: Esempio di più variabili utilizzate in un'unica espressione
for $i in (10, 20), $j in (1, 2)
return ($i + $j)
• Ci sono due sequenze in input
– (10, 20) associata alla variabile $i
– (1, 2) associata alla variabile $j
• Per ogni coppia <$i,$j> viene valutato il risultato ($i + $j)
• L’elenco di associazioni è dato dal prodotto cartesiano dei possibili
valori delle variabili
• Il risultato è la sequenza (11, 12, 21, 22)
E. TINELLI – LTW A. A. 20112011-2012
16
XQuery: Esempio
FOR vs LET: esempi
N.B. Ogni clausola for e let può
far riferimento a variabili legate
in clausole precedenti: in questo
modo si può effettuare il
join tra documenti XML
E. TINELLI – LTW A. A. 20112011-2012
18
Query annidate: esempio
E. TINELLI – LTW A. A. 20112011-2012
19
Ordinamento: esempio
Funzioni (1)
•
•
E’ possibile importare librerie di funzioni: built-in o definite dall’utente
XQuery include più di 100 funzioni built-in. Vi sono funzioni per le stringhe, i
valori numerici, manipolazione di sequenze, ecc. --> L’URI del namespace per le
funzioni XQuery è http://www.w3.org/2005/02/xpath-functions mentre il
prefisso di default del namespace delle funzioni è fn
•
Es.
import module namespace
math = "http://sisinflab.poliba.it/funzMath"
<risultato>
{ for $cerchio in doc(“figure.xml”)//cerchio
return
<area>
{math:area($cerchio/raggio)}
</area>
}
</risultato>
E. TINELLI – LTW A. A. 20112011-2012
21
Funzioni (2)
•
Nel prologo è possibile definire funzioni proprie (quando non abbiamo a
disposizione le librerie che ci occorrerebbero oppure per rendere il codice più
leggibile)
•
Definizione delle funzioni
•
Le variabili $x1, $x2, …, $xk sono visibili all’interno dell’espressione espr
•
Chiamata
•
Es.
declare function nomeFunz ($x1, $x2, …, $xk) { espr }
nomeFunz (espr1, espr2, …, esprk)
declare function area($base, $altezza) {
$base * $altezza / 2
}
<risultato>
{ for $tr in doc(“figure.xml”)//triangolo
return
<area>{area($tr/base, $tr/altezza)}</area>
}
</risultato>
E. TINELLI – LTW A. A. 20112011-2012
22
Espressioni Condizionali: Esempi
if ($prodotto1/prezzo < $prodotto2/prezzo)
then $prodotto2
else $prodotto1
if ($prodotto/@scontato)
then $prodotto/ingrosso
else $prodotto/dettaglio
L’espressione ritorna il valore della variabile
$prodottox che contiene il prezzo più alto
L’espressione valuta l’esistenza di un attributo e di
conseguenza sceglie gli elementi da selezionare
L’espressione ritorna il valore
numerico associato ad ogni
voto (A, A+, A-, ecc.) in modo
da poter calcolare la media
dei voti di ogni studente
E. TINELLI – LTW A. A. 20112011-2012
23
Espressioni con quantificatori: some & every
•
•
Quando le variabili sono associate a insiemi di oggetti è utile disporre di
operatori che verifichino le proprietà di insiemi di oggetti
Logica: (1) some ed every come for associano una sequenza di oggetti a
ciascuna variabile; (2) Per ogni oggetto viene verificata la condizione
Booleana di satisfies
some $x in (1, 2, 3), $y in (2, 3, 4)
satisfies $x + $y = 4
Se almeno una volta la condizione
risulta vera, l’intera espressione e’ vera
True
every $x in (1, 2, 3), $y in (2, 3, 4)
satisfies $x + $y = 4
Se la condizione risulta sempre
vera,l’intera espressione e’ vera
False
E. TINELLI – LTW A. A. 20112011-2012
24
Esercitazione RecipeML
E. TINELLI – LTW A. A. 20112011-2012
25
RecipeML DTD
E. TINELLI – LTW A. A. 20112011-2012
26
RecipeML Example
<collection>
<recipe>
<title>Beef Parmesan with Garlic Angel Hair Pasta</title>
<ingredient name="beef cube steak" amount="1.5" unit="pound" />
<ingredient name="onion, sliced into thin rings" amount="1" />
<ingredient name="green bell pepper, sliced in rings" amount="1" />
<ingredient name="Italian seasoned bread crumbs" amount="1" unit="cup" />
<ingredient name="grated Parmesan cheese" amount="0.5" unit="cup" />
<ingredient name="olive oil" amount="2" unit="tablespoon" />
<ingredient name="spaghetti sauce" amount="1" unit="jar" />
<ingredient name="shredded mozzarella cheese" amount="0.5" unit="cup" />
<ingredient name="angel hair pasta" amount="12" unit="ounce" />
<ingredient name="minced garlic" amount="2" unit="teaspoon" />
<ingredient name="butter" amount="0.25" unit="cup" />
<preparation>
<step>Preheat oven to 350 degrees F (175 degrees C).</step>
<step>Cut cube steak into serving size pieces. Coat meat with the bread crumbs and parmesan cheese. Heat
olive oil in a large frying pan, and saute 1 teaspoon of the garlic for 3 minutes. Quick fry (brown quickly on
both sides) meat. Place meat in a casserole baking dish, slightly overlapping edges. Place onion rings and
peppers on top of meat, and pour marinara sauce over all.</step>
<step>Bake at 350 degrees F (175 degrees C) for 30 to 45 minutes, depending on the thickness of the meat.
Sprinkle mozzarella over meat and leave in the oven till bubbly.</step>
<step>Boil pasta al dente. Drain, and toss in butter and 1 teaspoon garlic. For a stronger garlic taste, season
with garlic powder. Top with grated parmesan and parsley for color. Serve meat and sauce atop a mound
of pasta!</step>
</preparation>
<comment>Make the meat ahead of time, and refrigerate over night, the acid in the tomato sauce will
tenderize the meat even more. If you do this, save the mozzarella till the last minute.</comment>
<nutrition calories="1167" fat="23%" carbohydrates="45%" protein="32%" />
</recipe>
E. TINELLI – LTW A. A. 20112011-2012
27
Query – cap. 6 Testo consigliato
1.
2.
3.
4.
I titoli delle ricette che usano l’olio di oliva
I titoli delle ricette restituite come stringhe
I titoli delle ricette che hanno meno di 500 calorie
Le ricette ordinate per numero di ingredienti “semplici”
ascendente e a parità di ingredienti per il minor numero di
calorie
5. Le ricette che usano più burro che olio di oliva
6. Genera le ricette (<ricetta>) aventi il titolo come attributo
e gli ingredienti come elemento di testo (<ingrediente>)
E. TINELLI – LTW A. A. 20112011-2012
28
Riferimenti
• Specifiche
– http://www.w3.org/XML/Query/
– http://www.w3.org/TR/xquery/
– http://www.w3.org/TR/xquery-operators/
• Testo consigliato e Materiale esercitazioni
– A. Moller and M. Schwartzbach, An Introduction to XML and Web
Technologies, Addison Wesley, 2006 [cap. 6]
– http://www.w3schools.com/xquery/default.asp
E. TINELLI – LTW A. A. 20112011-2012
29