XQuery tietokannan kyselykielenä Miro Lehtonen 31.10.2007 OUGF-syysseminaari Tietojenkäsittelytieteen laitos
Sisältö Johdanto XQueryn perusteet + esimerkkejä Oracle ja XQuery Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 2
Johdanto XQuery 1.0: An XML Query Language W3C Recommendation 23 January 2007 Yleisesti tuettu suurimmissa tietokannoissa: - Oracle, IBM, Microsoft Yhdistää dokumentit, tietokannat, web-resurssit Korvaa perinteiset Java-, C++ ohjelmat Vähemmän koodia, helpompi ylläpito Monipuolisempi kuin SQL XML-rakenteisiin kohdistuvat kyselyt Hierarkian luominen kyselyn tulokseen Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 3
Esimerkki <empset> <emp empno= 21 ename= Scott salary= 50000 /> <emp empno= 22 ename= Jones salary= 100000 /> </empset> Työntekijät, joiden palkka > 80000: Jones for $i in doc( emp.xml )/empset/emp let $j = 80000 where $i/@salary > $j return $i/@ename Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 4
XQueryn runko: FLWOR-rakenne for, let, where, order by, return Melkein kuin SQL:n SELECT, FROM, WHERE, ORDER BY Kiinteä järjestys - 1) (for let)+, 2) where?, 3) order by?, 4) return Iterointi ja muuttujien sitominen välituloksiin for ja let luovat järjestetyn joukon muuttujiin sidottuja arvoja where suodattaa arvojoukkoa Valinnainen order by järjestää joukon uudelleen return antaa tulosjoukolle rakenteen Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 5
FLWOR-esimerkki Iteroiden sidotaan muuttuja $d joka osaston numeroon Jokaista $d:n sidontaa kohden sidotaan $e osaston työntekijöihin Suodatetaan pois osastot, joissa alle 10 työntekijää Jäljellejääville määritellään tulosmuoto for $d in fn:doc("depts.xml")/depts/deptno let $e := fn:doc("emps.xml")/emps/emp[deptno = $d] where fn:count($e) >= 10 order by fn:avg($e/salary) descending return <big-dept> {$d, <headcount>{fn:count($e)}</headcount>, <avgsal>{fn:avg($e/salary)}</avgsal>} </big-dept> Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 6
for-lauseke Tuottaa joukon muuttujiin sidottuja arvoja Iterointi useamman arvon sopiessa muuttujan määrittelyyn Muuttuja sidotaan vuorollaan kuhunkin arvoon for $s in (<one/>, <two/>, <three/>) return <out>{$s}</out> Kolme arvoa kolme sidontaa <out><one/></out> <out><two/></out> <out><three/></out> Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 7
Useampi muuttuja Järjestysmoodi ordered for $i in (<one/>, <two/>), $j in (<three/>,<four/>) return <out><i>{$i}</i><j>{$j}</j></out> <out><i><one/></i><j><three/></j></out> <out><i><one/></i><j><four/></j></out> <out><i><two/></i><j><three/></j></out> <out><i><two/></i><j><four/></j></out> Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 8
let-lauseke Tuottaa joukon muuttujiin sidottuja arvoja Muuttuja sidotaan sopiviin arvoihin ilman iterointia Uudet sidonnat lisätään for-lausekkeen tuottamiin let $s := (<one/>, <two/>, <three/>) return <out>{$s}</out> Ilman for-lausekette vain yksi sidonta kaikkiin arvoihin <out><one/><two/><three/></out> Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 9
where-lauseke Suodatin for- ja let-lausekkeiden tuottamille muuttujasidonnoille Arvotetaan kerran jokaiselle sidonnalle Useita predikaatteja, loogisia operaattoreita, viittauksia sidottuihin muuttujiin Jos boolean-arvo on tosi, sidonta säilytetään Esimerkki: where-lausekkeesta viittaus positio-muuttujaan Positio-muuttujaa edeltää at fn:avg(for $x at $i in $inputvalues where $i mod 100 = 0 return $x) Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 10
order by -lauseke Järjestää muuttujiin sidotut arvot Lausekkeen puuttuessa järjestyksen määrää for- ja letlausekkeet ja järjestämismoodi Arvoihin perustuva järjestys ascending tai descending stable säilyttää syötteen järjestyksen Tyhjät arvot greatest tai least collation: merkkijonojen vertailun määritys for $b in $books/book stable order by $b/title collation "http://www.example.org/collations/fr-ca", $b/price descending empty least return $b Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 11
return-lauseke Luo FLWOR-rakenteen tulosteen Sovelletaan jokaiseen muuttujaan sidottuun arvoon Sisältönä: Elementtien ja attribuuttien konstruktoreita Viittauksia sidottuihin muuttujiin Sisäkkäisiä rakenteita Esimerkki: Listaa myydyt tuotteet postinumeron mukaan ryhmiteltynä Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 12
declare namespace rpt="http://www.example.com/report"; let $orders := doc('ipo.xml')/schema-element(ipo:purchaseorder) [@orderdate ge xs:date("1999-09-01") and @orderdate le xs:date("1999-12-31")] let $items := $orders/items/item let $zips := distinct-values($orders/billto/zip) let $parts := distinct-values($items/@partnum) return <rpt:purchasereport> <rpt:regions> { for $zip in $zips order by $zip return <rpt:zip code="{$zip}"> { for $part in $parts let $hits := $orders[ billto/zip = $zip and items/item/@partnum = $part] let $quantity := sum($hits//item[@partnum=$part]/quantity) where count($hits) > 0 order by $part return <rpt:part number="{$part}" quantity="{$quantity}"/> } </rpt:zip> } </rpt:regions> <rpt:parts> { for $part in $parts return <rpt:part number="{$part}">{ string($items[@partnum = $part]/productname)} </rpt:part> } </rpt:parts> </rpt:purchasereport> Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 13
Konstruktoreita XML-rakenteen luominen kyselyn sisällä Suorissa konstruktoreissa XML-syntaksi Alkutunniste, attribuutit, elementin sisältö, lopputunniste Laskettavissa konstruktoreissa {määrittely aaltosulkeissa} Arvo lasketaan ja sijoitetaan sulkeiden paikalle Esimerkki: Kopioidaan elementit sisällön arvo tuplattuna element {fn:node-name($e)} {$e/@*, 2 * fn:data($e)} Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 14
Ehtolausekkeita if lasketaan aina then lasketaan tarvittaessa else lasketaan tarvittaessa if ($widget1/unit-cost < $widget2/unit-cost) then $widget1 else $widget2 Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 15
XQuery-funktiot XQuery 1.0, XSLT 2.0, XPath 2.0 yhteinen funktiokirjasto Yli 100 sisäänrakennettua funktiota Merkkijonojen ja numeroiden käsittely, ajankäsittely, puurakenteen ja nimien muokkaus, boolean, jne Itse määriteltävät funktiot Funktioita käytetään ajon aikaisessa laskennassa Elementin sisältö: <name>{uppercase($booktitle)}</name> Predikaattilausekkeet (kuten XPath 1.0) For-, let-, where- ja return-lausekkeet Syntaksi: FunctionCall ::= QName "(" (ExprSingle ("," ExprSingle )*)? ")" Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 16
Käyttäjän määrittelemät funktiot Funktioit määritellään joko kyselyssä tai erillisessä kirjastossa Syntaksi: declare function prefix:function_name($parameter as datatype) as returndatatype { (:...function code here... :) }; Nimessä etuliite XML Scheman tietotyypit Määrittelyn runko aaltosulkeissa Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 17
Esimerkki: Kyselyssä määritelty funktio Paikallisesti määritellyille funktiolle local-nimiavaruus declare function local:minprice( $price as xs:decimal?, $discount as xs:decimal?) as xs:decimal? { let $disc := ($price * $discount) div 100 return ($price - $disc) }; (: Esimerkki funktiokutsusta :) <minprice>{local:minprice($book/price, $book/discount)}</minprice> Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 18
Top-Level XQuery XQuery ylimmän tason kyselykielenä Yhdistää XML-dokumentit ja XML-näkymät relaatiodataan Samanaikaisuuden hallinta ja lukitus elementtitasolla Perinteinen SQL upotettu XQuery-kyselyihin Oraclella sqlquery-funktio, joka palauttaa listan rowelementtejä for $i in sqlquery("select * from scott.emp")/row return <emp empno="{$i/empno}"> $i/ename, $i/salary </emp> Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 19
Oraclen XQuery-ympäristö Tietokannassa SQL*Plus: XQuery-komentorivitulkki (Top-Level XQuery) SQL/XML - XMLQuery, XMLTable, XMLNamespaces XDK Java tukee XQueryn funktioita ja operaattoreita Sovellusohjelman ja tietokannan välissä (mid-tier) XQuery API for Java (XQJ), kuten JDBC/SQL Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 20
Lisää XQuery-materiaalia Web-tutoriaalit Mm. www.w3schools.com Spesifikaatiot: W3C www.w3.org/xml/query Kirjallisuutta Mm. XQuery from the Experts, Addison-Wesley, 2004. Miro Lehtonen, XQuery tietokannan kyselykielenä 31.10.2007 21