XQuery – Dotazování nad XML

Lukáš Kokrment

xkokrmen@fi.muni.cz

Fakulta informatiky

Masarykova univerzita

Brno

Motivace

Co můžeme chtít dělat s XML dokumenty?

Human-readable documents

získávat jednotlivé dokumenty, vyhledávání podle obsahu, generování nových dokumentů, ...

Data-oriented documents

dotazovat XML reprezentaci databází, transformovat data, integrovat data z více zdrojů, ...

Mixed-model documents

dotazy na záznamy o zaměstnancích, obsahy katalogů, ...

Chceme získávat data

XML dokumenty a relační data

XML dokument lze považovat za zobecnění relačních dat

XML dokument tvoří obecnějsí strom než relační data

Chceme zobecnit SQL pro XML

Technické požadavky na dotazovací jazyk nad XML (dle W3C)

Deklarativní jazyk

Jmenné prostory

Spolupráce s XML Schema (datové typy)

Kvantifikátory

Kombinace informací z více dokumentů

Transformace a vytváření nových XML dokumentů

další

XQuery

Jazyk pro dotazování nad XML

Analogie databázového SQL

Postaveno na XPath výrazech

Datové typy z XML Schema

Současná verze je 1.0

Zatím není standard (pouze working draft W3C)

Samotné XQuery není XML (XQueryX)

Základní koncept XQuery

Prochází sekvenci XML fragmetů (nebo atomických hodnot)

Vrací sekvenci XML fragmentů (nebo atomických hodnot)

Základní součásti XQuery

Cesty (path expressions)

Konstruktory elementů (element constructors)

FLWOR ("flower") expressions

Práce se seznamy (list expressions)

Podmíněné výrazy (conditional expressions)

Kvantifikátory (quantified expressions)

Odbočka první – Xpath I.

XPath je jazyk výrazů pro definování částí XML dokumentů

Používá cesty pro určení XML elemetů (analogie k systému souborů)

Součástí je knihovna funkcí, které lze ve výrazech používat

Standard W3C (aktuální verze 2.0)

Příklad: /catalog/cd/artist[@country='CZ']

Odbočka první – Xpath II.

Relativní nebo absolutní cesty, wildcards

Možnost výběru elementů i atributů

Omezení na velikost výběru (//cd[1], //cd[last()], ...)

Matematické výrazy a logické operátory

Osy - axes (ancestor, ancestor-or-self, child, ...)

Předdefinované funkce (name(), ceiling(), concat(), ...)

Odbočka druhá – XML Schema

XQuery podporuje datové typy XML Schema

Základní – decimal, integer, date, string, ...

Odvozené – list, union, restriction, ...

<xs:element name="age">

<xs:simpleType>

<xs:restriction base="xs:integer">

<xs:minInclusive value="0"/>

<xs:maxInclusive value="100"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

Cesty (path expressions)

Jedná se vlastně pouze o Xpath výrazy

doc("recipes.xml")//recipe[title="Ricotta Pie"]//ingredient[@amount]

Konstruktory elemetů (element constructors)

Jednoduché

<employee empid="12345">

<name>John Doe</name>

<job>XML specialist</job>

<deptno>187</deptno>

<salary>125000</salary>

</employee>

S použitím proměnných

<employee empid="{$id}">

<name>{$name}</name>

{$job}

<deptno>{$deptno}</deptno>

<salary>{$SGMLspecialist+100000}</salary>

</employee>

FLWOR ("flower") expressions

For-Let-Where-Order-Return (základ Xquery)

Zobecněný SQL select

for $d in doc("depts.xml")//deptno

let $e := doc("emps.xml")//employee[deptno = $d]

where count($e) >= 10

order by avg($e/salary) descending

return

<big-dept>

{ $d,

<headcount>{count($e)}</headcount>,

<avgsal>{avg($e/salary)}</avgsal>

}

</big-dept>

Práce se seznamy (list expressions)

Seznamy, intervaly, množinové operace

Funkce avg, min, max, distinct-values, remove, ...

for $p in distinct-values(doc("bib.xml")//publisher)

let $a := avg(doc("bib.xml")//book[publisher = $p]/price)

return

<publisher>

<name>{ $p/text() }</name>

<avgprice>{ $a }</avgprice>

</publisher>

Podmíněné výrazy (conditional expressions)

Klasická podmínka if-then-else

for $h in doc("library.xml")//holding

return

<holding>

{ $h/title,

if ($h/@type = "Journal")

then $h/editor

else $h/author

}

</holding>

Kvantifikátory (quantified expressions)

Existenční (some-in-satisfies)

for $b in doc("bib.xml")//book

where some $p in $b//paragraph satisfies

(contains($p,"sailing") AND contains($p,"windsurfing"))

return $b/title

Univerzální (every-in-satisfies)

for $b in doc("bib.xml")//book

where every $p in $b//paragraph satisfies

contains($p,"sailing")

return $b/title

Implementace

Saxon (http://saxon.sourceforge.net/saxon7.9.1/)

Galax (http://db.bell-labs.com/galax/)

Qexo (http://www.gnu.org/software/qexo/)

Také některé relační databáze dnes již podporují do jisté míry XQuery a XPath

Reference

http://www.brics.dk/~amoeller/XML/querying/

http://www.w3schools.com/xquery/

http://www.w3.org/TR/xquery/

2004-05-10T21:20:25