XQuery
XQuery | |
Paradigma | XML |
Megjelent | 2007 |
Tervező | World Wide Web Consortium |
Fejlesztő | World Wide Web Consortium |
Operációs rendszer | platformfüggetlen |
Weboldal |
Az XQuery (jelentése: XML Query Language) a W3C által meghatározott lekérdezési nyelv XML-adatbázisokhoz. Célja részletek keresése nagy XML-adatbázisokból. Ezzel szemben az XSLT célja teljes XML-dokumentumok átalakítása.
Az XQuery XSLT-n, SQL-en és C-n alapuló szintaxist használ, és XPatht és XML-sémát használ adatmodelljéhez és függvényeihez. Az XQL-ből, az XML-QL-ből és a Quiltből vett át számos ötletet.
Az XQuery erősen típusos és Turing-teljes.
A fejlesztésében (akárcsak a Quiltében) részt vett Donald D. Chamberlin.
Az XQuery 1.0 2007. január 23-án,[1] az XQuery 3.0 2014. április 8-án,[2] az XQuery 3.1 2017. március 21-én vált W3C-ajánlássá.[3]
Nyelvi elemek
[szerkesztés]Az útkifejezéseken kívül (XPath) számos további nyelvi jellemző van, melyek a következő szakaszokban rövid példákkal együtt szerepelnek.
Adatmodell
[szerkesztés]Az XQuery alapvető adatszerkezete egy sorozat, mely egy 0 vagy több elemből álló rendezett lista. Egy sorozat lehet XML-dokumentum. A sorozatok jellemzően zárójelek közt vannak, és duplikátumokat is tartalmazhatnak. A sorozatok nem ágyazhatók egymásba.
Az alábbi sorozatok azonosak:
(1, 2, 1)
és(1, (2, 1))
(1, (), )
és(1, )
(<A/>)
és<A/>
Az XQueryben a számosságok lekérdezésére az alábbi hat függvény elérhető:
- fn:zero-or-one($seq)
- fn:one-or-more($seq)
- fn:exactly-one($seq)
- fn:empty($seq)
- fn:exists($seq)
- fn:count($seq)
Az XQueryben a változók előtagja $.
Sorozatok szerkesztése:
- A vesszőoperátor két sorozatot fűz össze egymás mögött
- Értékek hozzáadása az fn:insert-before függvénnyel történik
- Értékek törlése az fn:remove függvénnyel történik
- Az értéksorrend az fn:reverse függvénnyel fordítható meg
- Az értékek átrendezése az fn:unordered függvénnyel történik
XML-elemek felépítése
[szerkesztés]Közvetlen XML-konstrukció állandó elemnevekkel („direct constructors”):
<html> <head> { $page/head/content() } </head> <body bgcolor={ $style/bgcolor/text() } > { $page/body/content() } </body> </html>
„Computed constructors”
element html { element head { $page/head/content() } element body { attribute bgcolor { $style/bgcolor/text() }, text { $page/body/content() } } }
XML-adatok felépítéséhez használható a direkt XML-írásmód és a „computed constructors” deklaratívabb konstrukció egyaránt. Mindkét esetben a kapcsos zárójelek ({…}
) a további XQuery-kifejezések beágyazására szolgálnak.
Rendezési funkció (order by)
[szerkesztés]A relációs algebrával és az SQL-lel szemben az XML-adatelemek implicit megadott rendezéssel (document order) rendelkeznek. Minden XQuery-kifejezésnek be kell tartania e rendezést, kivéve ha a kifejezésben ez ki van kapcsolva (Ordering mode: unordered).
FLWOR-kifejezések
[szerkesztés]Fontos szerepük van az XQueryben a FLWOR-kifejezéseknek (ˈflaʊ.ə) Ez a for, let, where, order by, return
rövidítése és az SQL (SELECT, FROM, WHERE) kifejezéseihez hasonlítanak. Az SQL-lel szemben a FLWOR-kifejezések nagybetűérzékenyek. Ezek szekvenciákat bontanak szekvenciákra (vö. adatmodell). A FLWOR-kifejezések formái az alábbiak:
for $forvar1 at $posvar1 in <Expr>, $forvar2 at $posvar2 in <Expr> … let $letvar1 := <Expr>, $letvar2 := <Expr> … where <BoolExpr> order by <Expr> ascending/descending return <Expr>
Itt az <Expr>
tetszőleges XQuery-kifejezést, a <BoolExpr>
boolean típusú kifejezést jelent. A for
-szerkezetek a $forvar1, $forvar2…
változókat sorozatban rendelik hozzá az <Expr>
szekvenciából. Az at
kulcsszóval a korábbi változó értéke hozzárendelhető pozíciós változóval, ahol a számozás 1-nél kezdődik. Ezzel szemben a let
-szerkezetek a $letvar1, $letvar2…
változókat a hozzá tartozó kifejezés egész eredményéhez kötik. Az így létrejövő listasorozat a hozzárendelések minden lehetséges kombinációját tartalmazza, melyek a for- és let-változókból létrehozhatók.
A where
-szerkezet a nem kívánt listákat kerüli el. Egy boolean kifejezés a for
- és let
-szerkezetekhez kapcsolt változók legalább egyikéhez kapcsolódik. Ugyanez teljesül az order by
-szerkezetre is, amely a sorozatokat rendezi. A return
-szerkezet a kívánt változókat adja, lehetőleg direkten vagy indirekten létrehozott változókba ágyazva. Komplex esetekben a FLWOR-kifejezések egymásba ágyazhatók, vagyis az <Expr>
előfordulási helyén egy FLWOR-kifejezés is állhat.
A következő példában szerepel a for
és a let
használata. A for
-rész kiválaszt minden bekezdést egy HTML-oldalon (<p> elemek), a let
rész előre definiált függvények segítségével kiadja a szószámukat. Végül minden nem üres bekezdést (szószám > 0) nagyságukkal együtt kiadja a kód.
for $par in $page//p let $words := fn:count(fn:tokenize($par/content(), " \n\t")) where $words gt 0 return <p> {$par/content()}<br/> Size: { $words } </p>
E kifejezésben észrevehető, hogy a for
- és a let
-rész egymástól függ, mivel a for
-részben definiált $par
változót használja a let
-rész. Ez azt jelenti, hogy a let
-rész a $par
minden definiálásakor újra kiértékelendő.
Összekötő operátorok és csoportosítások
[szerkesztés]Az összekötő műveletek (angolul: join) két bemeneti halmazból és egy ezt követő kiválasztásból álló direkt szorzatot eredményeznek (vö. relációs algebra). Például a FLWOR-kifejezésekről szóló szakaszban egy ilyen művelet szerepelt. A for
és a let
részekben definiált változók összekötése a bemeneti halmazokat direkt szorzatuk azon részhalmazává alakítja, ahol a where
kiválasztási feltételei alkalmazva lettek. Mivel a kiválasztási feltételek a kifejezés where
és az alkifejezések for
és let
részeiben is előfordulhatnak, a kifejezés kiértékelése előtt szükséges a normalizáció.
Elődefiniált függvények
[szerkesztés]Egyenletek, adatok számítására és az adatmodell sorozatainak módosítására használatosak.
Felhasználó által megadott függvények
[szerkesztés]A declare function
révén hozhat létre a felhasználó függvényeket. Az általános forma a következő:
declare function namespace:függvénynév ($parameter1 as adattípus1, $parameter2 as adattípus2, …) as kimenettípus { <XQuery-kifejezés> }
A függvények más függvényeket és saját magukat is meghívhatják rekurzívan, így az XQuery Turing-teljes.
Összehasonlító operátorok
[szerkesztés]Az XQueryben kétféle összehasonlító függvény van: az értékminősítő és a létezésminősítő. Az értékminősítők más nyelvek megfelelő operátoraihoz hasonlítanak. Az alábbi operátorok léteznek:
- eq: Egyenlőség (equal)
- ne: Egyenlőtlenség (not equal)
- lt: Kisebb (less than)
- gt: Nagyobb (Greater than)
- le: Kisebb vagy egyenlő (Less or equal)
- ge: Nagyobb vagy egyenlő (Greater or equal)
A leggyakoribb összehasonlító műveletek (=
, !=
, <
, >
, <=
, >=
) egzisztenciális összehasonlítást végeznek. Így az operátor bal és jobb oldalán is állhatnak sorozatok. A seq1 OP seq2
akkor igaz, ha seq1
-nek van e1
, seq2
-nek pedig e2
eleme, ahol e1 OP e2
, és OP
az=
, !=
, <
, >
, <=
vagy >=
operátorok egyike. Így (1, 2) > (3, 0)
igaz, mivel 1 > 0
.
Példák
[szerkesztés]Minden question XML-elem számlálása a célban:
fn:count(//question)
Összetettebb példa, mely minden dokumentum minden kérdését listázza, ahol 2-nél kevesebb válasz van:
<noanswerquestions>{
for $s in fn:doc("lpi101.edugallery")//server/@address
for $d in fn:doc($s)[count(.//question/(true, false)) <= 1]
return <doc src="{ $s }">{
$d//question[count((true, false)) <= 1]
}</doc>
}</noanswerquestions>
Egy további példa (az XQueryn keresztül történő indirekt átstrukturálás lehetőségeit mutatja meg):
- Forrásdokumentum:
<?xml version="1.0" encoding="ISO-8859-1"?>
<partlist>
<part partid="0" name="car"/>
<part partid="1" partof="0" name="engine"/>
<part partid="2" partof="0" name="door"/>
<part partid="3" partof="1" name="piston"/>
<part partid="4" partof="2" name="window"/>
<part partid="5" partof="2" name="lock"/>
<part partid="10" name="skateboard"/>
<part partid="11" partof="10" name="board"/>
<part partid="12" partof="10" name="wheel"/>
<part partid="20" name="canoe"/>
</partlist>
- Céldokumentum:
<parttree>
<part partid="0" name="car">
<part partid="1" name="engine">
<part partid="3" name="piston"/>
</part>
<part partid="2" name="door">
<part partid="4" name="window"/>
<part partid="5" name="lock"/>
</part>
</part>
<part partid="10" name="skateboard">
<part partid="11" name="board"/>
<part partid="12" name="wheel"/>
</part>
<part partid="20" name="canoe"/>
</parttree>
- XQuery-megoldás:
declare function local:one_level ($p as node()) as node()
{
<part partid="{$p/@partid}" name="{$p/@name}">
{
for $s in doc("data/parts-data.xml")//part
where $s/@partof =$p/@partid
return local:one_level($s)
}
</part>
};
<parttree>
{
for $p in doc("data/parts-data.xml")//part [empty(@partof)]
return local:one_level($p)
}
</parttree>
Alkalmazása
[szerkesztés]A relációs adatbázisokban az XML és történelmileg nagyobb adatkészletek szüksége miatt a nemzetközi szabványügyi szervezet az SQL egy kiterjesztését dolgozta ki, az XML és az SQL lehetőségeit kombináló SQL/XML-t. Az XML-adatoknak az XMLQuery SQL-függvényben való lekérdezésére használt nyelvet elnevezték XQuerynek.[4]
Implementációk
[szerkesztés]- BaseX, nyílt forrású: XQuery 3.1, XQuery Full-Text 1.0, XQuery Update 1.0
- eXist, nyílt forrású: XQuery 3.0, XQuery Update 1.0
- Saxon, nyílt forrású és kereskedelmi változatok: XQuery 3.1, XQuery Update 1.0
- Sirix, nyílt forrású: XQuery 1.0 (és XQuery Update 1.0 Brackiten alapulva)
- xqerl, nyílt forrású: XQuery 3.1, XQuery Update 3.0
- XQilla, nyílt forrású: XPath 2.0, XQuery Update 1.0
- Zorba, nyílt forrású: XQuery 3.0, XQuery Full Text 1.0, XQuery Update 1.0;
- XQuery Test Suite Results: XQuery-kompatibilitási teszt[5]
Jegyzetek
[szerkesztés]- ↑ XML and Semantic Web W3C Standards Timeline, 2012. február 4. [2013. április 24-i dátummal az eredetiből archiválva]. (Hozzáférés: 2023. augusztus 2.)
- ↑ XQuery 3.0 Recommendation, 2014. április 8.
- ↑ XQuery 3.1 Recommendation, 2017. március 21.
- ↑ Wagner, Michael. SQL/XML:2006 – Evaluierung der Standardkonformität ausgewählter Datenbanksysteme. Diplomica Verlag (2010). ISBN 3-8366-9609-6
- ↑ XQuery Test Suite Results
Fordítás
[szerkesztés]Ez a szócikk részben vagy egészben a XQuery című német Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.
Források
[szerkesztés]- Priscilla Wamsley. XQuery. Beijing: O’Reilly Media (2007). ISBN 978-0-596-00634-1
- Margit Becher. XML – DTD, XML-Schema, XPath, XQuery, XSLT, XSL-FO, SAX, DOM. Witten: W3L Verlag (2009). ISBN 978-3-937137-69-8
- XQuery-specifikáció
- Az XQuery használata
- XQuery Update Facility
- Bevezetés az XQuerybe