XQuery

A Wikipédiából, a szabad enciklopédiából
XQuery
ParadigmaXML
Megjelent2007
FejlesztőWorld Wide Web Consortium
Operációs rendszerplatformfü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]

  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]