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