XML vs. relační model dat
XQuery:
dotazovací jazyk nad XML Jakub Lysák Tomáš Hradecký
XML
Relační model
• „nepravidelná“ struktura • metadata jsou uložena společně s vlastními daty • stromová struktura • data mají určené pořadí v dokumentu
• „pravidelná“ struktura • metadata uložena zvlášť
– které může nést informaci
• data jsou často „řídká“ – chybějící informace se řeší vypuštěním elementu
• data jsou „plochá“ • data jsou nesetříděná – lze je třídit až podle hodnot
• data jsou obvykle „hustá“ – většina sloupců má hodnotu 2
XQuery: úvod
XQuery: úvod (2)
• se vzrůstajícím používáním XML dokumentů vznikla potřeba vytvořit nový dotazovací jazyk • hlavní požadavky:
• dvě syntaxe: – zapisovaná v XML – optimalizovaná „pro lidi“
– výběr částí dokumentu podle podmínek – kombinace dat z různých dokumentů
• zatím je jazyk navržen pro získávání informací z dokumentů
• 10/1999 začátek návrhu jazyka – konsorcium W3C • zatím (6/2002) není dokončen • vychází ze stávajících jazyků na dotazování nad XML daty
– neposkytuje možnosti pro změnu XML dokumentů – s tím se počítá až po dokončení první verze
• funkcionální jazyk – říká, co se má udělat, ne jak se to má udělat – možnost optimalizací
– hlavně XPath a Quilt – ten je zase ovlivněn XML-QL, ale i SQL
• XML dokument se chápe jako uspořádaný les stromů 3
Příklad (1)
4
Příklad (2)
items.xml
bids.xml
- 1234 <seller> Jakoubek ze Stříbra <description> Středověké záchodové prkýnko 12 345.60 <end-date> 1. 1. 2003
1234 John Smith 9876.50 3. 1. 2003
- …
… 5
6
1
XQuery: syntaxe
XQuery: Path Expressions • • • •
• jazyk je case-sensitive • klíčová slova se ale mohou psát velkými i malými písmeny • znaky mezi {-- a --} jsou komentáře
výrazy určující „cestu“ slouží k navigaci v dokumentu postaveny na syntaxi XPath výraz začíná určením uzlu nebo skupiny uzlů – funkce document("bids.xml") vrací kořen daného dokumentu – pokud výraz začíná /, znamená to implicitní kořen v daném kontextu
• proměnné – začínají znakem $ – přiřazení hodnoty: let $p1 := 1, $p2 := 3
• výraz se skládá z jednotlivých kroků, oddělených lomítkem (/) – každý krok znamená přesun ve směru jisté „osy“
• posloupnosti: 1 to 3, 1, 2, 3
• např. child, parent, self, … • XQuery jich podporuje celkem 6 7
XQuery: Path Expressions (2)
8
XQuery: Path Expressions (3)
– výsledkem každého kroku je posloupnost navzájem různých uzlů – ale výsledek může obsahovat stejné hodnoty
• výsledkem výrazu je posloupnost uzlů z posledního kroku nebo (primitivních) hodnot • výsledky jsou vráceny podle pořadí v dokumentu • stručná vs. rozšířená syntaxe • prezentace výsledků uživateli závisí na implementaci
• Najdi popis všech položek, které nabízí k prodeji pan Smith – rozšířená verze document("items.xml")/child::* /child::item[child::seller = "Smith"] /child::decription
– stručná document("items.xml") /*/item[seller = "Smith"]/description
• dále budeme používat jen stručnou verzi 9
10
XQuery: výběr uzlů
XQuery: Path Expressions (4) • Seznam všech elementů descriptions, které se nacházejí v dokumentu items.xml
• predikáty pro výběr píšeme do hranatých závorek • závorka může obsahovat – podmínku
document("items.xml")//description
• uzel je vybrán, pokud splňuje podmínku • item[seller = "Smith"]
– výsledkem je posloupnost uzlů, které se obecně mohou nacházet na různých hladinách
– číslo nebo interval
• Najdi atribut status k položce jejíž popis je zadán proměnnou
• je vybrán uzel, jehož pořadí v dokumentu na dané úrovni odpovídá číslu • item[5]
$description/../@status
– jméno uzlu
– .. odkazuje na rodiče daného uzlu, . na daný uzel – @ znamená jméno atributu
• uzel je vybrán, pokud má potomka s daným jménem (nezávisle na hodnotě tohoto potomka) • item[reserve-price] 11
12
2
Operátory v predikátech (1)
Operátory v predikátech (2) • porovnání uzlů
• porovnání hodnot – eq, ne, lt, le, gt, ge – porovnávají pouze skalární hodnoty – pro posloupnost způsobí chybu – item[reserve-price gt 1000] vybere uzel item, pokud má právě jednoho potomka reserve-price s hodnotou >1000
• obecné porovnání
– is a isnot – $node1 is $node2 je true, pokud obě proměnné odkazují na tentýž uzel
• porovnání pořadí uzlů v dokumentu – $node1 << $node2 je true, pokud se uzel, na nějž ukazuje první proměnná vyskytuje v dokumentu před uzlem, na nějž ukazuje druhá proměnná
• logické operátory
– =, !=, >, >=, <, <= – item[reserve-price > 1000] vybere uzel item, pokud má aspoň jednoho potomka reserve-price s hodnotou >1000
– pro kombinaci jednotlivých podmínek lze použít and, or a not – item[not(reserve-price)] vybere uzel item, pokud nemá žádného potomka reserve-price 13
Vytváření elementů (1)
Vytváření elementů (2)
• pokud jsou všechny hodnoty elementu konstantní, vytváří se element zápisem stejným jako v XML:
• uvnitř vytvářeného elementu můžeme vyrobit posloupnost uzlů následujícím způsobem:
{ $b/@status $b/itemno $b/bid-amount }
4871 250.00
• pokud jsou hodnoty elementu počítané, použijeme následující zápis:
– nově vytvořené hodnoty a atributy jsou kopie hodnot uzlů, z nichž byly odvozeny – elementy a atributy vytvářené uvnitř elementu se stávají jeho součástí
{$i} { max($bids[itemno=$i]/bid-amount) }
15
16
Iterace a třídění
Vytváření elementů (3) • pokud potřebujeme vytvořit element, jehož jméno i obsah se počítají, použijeme následující zápis:
• nejjednodušší podoba:
element {name($e)} {$e/@*, data($e)*2} – výraz v první závorce udává jméno elementu – výraz ve druhé závorce specifikuje obsah elementu – $e ukazuje na element X obsahující číselnou hodnotu, v příkladu se tedy vytvoří element téhož jména jako X, bude mít tytéž atributy, a obsah vytvořeného elementu bude dvojnásobek hodnoty obsahu X
• potřebujeme-li vytvořit atribut, jehož jméno i obsah se počítají, použijeme následující zápis: attribute {if $p/sex="M" then "otec" else "matka"} {$p/name}
– výraz v první závorce udává jméno atributu – výraz ve druhé závorce specifikuje obsah atributu
14
17
for $n in (2, 3) return $n + 1 – výsledkem je (3, 4)
• lze iterovat i přes více proměnných for $m in (2, 3), $n in (5, 10) return
{$m} krát {$n} je {$m*$n} – výsledkem je:
2 krát 2 krát 3 krát 3 krát
5 je 10 10 je 20 5 je 15 10 je 30 18
3
FLWR výrazy (1)
FLWR výrazy (2)
• Pro každý předmět dražby, který má více než 10 nabídek, vytvořte element popular-item obsahující číslo draženého předmětu, jeho popis a počet nabídek: for $i in document("items.xml")/*/item let $b := document("bids.xml") /*/bid[itemno = $i/itemno] where count ($b) > 10 return <popular-item> { $i/itemno $i/description
{count ($b)} } 19
FLWR výrazy (3)
• FLWR výraz se skládá z jedné více FOR a/nebo LET složek • FOR váže proměnnou s posloupností hodnot (která je obvykle určená pomocí path expression) a iteruje přes všechny hodnoty této posloupnosti • LET také váže proměnné, ale bez iterace • následuje nepovinná složka WHERE • za WHERE následuje libovolný výraz • RETURN obvykle obsahuje konstrukce nových elementů a proměnné • RETURN se volá pro každou sadu uzlů daných FOR/LET/WHERE složkami • FLWR výrazy lze řetězit 20
Příklad dotazu v XQuery
• ve výrazech lze použít funkce distinct(), avg(), sum(), count() • pokud nám na pořadí výstupu nezáleží, můžeme dát před výraz operátor unordered • pro třídění výsledků výrazů použijeme sortby • pokud bychom chtěli výsledky předchozího dotazu setříděné, stačilo by za něj dopsat sortby bid-count descending • Poznámka: sortby lze použít pro setřídění libovolné posloupnosti, nejen u FLWR výrazů
{ for $b in document("http://www.bn.com/bib.xml")/bib/book where $b/publisher = "Addison-Wesley" and $b/@year > 1991 return { $b/title } }
21
Výsledek tohoto dotazu
22
XML -> HTML příklad
TCP/IP Illustrated Advanced Programming in the Unix environment
Knihy a autoři Název | Autoři |
{ for $b in document("bib.xml")/bib/book return { $b/title/text() } | { $b/author/last/text()} |
}
23
24
4
Aritmetika v XML
Aritmetika - příklad for $e in $emps return <emp> {$e/name <pay> { $e/salary + $e/commission + $e/bonus} } SORTBY(pay)
• Aritmetické operace +, -, *, div, mod unární +, -
• Logické operace or, and, not
• Agregační funkce sum, avg, count, max, min
25
Typy v XQuery
26
Typeswitch TYPESWITCH($animal)
• Xquery je typovaný jazyk • Základní typy (integer, decimal, float,double,string,…)
CASE element pes RETURN haf($animal) CASE element kocka RETURN mnau($animal) DEFAULT RETURN “no sound”
• Uživatelské typy (např. ze schémat) (např. typ address) • Elementy a jejich názvy – jako typy (např. element book)
27
Další operace s typy
28
Seznamy • (výraz, výraz, …)
Instance of 57 INSTANCE OF integer $z INSTANCE OF element pes
• Pro čísla možnost použití mezí: (10, 1 to 4) == (10, 1, 2, 3, 4)
• Seznamy mohou obsahovat duplikace • Prvkem nemůže být jiný seznam
Přetypování CAST AS y:double ($x div 5)
(10, (1, 2), (), (3, 4)) == (10, 1, 2, 3, 4)
29
30
5
Operace se seznamy
Podmínkové výrazy
• Sjednocení - union • Průnik - intersect • Rozdíl - except
• if, then, else • Příklad – test na existenci atributu if ($img/@alt) then $img/@alt else “alternativni text chybi”
• Tyto operátory ve výsledku také odstraní duplikace
31
Kvantifikace
32
Kvantifikace – příklad
• SOME a EVERY • Test na splnění podmínky: SATISFIES
• Kino s nejvyšším počtem míst
for $k in document(“kina.xml”) where every $k2 in document(“kina.xml”) satisfies $k/mista >= $k2/mista return $k
• Příklad: SOME $n IN (5, 7, 9, 11) SATISFIES $n > 10
33
Definování vlastních funkcí
34
Definování funkcí – příklad define function hloubka(element $e) returns xs:integer { if (empty($e/*)) then 1 else max(for $c in $e/* return hloubka($c)) + 1 } hloubka(document("partlist.xml"))
• define function jméno (typ param, typ param, …) returns typ • návratový typ i typy parametrů mohou být vynechány
35
36
6
Struktura dotazu
Query Prolog
Dvě základní části:
• Přiřazování prostoru jmen do proměnné: NAMESPACE x=„http://www.foo.com”
• Přiřazování defaultních prostorů jmen
• Query Prolog (úvodní deklarace) • Query Body (vlastní dotaz)
DEFAULT ELEMENT NAMESPACE=„http://www.foo.com“ DEFAULT FUNCTION NAMESPACE=„http://www.lib.com“
• Schema – importuje XML schéma SCHEMA „http://www.w3.org/1999/xhtml“ AT „http://www.w3org./1999/xhtml/xhtml.xsd“
37
Budoucí vývoj XQuery
38
Odkazy na implementace
• XQuery je ve fázi Working Draft • Ještě to není přijatý standard • Je perspektivním jazykem pro dotazování nad XML
• Microsoft http://xqueryservices.com • X-Hive • http://x-hive.com/xquery • XML Global http://www.xmlglobal.com
39
40
Odkazy na informace Xquery 1.0: An XML Query Language http://www.w3.org/TR/xquery Perfect XML: An introduction to Xquery http://www.perfectxml.com/articles/xml/xquery.as p XML Query Use Cases http://www.w3.org/TR/xmlquery-use-cases XML Query Language Demo http://xmlqueryservices.com 41
Fin
42
7