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.

XQuery
ParadigmaXML
Megjelent2007
FejlesztőWorld Wide Web Consortium
Operációs rendszerplatformfüggetlen
Weboldal

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

  1. XML and Semantic Web W3C Standards Timeline, 2012. február 4.
  2. XQuery 3.0 Recommendation, 2014. április 8.
  3. XQuery 3.1 Recommendation, 2017. március 21.
  4. Wagner, Michael. SQL/XML:2006 – Evaluierung der Standardkonformität ausgewählter Datenbanksysteme. Diplomica Verlag (2010). ISBN 3-8366-9609-6 
  5. 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