XQuery

XQuery
Paradigme : XML
Anul publicării: 2005
Dezvoltator: Consorțiul World Wide Web
Versiunea curentă  : 3.1   (21 martie 2017)
Tastare : puternic
Implementări importante : BaseX , EXist (baza de date) , Galax, Saxon , Pathfinder, XQilla, Zorba
Standardizări: Specificații W3C
Influențată de: XQL , XML-QL , Quilt
Sistem de operare : platforma independenta
w3.org

XQuery înseamnă XML Query Language și se referă la un limbaj de interogare specificat de W3C pentru baze de date XML . Este folosit pentru a alege părți individuale din colecții mari de date XML . În schimb, XSLT este utilizat pentru a transforma documente XML întregi.

XQuery folosește o sintaxă bazată pe XSLT, SQL și C și folosește XPath și XML Schema pentru modelul său de date și biblioteca sa de funcții. A apărut din limbile XQL , XML-QL și Quilt .

XQuery este puternic tastat și Turing-complet .

Donald D. Chamberlin a fost implicat în mod semnificativ în dezvoltare (ca și în cazul Quilt) .

Elemente de limbaj

În plus față de expresiile de cale ( XPath ), există o serie de alte proprietăți de limbă care vor fi explicate în secțiunile următoare folosind exemple scurte.

Modelul de date

Structura de bază a datelor în XQuery este o secvență. O secvență este o listă ordonată de zero, unul sau mai multe elemente. Prin urmare, o secvență poate fi și un document XML. Secvențele sunt de obicei între paranteze și pot conține, de asemenea, duplicate. Secvențele nu pot fi cuibărite.

Următoarele secvențe sunt identice:

  • (1, 2, 1) și (1, (2, 1))
  • (1, (), ) și (1, )
  • (<A/>) și <A/>

XQuery oferă șase funcții pentru interogarea cardinalităților pe secvențe:

  • fn: zero-or-one ($ seq)
  • fn: unul sau mai mulți ($ seq)
  • fn: exact-unu ($ seq)
  • fn: gol ($ seq)
  • fn: există ($ seq)
  • fn: count ($ seq)

În XQuery, variabilele sunt identificate cu un prefix $.

Editarea secvențelor

  • Operatorul virgulă atârnă două secvențe una în spatele celeilalte
  • Puteți adăuga valori cu funcția fn: insert-before
  • Puteți șterge valori cu funcția fn: remove
  • Puteți rearanja valorile cu funcția fn: invers
  • Puteți rearanja valorile cu funcția fn: unordered

Construirea elementelor XML

Construcție XML directă cu nume de elemente constante („constructori direcți”):

 <html>
   <head> { $page/head/content() } </head>
   <body bgcolor={ $style/bgcolor/text() } > { $page/body/content() } </body>
 </html>

„Constructori calculați”

 element html {
   element head { $page/head/content() }
   element body {
        attribute bgcolor { $style/bgcolor/text() },
        text { $page/body/content() }
   }
 }

Atât notația directă ca XML, cât și construcția mai declarativă folosind așa-numiții „constructori calculați” sunt disponibile pentru construirea datelor XML. În ambele cazuri, acoladele sunt utilizate { ... }pentru a încorpora orice alte expresii XQuery în constructor.

Funcționalitate de sortare („ordonare după”)

Spre deosebire de algebra relațională și SQL , elementele de date XML au o ordine implicit predeterminată („ordinea documentului”). Toate expresiile XQuery trebuie să aibă această ordine, cu excepția cazului în care aceasta este dezactivată în mod explicit în expresie (Mod de comandă: neordonat).

Expresii FLWOR

Așa-numitele expresii FLWOR (pronunțate: floare ) joacă un rol central în XQuery . FLWOR este o abreviere pentru constructele for, let, where, order byși returnpoate fi privită ca o analogie cu constructele (SELECT, FROM, WHERE) din SQL. Spre deosebire de SQL, totuși, expresiile FLWOR sunt sensibile la majuscule . Expresiile FLWOR mapează secvențe cu secvențe (vezi modelul de date ). Expresiile FLWOR au următoarea formă generică:

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>

Aici reprezintă <Expr>orice altă expresie XQuery și <BoolExpr>o expresie de tip boolean. Cele forConstrucțiile leagă variabilele lor $forvar1, $forvar2, ... secvențial la o valoare fiecare din legarea secvențelor <Expr>. Folosind cuvântul cheie at, poziția variabilei precedente din <Expr>secvență poate fi legată de o variabilă de poziție, cu numerotarea începând de la 1. În schimb, letconstructele își leagă variabilele $letvar1, $letvar2, ...de întregul rezultat al expresiei asociate. Secvența de tupluri rezultată conține toate combinațiile posibile de legături variabile care pot fi formate din atribuirea variabilelor for și let.

where-CONSTRUCT este folosit pentru a elimina tupluri nedorite. Este logic să folosiți expresia sa booleană pentru a face referire la cel puțin una dintre variabilele legate în constructele forși let. Același lucru este valabil și pentru order byconstruct, care este folosit pentru a sorta tuplurile. În cele din urmă, în returnconstrucție, variabilele de interes sunt returnate, eventual încorporate în elemente construite direct sau indirect. În cazuri mai complexe, expresiile FLWOR sunt, de asemenea, imbricate, ceea ce înseamnă că <Expr>orice expresie FLWOR poate fi utilizată în loc de fiecare apariție a .

Următorul exemplu ilustrează utilizarea forși let. Partea forexpresiei selectează toate paragrafele dintr-o pagină HTML (<p> elemente). În letparte, numărul de cuvinte este determinat pentru fiecare paragraf cu ajutorul funcțiilor predefinite. Apoi, toate paragrafele care nu sunt goale (număr de cuvinte> 0) sunt extinse cu o specificație de dimensiune și o ieșire.

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>

Vă rugăm să rețineți cu această expresie că for- și - letparte sunt dependente una de cealaltă, forvariabila declarată $parîn letparte este utilizată în parte. Pentru evaluare, aceasta înseamnă că partea- trebuie reevaluată letpentru fiecare atribuire a variabilei $par.

Operații și grupări compuse

Operațiile compuse (sau îmbinările ) denotă o operație de set care constă din formarea unui produs cartezian din două seturi de intrare și o selecție ulterioară (a se vedea Algebra relațională ). O astfel de operație compusă este prezentată deja în exemplul secțiunii anterioare privind expresiile FLWOR. Legăturile dintre variabilele declarate în forși letpărți formează respectivele wherecantități de intrare la al căror produs cartezian sunt aplicate condițiile de selecție ale piesei. Deoarece condițiile de selecție pot apărea atât în where-partea expresiei, cât și în for- și let-partea în subexpresii, normalizarea este necesară înainte de a evalua o expresie.

Funcții predefinite

Pentru calcularea ecuațiilor aritmetice și a calculelor de date, precum și pentru procesarea secvențelor în modelul de date .

Funcții personalizate

User- declare functionfuncții definite pot fi declarate folosind. Forma generală arată astfel:

declare function namespace:funktionsname
 ($parameter1 as datentyp1, $parameter2 as datentyp2, …) as rückgabedatentyp {
       <XQuery-Ausdruck>
}

Funcțiile pot apela recursiv și alte funcții , astfel încât XQuery este complet Turing .

Diferiti operatori de comparatie

XQuery cunoaște două tipuri de funcții de comparație: calificare pentru valoare sau calificare pentru existență. Operatorii care califică valoarea sunt similari cu operatorii obișnuiți din alte limbaje de programare. Următorii operatori sunt definiți

  • eq: Verifică egalitatea
  • ne: Verifică inegalitatea (nu egală)
  • Lt: Verifică mai puțin de
  • gt: Verifică dacă este mai mare de
  • le: Verifică dacă este mai mic sau egal
  • ge: Verifică dacă este mai mare sau egal

Operatorii „normale“ de comparație ( =, !=, <, >, <=, >=) , printr - o comparație existențială. Pot exista secvențe în stânga și în dreapta operatorului. Deci , expresia este seq1 OP seq2adevărată numai în cazul în care un element e1al seq1și e2de seq2acolo în e1 OP e2cazul în care OPunul dintre operatorii =, !=, <, >, <=sau >=este. Așa este (1, 2) > (3, 0)adevărat, există 1 > 0.

Exemple

Numărarea tuturor elementelor XML ale întrebărilor din documentul sursă:

fn:count(//question)

Exemplu mai complex, listând toate întrebările tuturor documentelor dintr-o galerie pentru KEduca care au mai puțin de două răspunsuri:

<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>

Un alt exemplu (arată posibilitatea restructurării indirecte prin XQuery)

  • Document sursa:
<?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>
  • Document țintă:
<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>
  • Soluție în XQuery:
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>

utilizare

Datorită importanței XML și volume mari de date istorice în relaționale baze de date , The ISO a dezvoltat o extensie a SQL standard numit SQL / XML pentru a combina posibilitățile de XML și SQL. XQuery a fost definit ca limbajul de interogare pentru interogarea datelor XML în contextul funcției SQL XMLQuery.

Implementări

  • BaseX , Open Source: XQuery 3.1, XQuery Full-Text 1.0, XQuery Update 1.0
  • eXist , Open Source: XQuery 3.0, XQuery Update 1.0
  • Saxon , Open Source și Comercial: XQuery 3.1, XQuery Update 1.0
  • Sirix , Open Source: XQuery 1.0 (și XQuery Update 1.0 bazat pe Brackit )
  • xqerl , Open Source: XQuery 3.1, XQuery Update 3.0
  • XQilla , Open Source: XPath 2.0, XQuery Update 1.0
  • Zorba , Open Source: XQuery 3.0, XQuery Full Text 1.0, XQuery Update 1.0;
  • Rezultate XQuery Test Suite : conformitate XQuery 1.0

literatură

Link-uri web

Wikționar: XQuery  - explicații privind semnificațiile, originile cuvintelor, sinonime, traduceri

Dovezi individuale

  1. Michael Wagner: SQL / XML: 2006 - Evaluarea conformității standard a sistemelor de baze de date selectate . Diplomica Verlag, 2010, ISBN 3-8366-9609-6 .