FLWOR

FLWOR

XQuery steht für XML Query Language und bezeichnet eine vom W3C spezifizierte Abfragesprache für XML-Datenbanken.

XQuery benutzt eine an XSLT, SQL und C angelehnte Syntax und verwendet XPath sowie XML Schema für sein Datenmodell und seine Funktionsbibliothek. XQuery ist aus den Sprachen XQL, XML-QL und Quilt hervorgegangen.

XQuery ist eine stark typisierte Programmiersprache. XQuery ist Turing-vollständig.

Inhaltsverzeichnis

Sprachelemente

Außer Pfadausdrücken (XPath) gibt es eine ganze Reihe weiterer interessanter Spracheigenschaften, die in den folgenden Abschnitten anhand von kurzen Beispielen erläutert werden sollen.

Konstruktion von XML-Elementen

Direkte XML-Konstruktion mit konstanten Elementnamen ("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() }
   }
 }

Zur Konstruktion von XML-Daten steht sowohl die direkte Schreibweise als XML als auch die eher deklarative Konstruktion mittels der sogenannten "computed constructors". In beiden Fällen dienen die geschweiften Klammern { ... } zur Einbettung von beliebigen weiteren XQuery-Ausdrücken in den Konstruktor.

Sortier-Funktionalität ("order by")

Im Gegensatz zur Relationalen Algebra und zu SQL besitzen XML-Datenelemente eine implizit vorgegebene Ordnung ("document order"). Alle XQuery-Ausdrücke müssen diese Ordnung erhalten, es sei denn, dies wird im Ausdruck explizit ausgeschaltet (Ordering mode: unordered).

FLWOR-Ausdrücke

Eine zentrale Rolle in XQuery spielen die sogenannten FLWOR-Ausdrücke (ausgesprochen: flower). FLWOR ist eine Abkürzung für die Konstrukte for, let, where, order by und return, und kann als Analogie zu den (SELECT, FROM, WHERE) - Konstrukten in SQL betrachtet werden. FLWOR-Ausdrücke besitzen die folgende generische Form:

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>

Hierbei steht <Expr> für beliebige andere XQuery-Ausdrücke, und <BoolExpr> für einen Ausdruck vom Typ boolean. Die for-Konstrukte binden ihre Variablen $forvar1, $forvar2, ... sequentiell an je einen Wert aus den Bindungssequenzen <Expr>. Über das Schlüsselwort at kann die Position der vorherstehenden Variable in der <Expr>-Sequenz an eine Positionsvariable gebunden werden, wobei die Nummerierung bei 1 beginnt. Im Unterschied dazu binden die let-Konstrukte ihre Variablen $letvar1, $letvar2, ... an das gesamte Ergebnis des assoziierten Ausdrucks. Die sich ergebende Tupelfolge beinhaltet alle möglichen Kombinationen von Variablenbindungen, die sich aus der Belegung der for- und let-Variablen bilden lassen.

Das where-Konstrukt dient zur Eliminierung unerwünschter Tupel. Sinnvollerweise nimmt sein boolescher Ausdruck Bezug auf mindestens eine der in den for- und let-Konstrukten gebundenen Variablen. Das gleiche gilt für das order by-Konstrukt, das zum Sortieren der Tupel dient. Im return-Konstrukt werden schließlich die Variablen von Interesse zurückgegeben, möglicherweise eingebettet in direkt oder indirekt konstruierte Elemente. In komplexeren Fällen werden FLWOR-Ausdrücke auch geschachtelt, das bedeutet, dass an der Stelle von jedem Vorkommen von <Expr> wiederum ein beliebiger FLWOR-Ausdruck stehen kann.

Das nachfolgende Beispiel veranschaulicht die Verwendung von for und let. Der for-Teil des Ausdrucks selektiert alle Paragraphen innerhalb einer HTML-Seite (<p>-Elemente). Im let-Teil wird für jeden Paragraph mit Hilfe von vordefinierten Funktionen die Zahl der Worte ermittelt. Anschließend werden alle nicht leeren Paragraphen (Wortzahl > 0) um eine Größenangabe erweitert und ausgegeben.

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>

Zu beachten ist bei diesem Ausdruck, dass for- und let-Teil abhängig von einander sind, die im for-Teil deklarierte Variable $par wird im let-Teil verwendet. Für die Auswertung bedeutet dies, dass der let-Teil für jede Belegung der Variable $par neu ausgewertet werden muss.

Verbundoperationen und Gruppierungen

Verbundoperationen (oder engl. Joins) bezeichnen eine Mengenoperation bestehend aus der Bildung eines kartesischen Produktes zweier Eingabemengen und einer nachfolgenden Selektion (vergl. Relationale Algebra). Im Beispiel des vorherigen Abschnitts zu FLWOR-Ausdrücken ist bereits eine solche Verbundoperation gezeigt. Die Bindungen der in den for- und let-Teilen deklarierten Variablen bilden die jeweiligen Eingabemengen auf deren kartesisches Produkt die Selektionsbedingungen des where-Teils angewandt werden. Da Selektionsbedingungen sowohl im where-Teil des Ausdrucks als auch innerhalb der for- und let-Teile in Subausdrücken auftreten können, ist vor der Auswertung eines Ausdrucks eine Normalisierung notwendig.

Vordefinierte Funktionen

Zur Berechnung arithmetischer Gleichungen sowie Datumsberechnungen.

Benutzerdefinierte Funktionen

Mittels declare function können benutzerdefinierte Funktionen deklariert werden. Die allgemeine Form sieht folgendermaßen aus:

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

Funktionen können andere Funktionen und sich selbst rekursiv aufrufen, damit ist XQuery Turing-vollständig.

Verschiedene Vergleichsoperatoren

XQuery kennt zwei Typen von Vergleichsfunktionen: wertqualifizierend oder existenzqualifizierend. Die wertqualifizierenden Operatoren ähneln den üblichen Operatoren aus anderen Programmiersprachen. Folgende Operatoren sind definiert

  • eq: Prüft auf Gleichheit (equal)
  • ne: Prüft auf Ungleichheit (not equal)
  • lt: Prüft auf Kleiner (less than)
  • gt: Prüft auf Größer (Greater than)
  • le: Prüft auf Kleiner-Gleich (Less or equal)
  • ge: Prüft auf Größer-Gleich (Greater or equal)

Die „üblichen“ Vergleichsoperatoren (=, !=, <, >, <=, >=) führen einen existenziellen Vergleich durch. Dabei können links und rechts des Operators Sequenzen stehen. So ist der Ausdruck seq1 OP seq2 genau dann wahr, wenn ein Element e1 aus seq1 und ein e2 aus seq2 existieren mit e1 OP e2, wobei OP einer der Operatoren =, !=, <, >, <= oder >= ist. So ist (1, 2) > (3, 0) wahr, da 1 > 0 ist.

XQuery ist dazu gedacht, aus großen XML-Datensammlungen einzelne Teile herauszusuchen. Im Gegensatz dazu dient XSLT dazu, komplette XML-Dokumente zu transformieren.

Beispiele

Zählen aller question-XML-Elemente im Quelldokument:

fn:count(//question)

Komplexeres Beispiel, Auflisten aller Fragen aller Dokumente einer Galerie für KEduca, die weniger als zwei Antworten haben:

<noanswerquestions>
    {
    for $s in (fn:doc("lpi101.edugallery")//server/@address)
        for $d in (fn:doc($s)[//question[(count(true) + count(false)) <= 1]])
            return <doc src="{$s}">{
                    for $q in ($d//question[(count(true) + count(false)) <= 1])
                        return $q
                }</doc>
    }
</noanswerquestions>

Ein weiteres Beispiel (zeigt die Möglichkeit der indirekten Umstrukturierung durch XQuery)

  • Quell-Dokument:
<?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>
  • Ziel-Dokument:
<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>
  • Lösung in 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>

Implementierungen

  • eXist, open source, unterstützt XQuery Update, umfangreiche Bibliotheken zur Erstellung von Webanwendungen
  • Galax, frei verfügbar, unterstützt XQuery Update
  • BaseX, frei verfügbar, unterstützt XQuery Full-Text
  • Pathfinder, XQuery compiler für relationale Back-Ends; bildet zusammen mit MonetDB die XQuery-Implementierung MonetDB/XQuery
  • XQuery Live Demo, von der FLWOR-Foundation, basierend auf der XQuery-Implementierung Zorba

Weblinks


Wikimedia Foundation.

Игры ⚽ Нужно сделать НИР?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • FLWOR — The programming language XQuery defines FLWOR (pronounced as flower ) as an expression that supports iteration and binding of variables to intermediate results. FLWOR is an acronym standing for FOR, LET, WHERE, ORDER BY, RETURN. FLWOR is loosely… …   Wikipedia

  • XQuery — steht für XML Query Language und bezeichnet eine vom W3C spezifizierte Abfragesprache für XML Datenbanken. XQuery benutzt eine an XSLT, SQL und C angelehnte Syntax und verwendet XPath sowie XML Schema für sein Datenmodell und seine… …   Deutsch Wikipedia

  • FLWR — XQuery steht für XML Query Language und bezeichnet eine vom W3C spezifizierte Abfragesprache für XML Datenbanken. XQuery benutzt eine an XSLT, SQL und C angelehnte Syntax und verwendet XPath sowie XML Schema für sein Datenmodell und seine… …   Deutsch Wikipedia

  • XML Query Language — XQuery steht für XML Query Language und bezeichnet eine vom W3C spezifizierte Abfragesprache für XML Datenbanken. XQuery benutzt eine an XSLT, SQL und C angelehnte Syntax und verwendet XPath sowie XML Schema für sein Datenmodell und seine… …   Deutsch Wikipedia

  • XQUERY — steht für XML Query Language und bezeichnet eine vom W3C spezifizierte Abfragesprache für XML Datenbanken. XQuery benutzt eine an XSLT, SQL und C angelehnte Syntax und verwendet XPath sowie XML Schema für sein Datenmodell und seine… …   Deutsch Wikipedia

  • Xquery — steht für XML Query Language und bezeichnet eine vom W3C spezifizierte Abfragesprache für XML Datenbanken. XQuery benutzt eine an XSLT, SQL und C angelehnte Syntax und verwendet XPath sowie XML Schema für sein Datenmodell und seine… …   Deutsch Wikipedia

  • XQuery — est un langage de requête informatique permettant non seulement d extraire des informations d un document XML, ou d une collection de documents XML, mais également d effectuer des calculs complexes à partir des informations extraites et de… …   Wikipédia en Français

  • List comprehension — A list comprehension is a syntactic construct available in some programming languages for creating a list based on existing lists. It follows the form of the mathematical set builder notation (set comprehension) as distinct from the use of map… …   Wikipedia

  • XQuery — is a query language (with some programming language features) that is designed to query collections of XML data. It is semantically similar to SQL.XQuery 1.0 was developed by the XML Query working group of the W3C. The work was closely… …   Wikipedia

  • FLWR — XQuery XQuery est un langage de requête informatique permettant non seulement d extraire des informations d un document XML, ou d une collection de documents XML, mais également d effectuer des calculs complexes à partir des informations… …   Wikipédia en Français

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”