XQuery Dotazovací jazyk XML Daniel Privalenkov
O čem bude prezentace Nutnost dotazovacího jazyku v XML Rychlý přehled XQuery Několik příkladů
K čemu je dobrý XML Umožňuje výměnu informací mezi internet-aplikacemi nezávisle na způsobu ukládání dat Flexibilita v reprezentaci různých informací Data jsou „samovysvětlující“
Proč potřebujeme speciální dotazovací jazyk pro XML Relační data: pravidelná struktura jednorozměrné většinou „hustá“ … XML data nepravidelná struktura velmi často vnořené elementy často řídká …
Syntaxe XQuery Vyjádření pomocí XML Optimalizovaná pro lidí
Datový model Posloupnost – uspořádaná množina prvků (může být i prázdná) Prvek – uzel nebo atomická hodnota Atomická hodnota – hodnota nějakého základního typu definovaného v XML Existuje 7 druhů uzlů: element, atribut, text, dokument, komentář, instrukce, namespace
Uzly mohou mít další uzly jako své potomky Některé uzly mají jména nebo typovou hodnotu Typová hodnota – posloupnost (i prázdná) atomických hodnot uzly mají přiřazeny identitu Mezi všemi uzly existuje celková hierarchie – tzv. uspořádání dokumentu (document order) Posloupnosti mohou být heterogenní Posloupnost nemůže být prvkem jiné posloupnosti
Error hodnota – vzniká jako výsledek vyhodnocení výrazu, který obsahuje chybu
Převod XML na datový model Validace schématu (Schema validation) – XML -> DM Serializace – DM -> XML
Výrazy XQuery je CASE sensitive Komentáře: {-- ………. --} Literály – např. 47, 4.7, 4.7E3 atd. Konstruktor – vytvoření atomických hodnot konkrétního typu např. date(“ ”) Závorky, - konkatenace dvou posloupností, Např. 1,2,3 = (1,2,3) = 1 to 3 = ((1,2),(), 3)
Proměnné - $jmeno_promenne Let – spojuje proměnné a pak vyhodnocuje vnitřní výraz let $start := 1, $stop := 3 return $start to $stop Volání funkcí substring(“Martha Washington”, 1, 6)
Výrazy cesty (path expressions) Posloupnost výrazů oddělených lomítkem Krok = výraz mezi lomítky Výsledkem kroku je posloupnost uzlů Celkovým výsledkem je výsledek posledního kroku Každý krok je vyhodnocen v kontextu konkrétního uzlu – kontextový uzel Osový krok
Osy: child, descendant, parent, attribute, self, descendant-or-self 2 syntaxe path výrazů: abbreviated unabbreviated
Příklady P1 Napište seznam všech položek nabízených na prodej Smithem document(“items.xml”)/child::* /child::item[child::seller = “Smith”] /child::description document(“items.xml”)/*/item[seller = “Smith”] / description
P2 Napište seznam všech elementů typu description, které se nacházejí v dokumentu items.xml document(“items.xml”)//description
P3 Najděte atribut statusu položky, která je rodičem zadané proměnné $description
Predikáty Výraz v hranatých závorkách např. item[seller = “Smith”] Operátory porovnání hodnot: eq, ne, lt, le, gt, ge Obecné porovnávací operátory: =, !=, >, >=, <, <= Operátory porovnání uzlů: is, isnot
Operátory porovnání pořadí uzlů > Logické operátory and, or negace: not
Konstruktory elementů
{$i} {max($bids[itemno=$i]/[bidamount)}
{ $b/itemno, $b/bid-amount }
Computed element constructor element {name($e)} data($e)*2}
Computed attribute constructor Attribute {if $p/sex =“M” then “father” else “mother} {$p/name}
Iterace a třídění for $n in (2,3) return $n + 1 for $m in (2,3), $n in (5,10) return {$m} times {$n} is {$m * $n}
Př. Pro každou položku, která má více než 10 nabídek vygenerujte element „populární nabídka“, který bude obsahovat číslo položky, 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 { $i/itemno, $i/description, {count($b)} } sortby bid-count descending
Aritmetika Základní operace: +,-,*, div, mod Agregační funkce: sum, avg, count, max, min Aplikace těchto operací na prázdnou posloupnost vrací prázdnou posloupnost
Operace nad posloupnostmi union - sjednocení intersect - průnik except – rozdíl
Př. Sestrojte nový element nedávné velké nabídky, který bude obsahovat kopie všech nabízených elementů z bids.xml takové, že mají bid-amount větší než 1000 a datum po 1. lednu 2002 document(“bids.xml”)/*/bid[bid-amount > ] interesects document(“bids.xml”)/*/bid[bid-date > date(“ ”)]
Podmínky if then else if then $part/wholesale else $part/retail
Kvantifikace every satisfies some satisfies Př. Najděte položky v items.xml, pro které všechny nabídky byly dvakrát větší než rezervovaná cena. Vraťte kopie všech těchto elementů „zabalené“ do nového elementu, který se bude jmenovat podhodnocená cena. for $i in document(“items.xml”) where every $b in document(“bids.xml”)/*/bid[itemno = $i/itemno] satisfies $b/bid-amount > 2 * $i/reserve-price return $i
Funkce define function highbid(element $item) returns decimal { max(document(“bids.xml”) //bid [itemno = $item/itemno]/bidamount) } highbid(document(“items.xml”)//item[itemno = “12”)