xml-anfragesprachen (schwerpunkt xquery). © prof. t. kudraß, htwk leipzig Übersicht anforderungen...
TRANSCRIPT
XML-Anfragesprachen(Schwerpunkt XQuery)
© Prof. T. Kudraß, HTWK Leipzig
Übersicht Anforderungen an XML-Anfragesprachen Stand der Entwicklung XPath Anfragesprache XQuery Weitere Anfragesprachen (XML-QL, XQL) XML und Änderungsoperationen XML und SQL Ausblick
© Prof. T. Kudraß, HTWK Leipzig
Allgemeine Anforderungen Ad-hoc-Formulierung
– Anfragen direkt, ohne Erstellung kompletter Programme
Deskriptivität– Umschreiben des gewünschten Ergebnisses, nicht
Konstruktionsweg Kompaktheit
– kompakte Notation, verwendbar in URLs Mengenorientiertheit
– Anfragen auf Mengen von Objekten und Dokumenten– Nicht nur auf einzelnen Objekten und XML-
Dokumenten oder –fragmenten operieren
© Prof. T. Kudraß, HTWK Leipzig
Allgemeine Anforderungen (2) Adäquatheit
– alle Konstruktoren des zugrundeliegenden Modells unterstützt
Orthogonalität– Sprachkonstrukte uneingeschränkt miteinander
kombinieren
Abgeschlossenheit– Resultat (XML) kann wieder als Eingabe (XML) einer
nächsten Anfrage dienen
Vollständigkeit– gemäß Datenmodell gespeicherte Informationen
lassen sich verlustfrei durch Query wiedergewinnen
© Prof. T. Kudraß, HTWK Leipzig
Allgemeine Anforderungen (3) Optimierbarkeit
– kleine Menge an Grundoperationen mit Optimierungsregeln
Effizienz– jede Operation wird durch Algorithmus effizient
umgesetzt Sicherheit
– syntaktisch korrekte Query liefert endliche Menge,– Anfrage terminiert
Eingeschränktheit– keine vollständige Programmiersprache Garantiert Optimierbarkeit, Effizienz und Sicherheit
© Prof. T. Kudraß, HTWK Leipzig
XML-Anforderungen (1) Einbettung
– Anfragen in XML einbetten oder als XML formulieren– XML-Fragmente in Anfrage fester Teil in Ergebnis
Server-Verarbeitung– Geeignet für Server-side Processing erfordert
Abgeschlossenheit, Kontextfreiheit Ordnungserhaltung (Order Preserving)
– Abfolge von Elementen, Schachtelungsreihenfolge– Vor allem bei mixed Content – Nicht für alle Anwendungen benötigt (mögliches
Abschalten aus Effizienzgründen)– Probleme bei relationaler Speicherung
© Prof. T. Kudraß, HTWK Leipzig
XML-Anforderungen (2) Hyperlinks
– Ausnutzen und Verfolgen von Links in ( ID/IDREF ) und zwischen ( XLink, XPointer ) Dokumenten
Flexible Typen– Verarbeiten von unbekannten oder wechselnden
Typen– Mechanismen zur expliziten Typkonvertierung– Unterstützung eines erweiterbaren und robusten
(fehlertoleranten) Typkonzepts Unterstützung des Zugriffs auf Metadaten und
Schemainformationen (gleiche Mittel) Berücksichtigung von Namensräumen Protokoll-Unabhängigkeit
© Prof. T. Kudraß, HTWK Leipzig
Grundoperationen Selektion (anhand von Inhalt, Struktur, Attributwert) Extraktion und Reduktion (vergleichbar Projektion) Kombination (Join) Restrukturierung von Elementen Aggregation (z.B. arithmetische Funktionen) Gruppierung (Schachtelung bzw. Entschachtelung von
Elementstrukturen) Volltextoperationen (literal bzw. Phrasen-,
Stammformsuche, etc.) Datenmanipulation
– über APIs wie DOM, SAX– Auch Änderungsoperationen über XML-Anfragesprache
© Prof. T. Kudraß, HTWK Leipzig
Stand der Entwicklung
© Prof. T. Kudraß, HTWK Leipzig
XPath 1.0 - Einführung W3C Recommendation vom Nov 1999
– siehe: http://www.w3.org/TR/xpath
Grundlage für XQuery, XSLT, weitere Standards
geht von abstrakter Baumstruktur des XML-Dokuments aus
dient zur Adressierung von Teilen eines Dokumentes
kompakte Nicht-XML-Syntax, keine vollständige QL
zur Selektion und Extraktion von Knotenmengen
© Prof. T. Kudraß, HTWK Leipzig
XPath 1.0 - Einführung Knotenarten
– 7 Knotenarten auf Basis des XML Information Set – ähnlich zu DOM
– Wichtigste: Wurzel, Element, Attribut, Text
Datentypen– atomare Werte: boolean, number, string– Knotenmengen (node-set)
Grundlegendes Konstrukt sind XPath-Ausdrücke– Pfadausdrücke (location paths)– logische und mathematische Verknüpfungen– Funktionsaufrufe– Relativ zu einem Kontext ausgewertet– Keine Variablenbindung
© Prof. T. Kudraß, HTWK Leipzig
XPath 1.0 - Pfadausdrücke XPath-Ausdrücke relativ zu einem Kontext ausgewertet Extraktion der interessierenden Bestandteile Selektion von Knotenmengen aufgrund ihrer Struktur
und den in ihnen enthaltenen Werten Formulierung von Bedingungen an diese Knotenmenge mehrere Steps, Kopplung mit “/“ Schritt (Location Step) axis::node-test[predicate]
– axis: Beziehung Kontextknoten u. zu selektierende Knoten– node-test: Knotentyp und Namen des zu sel. Knoten– predicate: Einschränkung best. Elemente durch Prädikate
© Prof. T. Kudraß, HTWK Leipzig
Navigationsachsen in XPath
Klettke/Meyer “XML & Datenbanken“
© Prof. T. Kudraß, HTWK Leipzig
Einschränken des Knotentyps- node(): alle Knoten
- text(): alle Textknoten
- *: alle Elementknoten
- comment(): Kommentarknoten
- Angabe eines Knotennamens
Knotentest in XPath
descendant::* alle untergeordneten Elemente des Kontextknotens
child::href alle Elemente vom Typ href
attribute::id Attribut id des Kontextknotens
Beispiele
Quelle ebd.
© Prof. T. Kudraß, HTWK Leipzig
Prädikate in XPath
Selektionsprädikate- logische Operatoren (and, or)
- Vergleichsoperatoren ( “<“ , “<=“ , “>“ , “>=“ , “=“ , “!=“ )
- Operationen auf numerischen Werten ( “+“ , “-“ , “*“ , div, mod )
- Vereinigung von Knotenmenge ( “|“ )
- Ändern der Auswertreihenfolge durch Klammerung von Teilausdrücke mit “(“ und “)“ )
Beispiele /descendant-or-self::node()/album/song[2]
//album/song[last()-1]/title
//hotel[zimmertyp/attribute::typ = ‘Doppelzimmer’]
/hotel/adresse/ort[@Name=“Leipzig“]
/child::Patient/self::*/child::Name/parent::*/attribute::PatientNr äquivalent zu: /Patient/./Name/../@PatientNr
© Prof. T. Kudraß, HTWK Leipzig
XQuery Überblick und Datenmodell Einfache Ausdrücke FLWR-Ausdrücke Erweiterte XQuery-Ausdrücke:
– Verbund– Gruppierung
Benutzerdefinierte Funktionen Erweiterte Konzepte
– Modulkonzept– XQuery Prolog
Verarbeitungskonzept Implementierungen
© Prof. T. Kudraß, HTWK Leipzig
Sprachüberblick W3C Working Draft vom Okt 2004 - (siehe:
http://www.w3.org/TR/xquery) geht aus Quilt hervor (inoffizieller Vorschlag des W3C),
basierend auf XPath, beeinflusst durch SQL, XML-QL Ausdrücke beliebig ineinander schachtelbar
– Elementkonstruktoren– Pfadausdrücke zur Selektion (wie XPath)– FLWOR-Ausdrücke (ähnlich SQL - SFW)– datenspezifische Operatoren, Standard - und selbstdefinierte
Funktionen– bedingte Anweisungen, Test von Datentypen, Typumwandlung– Verwendung von Quantoren: EVERY und SOME
© Prof. T. Kudraß, HTWK Leipzig
Datenmodell Dokument als Baumstruktur (XPath 1.0) XQuery nutzt künftigen XPath 2.0-Standard Modell basiert auf XPath 1.0 + Erweiterungen
– einzelne XML-Dokumente– wohlgeformte Fragmente eines Dokuments– Sequenzen von Dokumenten und Fragmenten als Wert eines
XQuery-Ausdrucks Objekt dieses Datenmodells ist geordnete Menge von
Knoten = Sequenz (Aneinanderreihung von atomaren Werten oder Knoten – ohne Schachtelung)
– Flach, d.h. Sequenz nur auf der obersten Ebene– Duplikate in Sequenz möglich– Elemente einer Sequenz sind sortiert und hinsichtlich Position
unterscheidbar Dualität von Elementen und Sequenz der Länge 1
(<X>) äquivalent zu <X/>
© Prof. T. Kudraß, HTWK Leipzig
Datenmodell (2) Funktionen zur Analyse und Modifikation
– Kommaoperator(1,<X>),(3) liefert: (1,<X>,3)
– to-Operator2 to 5 liefert: (2,3,4,5,)
– Eliminierung von Duplikatenfn:distinct-values((2,5,3,7,3,5,5)) liefert: (2,5,3,7)
Datentypen– allgemeinste Form eines Eintrags vom Typ item()– Einfache oder komplexe Datentypen – Sprachkonstrukte aus XML Schema (vgl. Typhierachie)
Atomisierung– XML-Dokument synonym mit zugehöriger Instanz des XQuery-
Datenmodells
© Prof. T. Kudraß, HTWK Leipzig
Unterschiede zu XPath 1.0 Grunddatentypen auf der Basis von XML Schema Teil 2 XPath 1.0 kennt nur Knotenmengen, boolesche,
numerische und Zeichenkettenwerte XPath 1.0 ist mengenorientiert (ohne Duplikate), XPath
2.0 basiert auf Sequenzen (Duplikate möglich) Unterstützung von Referenzen und
Dokumentkollektionen Unterscheidung von Wertegleichheit (XPath 1.0) und
Knotenidentität Wesentlich umfangreichere Funktionsbibliothek Weitere Ausdrucksarten, z.B. Bereichs Voranstellen von Variablen oder Funktionsaufrufen vor
Pfadausdrücken
© Prof. T. Kudraß, HTWK Leipzig
xs:E
NT
ITIE
S
benu
tze
rdef
inie
rte
Lis
ten
type
n u
nd
Ve
rein
igun
gs-
type
n
item xd
t:an
yAto
mic
Typ
e
xs:I
DR
EF
S
nod
exd
t:unt
yped
An
y
ben
utze
rde
finie
rte
ko
mpl
exe
Ty-
pen
xs:a
nyT
ype
xs:a
nyS
impl
eTyp
e
com
me
nt
elem
ent
docu
men
t
text
proc
ess
ing-
in-
stru
ctio
n
xs:N
MT
OK
EN
S
xdt:u
ntyp
edA
tom
ic
xs:d
ate
Tim
e xs:d
ate
xs:t
ime
xs:f
loat
xs:d
ura
tion
xs:y
ear
Mon
thD
urat
ion
xs:g
Ye
ar
xs:g
Ye
arM
ont
h
xs:d
ecim
al
xs:d
oub
le
xs:d
ayT
imeD
urat
ion
xs:g
Mon
thD
ay
xs:g
Day
xs:b
ase
64B
ina
ry
xs:b
ool
ean
xs:g
Mon
th
xs:h
exB
inar
y
xs:a
nyU
RI
xs:Q
Na
me
xs:N
OT
ATI
ON
xs:s
trin
g
xs:n
orm
aliz
edS
trin
g
xs:t
oke
n
xs:N
MT
OK
EN
xs:E
NT
ITY
xs:la
ngua
ge
xs:N
ame
xs:N
CN
ame
xs:I
D
xs:I
DR
EF
xs:lo
ng
xs:n
ega
tiveI
nte
ger
xs:n
onP
osi
tive
Inte
ger
xs:in
tege
r
xs:in
t
xs:s
hort
xs:u
nsi
gne
dLon
g
xs:n
onN
egat
ive
Inte
ger
xs:b
yte
xs:u
nsig
ned
Int
xs:u
nsig
ned
Sho
rt
xs:u
nsi
gne
dByt
e
xs:p
osi
tiveI
nte
ger
attr
ibut
e
XQuery Typhierachie
© Prof. T. Kudraß, HTWK Leipzig
Grundlagen Konstanten oder Literale
– Werte für einfache numerische und Zeichenkettenwerte (in Hochkommas)
– Beispiele: ‘Hotel Neptun‘, “12.34“ {-- xs:string --}123, -24, 0, +7 {-- xs:integer --}-24.0, 123.45, +.23 {-- xs:decimal --}-123.5e3, 200e6 {-- xs:double --}
Variablen: – Beispiele:
$name := “Wolfgang Lehner“LET $hotel := //hotel[typ=‘Pension‘]RETURN $hotel
Kommentare– An beliebiger Stelle, ohne Bedeutung– Syntax: geschachtelt durch ein Klammerpaar (: und :) – Beispiel: (: XQuery (: Kommentar :) !! :)– Orthogonal zu einem Kommentar im XML-Dokument
<!- - Kommentar im XML-Dokument - -!>
© Prof. T. Kudraß, HTWK Leipzig
Ausdrücke in XQuery Arithmetische Ausdrücke
– Funktionen und Operatoren Vergleichsausdrücke
– Wertevergleich– Allgemeiner Vergleich– Knotenvergleich (Knotenidentität, Vergleich der relativen
Positionierung) Logische Ausdrücke
– fn:true(), fn:false(), fn:not() Pfadausdrücke
– Basieren auf XPath 2.0 (Erweiterungen gegenüber 1.0) FLWOR-Ausdrücke Konditionale Ausdrücke Quantifizierende Ausdrücke
– existenzielle Quantifizierung– universelle Quantifizierung
© Prof. T. Kudraß, HTWK Leipzig
Ausdrücke in XQuery (1) Arithmetische Ausdrücke
– Mit arithmetischen Operationen– Auswertereihefolge durch Klammerung beeinflussen– Beispiel: ($preis-10) DIV 100
Vergleichsausdrücke (4 Vergleichsoperatoren)– allgemein mit Sequenzen: =, !=, <, <=, >, >=– einfache Wertvergleiche zwischen elementaren Werten:
EQ, NE, LT, LE, GT, GE– Vergleich der Knotenidentität:
== (identisch), !== (nicht identisch) Beispiel:
$hotel[name = ’Neptun’] == $hotel[@id = ‘4311’]
– Vergleich der Abfolge von Knoten bezüglich der Dokumentordnung mit << und >> und in Bezug auf die Vorgänger- und Nachfolgerbeziehung mit FOLLOWS und PRECEDES
logische Ausdrücke: – AND, OR, NOT– Beispiel: NOT($hotel/name EQ $restaurant/name)
Pfadausdrücke– Basieren auf XPath 2.0 (Erweiterungen gegenüber 1.0)
© Prof. T. Kudraß, HTWK Leipzig
FLWOR-Ausdrücke FLWOR-Ausdruck
– gesprochen wie engl. “Flower“ – Basis für Anfragen an XML-Datenbanken– analog zu SELECT-FROM-WHERE in SQL– steht als Abkürzung von for-let-where-order by-return
Klauseln eines FLWOR-Ausdrucks
for/let where returnorder by
Bindung vonVariablen
Anwendungvon Prädikatenzur Filterung
Sortierung Konstruktiondes Ergebnis-dokumentes
Eingangs-sequenzen
Ausgabe-sequenz
FLWOR-Ausdruck
© Prof. T. Kudraß, HTWK Leipzig
Struktur eines FLWOR-AusdrucksFLWORExpr::=
(ForClause | LetClause)+ WhereClause? OrderByClause? RETURN ExprSingle
ForClause::=FOR $VarName TypeDeclaration? PositionalVar? IN ExprSingle (, $VarName TypeDeclaration? PositionalVar? IN ExprSingle)*
LetClause::=LET $VarName TypeDeclaration? := ExprSingle (, $VarName TypeDeclaration? := ExprSingle)*
TypeDeclaration::= AS SequenceTypePositionalVar::= AT $VarNameWhereClause::= WHERE ExprOrderByClause::=
(ORDER BY | STABLE ORDER BY) OrderSpecListOrderSpecList::= OrderSpec (, OrderSpec)*OrderSpec::= ExprSingle OrderModifierOrderModifier::= (ASCENDING | DESCENDING)? ((EMPTY
GREATEST) | EMPTY LEAST))? (COLLATION StringLiteral)?
© Prof. T. Kudraß, HTWK Leipzig
Variablen Nach der erfolgten Bindung sind die Werte nicht mehr
änderbar Variablenbindung nur innerhalb des aktuellen und aller
eingeschlossenen Anfrageausdrücke sichtbar Wird Ausdruck verlassen, ist Variable ungebunden Zugriff auf ungebundenen Variablen Ausnahme Wird hingegen Variable mehrfach gebunden, ist immer
unmittelbar zuvor erfolgte Bindung sichtbar Typ einer Variablen ergibt sich aus Bindung Variablenbindung erfolgt in FOR- und LET-Ausdrücken
© Prof. T. Kudraß, HTWK Leipzig
LET-Klausel Bindet Menge von Werten, die bei Auswertung eines
Ausdrucks expr entstehen geschlossen an eine Variable $var
Im einfachsten Fall folgt nach der LET-Klausel ein RETURN-Ausdruck
Liefert den Variableninhalt als Ergebnis Beispiel:
LET $z := //zimmertypRETURN $z
Abarbeitung in 3 Schritten:1. Werte den XPath-Ausdruck //zimmertyp aus2. Weise die resultierende Knotenmenge an die Variable
$z zu (Variablenbindung)3. Gebe die gesamte Sequenz von Knoten zurück
© Prof. T. Kudraß, HTWK Leipzig
FOR-Klausel Für jedes Element der Ergebnismenge erfolgt eine Bindung an
$var Wie bei LET können mehrere Variablen gebunden werden Variablen für alle untergeordneten Ausdrücke sichtbar Beispiel:
FOR $z IN //zimmertypRETURN $z
Abarbeitung anders als bei LET – $z wird jeweils an Elemente der Sequenz (Auswertung von
//zimmertyp) gebunden – Bindung erfolgt mehrfach, für jeden Zimmertyp genau einmal– Nachfolgende Klauseln werden für jede Iteration und Bindung einmal
ausgewertet– RETURN wird für jeden Schritt ausgewertet, Resultat zu einem
Zwischenergebnis hinzugefügt– Aufsummiertes Gesamtergebnis von RETURN wird am
Schleifenende zurückgegeben
© Prof. T. Kudraß, HTWK Leipzig
Beispiel
<hotel name=“Hotel Neptun“><zimmertyp typ=“EZ“ preis=“180“ währung=“EUR“/><foto href=“neptun01.jpeg“/>
</hotel>
<hotel name=“Hotel Hübner“><zimmertyp typ=“EZ“ preis=“75“ währung =“EUR“/><zimmertyp typ =“DZ“ preis =“90“ währung =“EUR“
</hotel>
<hotel name=“Pension Dräger“><foto href=“bild-pd01.jpeg“/><foto href=“bild-pd02.jpeg“/>
</hotel>
© Prof. T. Kudraß, HTWK Leipzig
Beispiel (Forts.)
XQuery-Anfrage
FOR $hotel IN //hotel
RETURN $hotel/foto
Ergebnis:
<foto href=“neptun01.jpeg“/>
<foto href=“bild-pd01.jpeg“/>
<foto href=“bild-pd02.jpeg“/>
© Prof. T. Kudraß, HTWK Leipzig
Vergleich LET- und FOR-Klauseln
FOR $x IN (<Arzt/>,<Pfleger/>)LET $y := (<Operationssaal/>,<Station/>)RETURN(<Berufsgruppe>{ $x }</Berufsgruppe> <Arbeitsort>{ $y }</Arbeitsort>)
liefert als Ergebnis<Berufsgruppe><Arzt/></Berufsgruppe> <Arbeitsort><Operationssaal/><Station/></Arbeitsort>
<Berufsgruppe><Pfleger/></Berufsgruppe> <Arbeitsort><Operationssaal/><Station/></Arbeitsort>
© Prof. T. Kudraß, HTWK Leipzig
Geschachtelte FOR-Klauseln<billighotels> {
FOR $h IN //hotel
FOR $z IN $h/zimmertyp
WHERE $z/@preis <= 100
RETURN <hotel>
<name>{ $h/@name }</name>
<preis> { $z/@preis }</preis>
</hotel> } </billighotels>
Ergebnis:
<billighotels>
<hotel><name>…</name><preis>…</preis></hotel>
</billighotels>
© Prof. T. Kudraß, HTWK Leipzig
Geschachtelte FOR-Klauseln (2)<billighotels> {
FOR $h IN //hotel
RETURN <hotel name={ $h/@name }> {
FOR $z IN $h/zimmertyp
WHERE $z/@preis <= 100
RETURN <preis>{ $z/@preis }</preis>
} </hotel> } </billighotels>
Ergebnis:
<billighotels>
<hotel name=“Hotel Hübner“>
<preis>…</preis>
</hotel>…
</billighotels>
© Prof. T. Kudraß, HTWK Leipzig
WHERE-Klausel
FOR $p AT $i IN fn:doc(“Klinik.xml“)//PflegerWHERE
fn:not($p/Geburtsdatum > xs:date(“1974-01-01“))AND $i MOD 5 = 0AND fn:count($p//Zertifikat) > 2
RETURN<Persoaleintrag LfdNR={$i idiv 5}> {$p/Name, $p/@Station}</Personaleintrag>
WHERE-Klausel zur Angabe eines Selektionsprädikats mit weitergehendenFiltermöglichkeiten in Bezug auf Gruppen (ähnlich zu HAVING)
Beispiel: Suche Pflegepersonal das nicht nach 1974 geboren ist Betrachte nur jeden 5. Pfleger Suche Pfleger, die 3 oder mehr Zertifikate (zum Nachweis bestimmter Fähigkeiten besitzen)
© Prof. T. Kudraß, HTWK Leipzig
ORDER BY-Klausel Explizite Angabe einer Sortierung für die Elemente einer Sequenz Spezifische Sortierordnungen
– Global im Prolog einer XQuery– Lokal zusätzlich in der ORDER BY-Klausel
2 wichtige Eigenschaften der ORDER BY-Klausel– Wenn keine eindeutige Reihenfolge, so ist Anordnung der Duplikate
implementierungsabhängig, Angabe von STABLE erzwingt die Einhaltung der Dokumentreihenfolge
– Wenn Eigenschaften, nach denen sortiert wird, nicht existieren: Einordnung dieser Einträge explizit steuern mit Sortierungsmodifikator EMPTY GREATEST bzw. EMPTY LEAST
Beispiele:
$hotel/zimmer[preis<100] ORDER BY preis ASCENDING
Zusätzlich zum Beispiel für WHERE-Klausel:
ORDER BY $p//Wohnort EMPTY LEAST,fn:get-year-from-date($p/Geburtsdatum) DESCENDING
© Prof. T. Kudraß, HTWK Leipzig
Elementkonstruktoren (RETURN) Literales XML wird in das Ergebnis übernommen, ohne modifiziert zu werden
<zimmer typ=“DZ“> <ausstattung>TV</ausstattung></zimmer>
XML mit geschachtelten Ausdrücken erlaubt es, Element- und Attributinhalte durch XQuery-Ausdrücke berechnen zu lassen
<zimmer typ=“{$z/@typ}“> $zaus UNION $haus</zimmer>
XML mit berechneten Element- und Attributnamen bietet die Möglichkeit, die Bezeichner von XML-Elementen und Attributen durch XQuery-Ausdrücke zu berechnen
ELEMENT {$z} { ATTRIBUTE {$t} {EZ} ELEMENT {$a} {“Minibar“}}
© Prof. T. Kudraß, HTWK Leipzig
Verbundoperationen Verknüpfung von Datenbeständen aus
unterschiedlichen Dokumenten/Dokumentteilen– durch Wertegleichheit (relationale Seele)– durch Verfolgung von Referenzen (objektorientierte Seele)
Verbundprädikat– in WHERE-Klausel eines FLWOR-Ausdrucks– in Pfadausdruck eines Verbundpartners
Verfolgung von Referenzen (ID/IDREF)– Funktion fn:id() liefert Elemente, deren ID-Attributwert
mindestens einem der übergebenen IDREF-Werte entsprechen (Dereferenzierung)
– Funktion fn:idref() liefert Elemente, die auf die übergebenen Werte verweisen
– Referenzen in Form von XPointer/XLink nicht über Dokumentgrenzen hinweg auflösbar
Symmetrische und einseitige äußere Verbunde intuitiv formulierbar, vollständiger äußerer Verbund schwierig
© Prof. T. Kudraß, HTWK Leipzig
Verbund – Beispiel 1<prospect> {
FOR $h IN fn:doc(“hotels.xml“)//hotel, $z IN $h/zimmertyp, $f IN fn:doc(“fotos.xml“) //hotel[name = $h/name]//zimmerfoto,
WHERE $f/zimmertyp = $z/typRETURN <hotelzimmer {
$h/name, $z/typ, $z/beschreibung, $f/foto } </hotelzimmer>ORDER BY (name,typ)
} </prospect>
Ergebnis: Liste von Hotelzimmern mit Angaben zu Hotel, Zimmertyp,
Zimmerbeschreibung und zugehöriges Foto Hotels fehlen, wenn keine Informationen zu Zimmern oder das zugehörige
Foto fehlt
© Prof. T. Kudraß, HTWK Leipzig
Verbund – Beispiel 2<prospect> {
FOR $h IN fn:doc(“hotels.xml“)//hotelRETURN <hotel> { $h/name, $h/beschreibung, FOR $z IN $h/zimmertyp,
$f IN fn:doc(“fotos.xml“) //hotel[name = $h/name]/zimmerfoto
WHERE $f/zimmertyp = $z/typ
RETURN<hotelzimmer> $z/typ, $z/beschreibung, $f/foto</hotelzimmer>
ORDER BY typ } </hotel> ORDER BY name
} </prospect>Ergebnis: Leere Sequenz für Hotels ohne Zimmerinformationen Hotelname und Beschreibung trotzdem im Resultat (entspricht Outer Join)
© Prof. T. Kudraß, HTWK Leipzig
Verbund – Verfolgung von Referenzen
FOR $s IN fn:doc(“Klinik.xml“)//Station,
LET $p := fn:id($s/@Leitung)
RETURN
<Station>
{$s/Name}
<Leitung>{ $p/Name }</Leitung>
</Station>
Ergebnis: Zuordnung der leitenden Person (Name, Vorname) an jede Station im
Krankenhaus
Beispiel:
© Prof. T. Kudraß, HTWK Leipzig
Gruppierung
Beispiel: Berechnung des Durchschnittsalters pro Berufsgruppe (Arzt oder Pfleger)
Variante 1: Gruppierung entlang der XML-Hierarchie
<MedizinischesPersonal>{ FOR $p IN fn:doc(“…“)//MedizinischesPersonal/* LET $x := $p//Alter RETURN ELEMENT { fn:node-name($p) }
{ <Alter>{ fn:avg($x) }</Alter> }</MedizinischesPersonal>
Variante 2: Gruppierung nach Wertegleichheit
<MedizinischesPersonal>{ FOR $b IN fn:distinct-values(fn:doc(“…“)//Beruf/text()) LET $x := fn:doc(“…“)//Alter[../Beruf/text() = $b] RETURN ELEMENT {$b}
{<Alter>{ fn:avg($x) }</Alter>) }</MedizinischesPersonal>
© Prof. T. Kudraß, HTWK Leipzig
Gruppierung (Forts.)
Variante 3: Gruppierung über Elementbezeichner
<MedizinischesPersonal>{ FOR $b IN fn:distinct-values(for $i IN
fn:doc(“…“)//Person/(Arzt|Pfleger)RETURN fn:node-name($i))
LET $x := fn:doc(“…“)//Alter[../fn:node-name(.) = $b]
RETURN ELEMENT {$b}
{ <Alter>{ fn:avg($x) }</Alter> }}</MedizinischesPersonal>
© Prof. T. Kudraß, HTWK Leipzig
Aggregationsfunktionen fn:count()
liefert die Anzahl der Elemente der übergebenen Sequenz zurück fn:avg()
liefert den durchschnittlichen Wert aller Elemente der übergebenen Sequenzsum($arg) div count($arg)
fn:max()liefert den wertemäßig größten Wert optional bezüglich einer Sortierordnung zurück
fn:min()liefert den wertemäßig kleinsten Wert optional bezüglich einer Sortierordnung zurück
fn:sum()liefert den summarischen Wert aller in der Sequenz enthaltenen Elementwerte zurück; wird der zweite Parameter nicht angegeben, so wird der Wert 0.0E0 bei einer leeren Sequenz zurückgeliefert; andernfalls der Wert des zweiten Parameters
© Prof. T. Kudraß, HTWK Leipzig
Konditionale Ausdrücke Syntax
IF (expr) THEN expr_1 ELSE expr_2 Beispiel Hotel-Datenbank:
Gewähre Nachlass von 10%, wenn ein Hotelzimmer länger als 5 Tage belegt wird
LET $tage := ($r/abreise - $r/anreise),
$zimmer := fn:id(zimmertyp)
RETURN
IF ($tage > 5)
THEN $tage*$zimmer/preis*0.9
ELSE $tage*$zimmer/preis
© Prof. T. Kudraß, HTWK Leipzig
Quantifizierende Ausdrücke Syntax
[SOME | EVERY ] var IN expr_1 SATISFIES expr_2 Beispiel 1
Namen der Hotels, die unter anderem auch Einzelzimmer anbieten FOR $hotel IN fn:doc(“hotels.xml“)//hotelWHERE SOME $z IN $hotel/zimmer/typ SATISFIES $z = “EZ“RETURN $hotel/name
Beispiel 2Suche Appartementhotels, d.h. Hotels, die ausschließlich Appartements anbietenFOR $hotel IN fn:doc(“hotels.xml“)//hotelWHERE EVERY $z IN $hotel/zimmer/typ SATISFIES $z = “Appartement“RETURN $hotel/name
© Prof. T. Kudraß, HTWK Leipzig
Funktionen in XQuery Funktionen auf numerischen und
Booleschen Werten Funktionen auf Zeichenketten
– Vergleich– Manipulation– Auswertung regulärer Ausdrücke
Funktionen auf Zeitangaben– Vergleichs- und Substraktions-/Additionsoperatoren– Funktionen zur Extraktion von Komponenten– Zeitangaben in unterschiedlichen Zeitzonen
Benutzerdefinierte Funktionen
© Prof. T. Kudraß, HTWK Leipzig
Benutzerdefinierte Funktionen (Beispiel)
declare function factorial($n as xs:integer) as xs:integer { return( if ($n eq 0) then 1 else $n * factorial($n - 1) )}<results>
<desc> Factorial of 5 </desc><value> { factorial( 5 ) } </value>
</results>
declare function factorial($n as xs:integer) as xs:integer { return( if ($n eq 0) then 1 else $n * factorial($n - 1) )}<results>
<desc> Factorial of 5 </desc><value> { factorial( 5 ) } </value>
</results>
<results>
<desc> Factorial of 5 </desc>
<value> 120 </value>
</results>
© Prof. T. Kudraß, HTWK Leipzig
Verarbeitungs-konzept von XQuery
© Prof. T. Kudraß, HTWK Leipzig
Statische Analyse und Typprüfung Statische Analyse (erste Phase der Auswertung)
– Parsing und Analyse des XQuery-Hauptmoduls– Aktualisierung des statischen Kontextes– Überführung der Anfrage in einen Operatorbaum– Fehlerprüfung: Existenz von Typnamen, Namens-
raumpräffixen, Funktionsnamen und Variablennamen
Statische Typprüfung Prepare / Execute
– Übersetzung der Anfrage in einen ausführbaren Anfragegraphen
– Ausführung der Anfrage
© Prof. T. Kudraß, HTWK Leipzig
Statischer Kontext Bekannte Namensräume
– vordefiniert– Im XQuery Prolog enthalten
Vorbelegung für Element- und Funktionsnamensräume
Schemadefinitionen– Typen aus XML Schema und XQuery
Variablendefinitionen Funktionen Vorbelegung für Sortierordnung Validierungsmodus
© Prof. T. Kudraß, HTWK Leipzig
Dynamische Ausführung Dynamischer Kontext
– Aufbau während der Anfrageausführung– Verwaltung aller aktuellen Variablenbindungen
(Variablenname-Wert-Paare)– Fokus („focus“)
Aktuell betrachteter Eintrag („context item“) (.-Operator) Eintragsposition („context position“) (fn:position()) Anzahl der Einträge der aktuellen Sequemz („context size“)fn:last()
– Datum und Uhrzeit– Zeitzone
© Prof. T. Kudraß, HTWK Leipzig
Aufbau des Ergebnisdokuments Serialisierung
– XQuery-Anfrage resultiert in einer Sequenz und somit in einer Instanz des XML-Datenmodells
– Serialisierung = Überführung der Instanz eines XML-Datenmodells in eine Zeichenkette (XML-Dokument)
– Transformation / Normalisierung– Parameter zur Beeinflussung der Serialisierung
Encoding des Ergebnisses Media Type des Ergebnisses
– Anmerkung Ergebnis einer XQuery muss nicht als XML serialisiert
werden, d.h. weitere Methoden neben xml
© Prof. T. Kudraß, HTWK Leipzig
XQuery-Implementierungen
Aktuelle Liste: http://www.w3.org/XML/Query#implementations
© Prof. T. Kudraß, HTWK Leipzig
SQL/XML 2003 verabschiedet (ISO/IEC 9075-14:2003 ) - ( siehe:
[6] ) ANSI und ISO Standard, Support um XML in Umgebung
einer SQL-Datenbank zu nutzen Titel: Information technology - Database languages -
SQL - Part 14: XML- Related Specifications (SQL/XML) – ca. $200 (ca. 360 Seiten)
entwickelt und implementiert von Oracle, MS, IBM, Sybase, ...
wird ab Oracle9i Release2 unterstützt macht es möglich XML-Files in SQL-db zu speichern,
Anfragen mit XQuery und XPath zu stellen, und existierende SQL-Daten als XML zu extrahieren
© Prof. T. Kudraß, HTWK Leipzig
XML-Update XML-Update Sprache vom Sep 2000 - ( siehe:
[7.1] ) basiert auf XPath beschreibt welche Änderungen in XML-File
gemacht werden diese Änderungen werden als XML formuliert ist kein W3C- oder ISO-Standard, sondern
XML:DB Initiative praktisch, nicht so gut spezifiziert, ex. DTD der
Syntax Popularität in einigen Implementierungen
gefunden - [7.2]
© Prof. T. Kudraß, HTWK Leipzig
Literatur[1] “XML&Datenbanken” M.Klettke, H.Meyer, dpunkt.verlag, 2002
[2] XML-QL: http://www.w3.org/TR/NOTE-xml-ql
[3] XQL: http://www.w3.org/TandS/QL/QL98/pp/xql.html
[4] XPath: http://www.w3.org/TR/xpath
[5] XQuery: http://www.w3.org/XML/Queryhttp://www.w3.org/TR/xpath-datamodel/
[6] XML/SQL: http://www.sqlx.org/http://www.oracle.com/technology/oramag/oracle/03-may/o33xml.html
[7] XUpdate: http://xmldb-org.sourceforge.net/xupdate/index.htmlhttp://uche.ogbuji.net/tech/akara/nodes/2004-09-30/xupdate
[8] “XML – Von Anfang an”, rororo, 2003
[9] “Essential XML”, D.Box, A.Skonnard, Addison-Wesley, 2001
[10] “XSL und XPath”, M.Bach, Addison-Wesley, 2000[11] “XQuery – Einführung und fortgeschrittene Methoden“ W.Lehner, H. Schöning, dpunkt Verlag, 2003.
[12] “XQuery – ein Überblick“ W.Lehner, H.Schöning, in Datenbank-Spektrum 11/2004.