Inhalt Motivation XML Anfragesprachen XML Anfragesprachen W3C

Werbung
Inhalt
• Motivation / Einführung
• XQuery Datenmodell
181.139 VU Semistrukturierte Daten 2
• Ausdrücke (Expressions)
• Beispiele: relationale Datenbanken
XQuery (Teil 1)
23.3.2006
• XQuery Moduln und Funktionsdefinitionen
• Built-in Funktionen
Reinhard Pichler
• XQuery XML-Syntax (XQueryX)
Motivation
Einführung
XML Anfragesprachen
• XPath:
• Bedeutung von XML:
– wichtig als Basis für jegliche XML-Anfragesprachen
– Daten im Web
– Quasi-Standard für Datenaustausch
– Aber XPath alleine ist nicht genügend ausdrucksstark.
• Wesentliche Unterschiede zu relationalen DBs, z.B.:
•
–
–
–
–
–
• XSLT:
weniger regelmäßige Struktur
beliebig tiefe Schachtelung möglich
Metadaten („markup“) als Teil der Daten
Dokumentenordnung signifikant
etc. (vgl. VU SSD1)
– Sehr gut geeignet für Transformation XML -> XML oder
XML -> HTML. Die Benutzerakzeptanz für typische
Datenbank-Anwendungen ist hingegen fraglich.
– Eingeschränkte Optimierungsmöglichkeiten: XSLT-Prozessor
realisiert das XSLT-processing model. Bei DB-Sprachen wie
SQL ist wesentlich mehr Spielraum für Optimierungen.
=> Suche nach eigener XML-Anfragesprache
W3C
XML Anfragesprachen
•
World Wide Web Consortium
–
–
–
–
• Mehrere Vorschläge in der Literatur:
– Lorel: Stanford (Abiteboul et al.), 1997
gegründet von CERN, MIT und anderen
ca. 200 Mitglieder (Firmen)
Aufgabe: Standardisierung von Webformaten
nicht normativ: gibt nur "recommendations"
heraus, keine ISO artigen Standards
Note
Working Draft
– XQL („XML Query Language): 1998
– XML-QL: AT&T (Fernandez, Suciu, et al.), 1998
•
Sechs Arten von Dokumenten
–
– Quilt: IBM (Chamberlin et al.), 2000
–
• W3C: “XQuery 1.0, An XML Query Language“
–
– Candidate Recommendation (noch nicht „fertig“)
–
– beeinflusst von SQL
–
– Kompatibilität mit XSLT, XML Schema und vor allem XPath
–
– 2 Notationen: „human-oriented“ und als XML-Dokument
Note
• ist nicht Bestandteil des Standardisierungsprozesses
• keine Absichtserklärung des W3C steht dahinter
Working Draft (WD)
• dokumentieren aktuellen Diskussionsstand
Last Call WD
• wenn festgelegte Ziele erreicht
Candidate Recommendation (CR)
• Einreichungsbestätigung
Proposed Recommendation
• Erweiterung; Implementierungen der Bestandteile
Recommendation
• offizieller W3C Standard
Last Call WD
CR
PR
Recommendation
1
Einige W3C Dokumente
XQuery Systeme
(candidate recommendations / working drafts)
• XQuery 1.0: An XML Query Language
http://www.w3.org/TR/xquery
• XQuery 1.0 and XPath 2.0 Functions and Operators
http://www.w3.org/TR/xpath-functions
• XQuery 1.0 and XPath 2.0 Data Model
http://www.w3.org/TR/xpath-datamodel
• XQuery 1.0 and XPath 2.0 Formal Semantics
http://www.w3.org/TR/xquery-semantics
• XML Syntax for XQuery 1.0 (XQueryX)
http://www.w3.org/TR/xqueryx
• XML Query Use Cases
http://www.w3.org/TR/xquery-use-cases
• Übersicht: http://www.w3.org/XML/Query
• XQuery-Systeme, z.B.:
–
–
–
–
Nux (Berkeley Lab): http://dsd.lbl.gov/nux/
Qexo (GNU): http://www.gnu.org/software/qexo/
Galax (Fernandez/Simeon): http://www.galaxquery.org/
Saxon (Michael Kay): http://www.saxonica.com/
• XQuery Support in DB-Systemen, z.B.:
– Oracle Database 10g Release 2
– Microsoft: SQL Server 2005 Express
– XML-native DBs: Tamino, Berkeley DB XML 2.0
In der VL: Saxon 8 bzw.
XML Spy ( http://www.altova.com )
Charakterisierung von XQuery
• XQuery ist eine funktionale Programmiersprache:
– Basis-Konstrukt: Expression
– Expressions können beliebig geschachtelt werden
– Jede Expression hat einen Wert
– Keine Seiteneffekte
• XQuery ist streng-typisiert:
– Alle Operanden, Operatoren, Funktionen müssen mit einem
erwarteten Typ übereinstimmen (bzw. es muss möglich sein,
Typkonvertierungen zum erwarteten Typ durchzuführen).
• XPath 2.0:
– Wesentliche Erweiterung gegenüber XPath 1.0
XQuery Modul
• Ein XQuery Modul besteht aus Prolog und Query Body
• Der Prolog enthält Deklarationen (Importe, Variablen,
Funktionen, etc.)
• Der Query Body enthält genau 1 Expression.
• Kommentare:
– Im Prolog oder im Query Body
– Geklammert durch (: :)
– Kommentare können geschachtelt sein.
Beispiel 1
• XPath 2.0:
– Kein Prolog, gewisse Einschränkungen bei Expressions.
– Teilmenge von XQuery 1.0
Auswertung von Expressions
Namen in XQuery
• Immer relativ zu einem Expression Context, d.h.: alle
Informationen, die einen Einfluss auf das Ergebnis haben.
• Namen in XQuery sind case-sensitive,
mit optionalem Namespace-Prefix.
• 2 Arten von Contexts:
• Namespace-Prefixes können in XQuery definiert werden.
– Static context: Informationen, die bereits bei der statischen
Analyse der XQuery expression (unabhängig vom XMLInput) bekannt sind, z.B.:
bekannte Variablen/Funktionen/Namespaces/Schema-Definitionen,
statischer Variablentyp, default element/type/function namespace, etc.
– Dynamic context: Informationen, die erst zum Zeitpunkt
der Auswertung bekannt sind, z.B.:
context item (= Verallgemeinerung von Kontextknoten), context
position/size, Variablenbindungen, current dateTime, etc.
• Außerdem gibt es in XQuery vordefinierte Prefixes:
– xml = http://www.w3.org/XML/1998/namespace
– xs = http://www.w3.org/2001/XMLSchema
– xsi = http://www.w3.org/2001/XMLSchema-instance
– fn = http://www.w3.org/2005/xpath-functions
– xdt = http://www.w3.org/2005/xpath-datatypes
– local = http://www.w3.org/2005/xquery-local-functions
2
Datentypen in
XQuery
Schema Validierung
Datenmodell
• Jeder Wert ist eine Sequence.
• Eine Sequence ist eine geordnete Sammlung von 0 oder mehr
Items.
• Wiederholung von Items möglich, z.B.: (17, 18, 17)
• Keine Unterscheidung zwischen einem einzelnen Item und
einer Sequence der Länge 1, d.h.: (x) und x sind identisch.
• Ein Item ist entweder ein atomarer Wert oder ein Knoten
(also insbesondere keine Schachteltung von Sequences).
• Atomarer Wert: einer der 44 built-in types von XML Schema
oder ein davon abgeleiteter user-defined type.
• Jeder Knoten ist von einem der folgenden 7 Typen:
document node, element node, attribute node, text node,
comment node, processing-instruction node, namespace node
Wichtige Knoteneigenschaften
Node Identity:
z.B.: 2 Knoten <a>17</a> und <a>17</a> sind nicht identisch
(trotz gleichem Namen und gleichem Inhalt).
String value eines Knoten (vom Typ xs:string):
• entspricht der built-in Funktion fn:string
• Im wesentlichen wie in XPath 1.0 definiert (für die versch. Arten von
Knoten, z.B.: bei document/element Knoten: Konkatenation aller
descendant text nodes in document order).
Typed value:
• Input Dokumente werden gegen Schema validiert, um sie als
„XQuery Data Model Instance“ (= Wert + Typinformation)
darzustellen.
• Validierung gegen XSD oder DTD
• Jeder element / attribute node erhält „type annotation“.
• Falls für einen Knoten kein Schema bekannt ist:
– Attribute node erhält Typ „xdt:untypedAtomic“
– Element node erhält Typ „xdt:untyped“
• Innerhalb einer XQuery expression kann Validierung eines
document/element Knoten mittels validate-expression
erzwungen werden.
Beispiele:
• attribute node mit string value “0030“ und type annotation “xs:integer”
=> typed value = integer Wert 30
• attribute node mit string value “xx yy zz“ und type annotation
“xs:IDREFS” => typed value = sequence (“xx“, “yy“, “zz“)
(jeweils vom Typ “xs:IDREF”).
• element node mit simple content: wie bei attribute node
z.B.: string value “74.95“ und type annotation “xs:decimal”
=> typed value = decimal Wert 74.95
• element node mit mixed/empty content:
=> typed value entspricht string value
• element node mit element-only content:
=> typed value = undefined
• Sequence von atomaren Werten
• entspricht der built-in Funktion fn:data
• hängt von “type annotation“ des Knoten ab
Effective Boolean Value
Idee: Viele Ausdrücke erwarten bool‘schen Wert, z.B.:
• Operanden von and, or, not
• Filterbedingungen (Prädikate, where-Klauseln)
• Bedingungen bei if, some, every
Typkonvertierung nach xs:boolean, z.B.:
•
•
•
•
•
Empty sequence: false
Sequence dessen erstes Item ein Node ist: true
String: zero length <=> false
Number: 0 bzw. NaN <=> false
für die meisten Typen (z.B.: Datum, Zeit, etc.): undefiniert
Typ-Angaben in XQuery
• An verschiedenen Stellen in XQuery-Expressions
sind Typ-Angaben möglich bzw. erforderlich, z.B.:
– Parameter/Resultat von user-defined Funktionen
– Spezielle Ausdrücke wie instance of, cast as,
castable as, typeswitch, treat as
• XQuery-Syntax für Typ-Angaben: “Sequence Type“
– Definiert mittels Angabe des “Item Type“ und eventuell
eines „occurrence indicator“ (?, *, +)
– Item Type: Node oder atomic type
– Atomic Type: built-in Type von XML Schema oder davon
abgeleiteter user-defined Type
3
Beispiele
Sequence Type Declaration What it matches
empty()
empty sequence, written as ()
item()+
sequence of one or more nodes or atomic
values
xs:integer
single item of built-in type xs:integer (or
a schema type derived from xs:integer)
node()*
sequence of zero or more nodes of any kind
attribute()?
0 or 1 attribute node
element()
any element node
element(po:shipto,
po:address)
element node of name po:shipto and type
annotation po:address (or a schema type
derived from po:address)
element(customer)
element node of name customer with any
type annotation
XQuery
TypenHierarchie
Beispiele für Node Angaben
Beispiele für Element Angaben
Item Type Declaration
What it matches
Item Type Declaration
What it matches
node()
any node
element() or element(*)
any single element node
text()
any text node
element(person)
any element node of name person
processing-instruction()
any processing-instruction node
element(person, surgeon)
processing-instruction(
xml-stylesheet)
any processing instruction node named
“xml-stylesheet”
any non-nilled element node of name
“person” and type annotation “surgeon” (or
derived from “surgeon”)
comment()
any comment node
element(person, surgeon?)
document-node()
any document node
document-node(
element(customer))
any document node that contains an
element such that this element is matched
by element(customer)
any nilled or non-nilled element node of
name “person” and type annotation
“surgeon” (or derived from “surgeon”)
element(*, surgeon?)
any nilled or non-nilled element node of
type annotation surgeon (or derived from
surgeon) and any name
element(), attribute: see following slides
Beispiele für Attribute Angaben
Item Type Declaration
What it matches
attribute() or attribute(*)
any single attribute node
attribute(price)
any attribute node whose name is price
attribute(price, currency)
any attribute node whose name is price
and whose type annotation is currency
(or derived from currency)
attribute(*, xs:decimal)
any attribute node whose type annotation
is xs:decimal (or derived from it)
attribute(*, currency)
attribute node of type annotation
currency (or derived from currency)
•
•
•
•
•
•
•
•
•
•
•
•
•
Expressions
Primary Expressions
Sequence Expressions
Path Expressions
Arithmetic Expressions
Comparison Expressions
nicht in XPath 2.0:
Logical Expressions
• constructors
Constructors
FLWOR Expressions (“flower”) • “FLWOR”: nur “FR”
Ordered / Unordered Expressions • ordered/unordered
Conditional Expressions
• validate expressions
Quantified Expressions
Expressions on Sequence Types
Validate Expressions
Beispiel 2
4
Primary Expressions
• Numerisches Literal (xs:integer, xs:decimal, xs:double)
z.B.: 30, 17.5, 3.14E-2
• String Literal (xs:string)
– Es gibt viele built-in Funktionen in XPath 2.0 und XQuery
(wesentliche Erweiterung gegenüber XPath 1.0)
– Auch user-defined Funktionen in XQuery erlaubt
– Schreibweise, z.B.: my-func(expr)
• Beispiele:
– Begrenzt durch " " bzw. ' '
– Können auch enthalten:
Character-Referenzen (z.B.: Ó ó ) und
predefined entities (< > & ' " )
• Variablen:
– three-argument-function(1, 2, 3)
– two-argument-function((1, 2), 3)
– two-argument-function(1, ())
– one-argument-function((1, 2, 3))
– one-argument-function(( ))
– Schreibweise: $ + Name, z.B.: $x
– Variablenbindung, z.B.: let $x := 17
– zero-argument-function( )
Sequence Expressions
• Comma Operator: ,
z.B.: (1, 2, 3, 4)
Bemerkung: Klammern sind nicht verpflichtend aber üblich
• Range Operator: to
z.B.:
oder
• Funktionsaufrufe:
(1 to 4)
(1, 2 to 4)
• Filterbedingungen („predicates“): [
• Mengen-Operationen auf node sequences:
– Vereinigung: union (= | wie in XPath 1.0):
– Durchschnitt: intersect
– Mengendifferenz: except
• Alle 3 Operatoren eliminieren Duplikate (bzgl. node identity)
• Falls ordering-mode = „ordered“, dann werden die Knoten des
Resultats in document order geordnet.
• Beispiel:
]
auf beliebige Sequences anwendbar (nicht nur Pfade), z.B.:
– (1 to 100)[. mod 5 eq 0] (: alle Vielfachen von 5:)
– (21 to 29)[5]
(: (25) :)
(: für XML-Dokument: <x><a/><b/><c/><d/></x>
und Variablen $s1 = (a,b,c) und $s2 = (c,d) :)
$s1
$s1
$s1
$s1
union $s2
| $s2
intersect $s2
except $s2
• Paths: absolute paths vs. relative paths:
mit bzw. ohne / am Anfang
• Path expression: step expressions getrennt durch /
• Step expression: axis :: nodetest [predicate]
(a,b,c,d) :)
(a,b,c,d) :)
(c) :)
(a,b) :)
Beispiel 3
Path Expressions
Im wesentlichen wie location paths in XPath 1.0
(mit einigen Erweiterungen)
(:
(:
(:
(:
Beispiele
• child::chapter/descendant::para
• child::para[fn:position() = fn:last()-1]
• preceding-sibling::chapter[fn:position() = 1]
• /descendant::chapter[fn:position() = 5]/
child::section[fn:position() = 2]
• following::*[self::chapter or self::appendix]
[fn:position() = fn:last()]
• para[fn:last()]
• //book/@version
• Achsen: „forward axes“ vs. „reverse axes“
• ../@lang
• Abkürzungen: abbreviated vs. unabbreviated Syntax
• para[./@type="warning"][5]
5
Arithmetic Expressions
Erweiterungen gegenüber XPath 1.0
• Operatoren: +, -, *, div, idiv, mod
• Path expression liefert sequence of nodes
•
=> beliebig kombinierbar mit anderen Expressions, z.B.:
– $book/(chapter union appendix)[fn:last()]
– id("x007")/title
• Erweiterung der “node tests“ zu “kind tests“
d.h.: wie Item-Type Angaben für Node Types, z.B.:
– descendant :: text() (auch in XPath 1.0 möglich)
– forward :: element(*, co:USAddress)
• Prädikate auf beliebige Sequences anwendbar, z.B.:
– (1 to 100)[. mod 5 eq 0]
– (21 to 29)[5]
Beispiel 4
• Division:
– div: Dezimal-Division
3 div 2
(: 1.5 :)
– idiv: ganzzahlige Division
3 idiv 2
(: 1 :)
• Unäre oder binäre Operatoren: +, • Minuszeichen und Leerzeichen:
– a-b
(: Name "a-b" :)
– a -b (: (Zahlenwert von) Element a minus Element b :)
– a - b (: (Zahlenwert von) Element a minus Element b :)
Comparison Expressions
Logical Expressions
• Value comparison: eq, ne, lt, le, gt, ge
• Operatoren: and, or
– Vergleich von 2 einzelnen Items, z.B.: a eq 17 (: a 1-elementig!! :)
– (1,2) eq (2,3) liefert error (weil Operanden nicht 1-elementig sind).
• General comparison: =, !=, <, <=, >, >=
– Vergleich von 2 Sequences
– exists-Semantik wie in XPath 1.0
– z.B.: //a = //b (: = true, wenn //a einen Knoten x und //b einen
Knoten y enthält mit x eq y
– (1,2,3) != (1,2,3) liefert true (weil 1 ne 2).
• Node Comparison: is, <<, >>
Beispiel 5
– Vergleich von 2 einzelnen Nodes
– is prüft node identity, z.B.: $a is $b
– << (bzw.) >> prüft, ob der erste node vor (bzw. nach) dem zweiten node
bzgl. document order liegt, z.B.: $a << $b
– Operieren auf 2 bool‘schen Werten (= effective boolean
value), z.B.: .//section and (@page eq 17)
– Reihenfolge der Auswertung und Optimierungen sind
implementation-dependent, z.B.:
(1 lt 2) or (3 div 0 = 1) liefert true oder error
• Built-in Funktionen: fn:not(), fn:true(),
fn:false()
– wie in XPath 1.0
Constructors
• Direct Element Constructor:
–
–
–
–
Erzeugt ein Element (mit konstantem Namen)
Vergleichbar mit LRE in XSLT
Angabe von Attributen und Namespaces möglich
Inhalt: geschachtelter Constructor, konstanter Text, Expression in { }
• Computed Element / Attribute Constructor:
– Der Element- bzw. Attribute-Name wird mittels Expression
(und nicht als konstanter String) angegeben.
• Weitere Computed Constructors:
– Auch Knoten der anderen Node-types können erzeugt werden
– document {expr}, text {expr}, comment {expr},
processing-instruction {expr1}{expr2}
(: expr1 = name-expression, expr2 = content-expression :)
Beispiele
• Direct Element Constructor:
<example number="1">
<p> Here is a query. </p>
<eg> $b/title </eg>
<p> Here is the result of the query. </p>
<eg>{ $b/title }</eg>
</example>
• Resultat:
<example number="1">
<p> Here is a query. </p>
<eg> $b/title </eg>
<p> Here is the result of the query. </p>
<eg><title>The Adventures … </title></eg>
</example>
6
Beispiele
Beispiele
Beispiel 6
• Attributes:
• Computed Element Constructor:
<shoe size="7"/>
<shoe size="{6+1}"/>
<shoe size="As big as {$hat/@size}"/>
<chapter ref="[{1, 5 to 7, 9}]"/>
(: string-value von ref: "1 5 6 7 9", d.h.:
Konkatenation der Items, mit blank als Separator :)
• Namespaces:
<box xmlns:metr = "http://example.org/metric"
xmlns:engl = "http://example.org/english">
<height><metr:meters>3</metr:meters></height>
<width><engl:feet>6</engl:feet></width>
<depth><engl:inches>18</engl:inches></depth>
</box>
element {fn:node-name($e)}
{$e/@*, 2*fn:data($e)}
(: kopiert das Element $e mit allen Attributen, wobei der
numerische Inhalt von $e verdoppelt werden soll. :)
• Bemerkung:
Attribut-Knoten in der content-expression werden als Attribute des
erzeugten Elements angehängt.
• Computed Attribute Constructor:
attribute
{ if ($sex = "M") then "husband" else "wife" }
{ <a>bla</a>, <b>bla</b> }
(: string-value: "bla bla" :)
FLWOR-Expressions
• for-Klauseln und let-Klauseln:
– Erzeugen einen „tuple stream“ (d.h.: Folge von Tupeln
von Variablenbindungen)
– Jede FLWOR Expression hat mindestens ein for oder let
• where-Klausel: optionaler Filter auf den tuple stream
• order by-Klausel: optionales Umordenen des tuple
stream
• return + expression:
– Liefert 1 Ergebniswert pro Tupel
– Gesamtergebnis: Sequence aus allen Ergebniswerten
for-Klauseln
• for var-name in expr (: expr liefert eine sequence :)
=> bindet Variable an ein Item nach dem anderen
• mehrere Variablen: for var1 in expr1, var2 in expr2
• Beispiel:
for $i in (1, 2), $j in (3, 4)
=> Tuple stream: ($i=1,$j=3), ($i=1,$j=4),
($i=2,$j=3), ($i=2,$j=4)
• Optional: Positionsvariable
for $lva at $i in ("VO", "UE", "PK", "SE")
=> Variablenbindungen: ($lva="VO",$i=1),
($lva="UE",$i=2), etc.
let-Klauseln
• let var-name := expr
=> bindet Variable an Wert von expr
• mehrere Variablen: let var1 := expr1, var2 := expr2
• Beispiel: let-Klausel
let $s := (<one/>, <two/>, <three/>)
return <out>{$s}</out>
liefert: <out><one/><two/><three/></out>
• Beispiel: for-Klausel
for $s in (<one/>, <two/>, <three/>)
return <out>{$s}</out>
liefert: <out><one/></out> <out><two/></out>
<out><three/></out>
where-Klausel
• where expr
=> selektiert jene Tupel im tuple stream, für die expr
den effective boolean value true hat.
• Beispiel:
for $x at $i in $inputvalues
where $i mod 10 = 0
return $x
Liefert jedes zehnte Item der Sequence $inputvalues
7
Order by-Klausel
Beispiel 7
• order by expr
=> expr liefert einen Schlüssel, nach dem die Tupeln
im tuple stream geordnet werden.
Ordered/Unordered Expressions
• In XQuery wird mittles ordering mode (ordered oder unordered)
zwischen definierter und beliebiger Reihenfolge unterschieden bei:
– Ergebnis von axis steps (document order / reverse order)
• Ist die einzige Möglichkeit in XQuery, um nach einem Value
(und nicht nach document order, etc.) zu sortieren
• Optionaler Zusatz: ascending bzw. descending
• Auch mehrere Schlüssel in order by-Klausel möglich:
– Ergebnis von union-, intersect-, except expressions
– tuple stream in FLWOR expression ohne order by Klausel
• Idee: Wenn Reihenfolge nicht wichtig ist, dann ermöglicht
“unordered“ mode eventuell Optimierungen bei der Auswertung
order by $b/title ascending, $b/price descending
• Festlegung des ordering mode:
• Beispiel:
– Global mittels ordering mode declaration im Prolog
for $e in $employees
order by $e/salary descending
return $e/name
– Lokal mittels ordered / unordered expression:
ordered{ expr } bzw. unordered{ expr }
Sortierung der Angestellten-Namen nach absteigendem Einkommen
Conditional Expressions
Quantified Expressions
• some var-name in expr1 satisfies expr2
• if expr1 then expr2 else expr3
– Berechne effective boolean value der test-expression expr1
– true => conditional expression liefert Wert der then-expression
– false => conditional expression liefert Wert der else-expression
– Erzeugen einen tuple stream wie for-Klauseln, d.h.: var-name wird
an ein Item nach dem anderen aus expr1 gebunden
– some-expression liefert true, wenn für mindestens eine solche
Variablenbindung die Bedingung expr2 true ergibt
• Beispiel:
if ($p/@waehrung = "ATS") then
else if ($p/@waehrung = "BEF")
else if ($p/@waehrung = "DEM")
...
else if ($p/@waehrung = "PTE")
else ()
bzw.
every var-name in expr1 satisfies expr2
– every-expression liefert true, wenn für jede solche
fn:data($p) div 13.7603
then fn:data($p) div 40.3399
then fn:data($p) div 1.95583
then fn:data($p) div 200.482
Beispiel 8
Variablenbindung die Bedingung expr2 true ergibt
• mehrere Variablen und Quantoren möglich, z.B.:
some var1 in expr1, var2 in expr2
every var3 in expr3, var4 in expr4
satisfies expr5
Expressions on Sequence Types
• Quantifizierung über empty sequence:
–
some var in () satisfies expr
(: liefert false :)
–
every var in () satisfies expr
(: liefert true :)
• Beispiele:
– every $b in //BUCH satisfies $b/@Vorhanden
liefert true, wenn jedes Element BUCH ein Attribut mit
Namen “Vorhanden“ hat.
– some $x in (1, 2, 3), $y in (2, 3, 4)
satisfies $x + $y = 4
(: liefert true :)
– every $x in (1, 2, 3), $y in (2, 3, 4)
(: liefert false :)
satisfies $x + $y = 4
• expr instance of sequence-type
testet, ob der Typ von expr den Typ laut sequence-type matcht,
z.B.: (5 + 1.4) instance of xs:integer (: false :)
• Typeswitch erlaubt Fallunterscheidung mittels Typangaben,
z.B.:
typeswitch($customer/billing-address)
case $a as element(*, USAddress) return
$a/state
case $a as element(*, CanadaAddress) return
$a/province
case $a as element(*, JapanAddress) return
$a/prefecture
default return "unknown"
8
• expr cast as atomic-type
Validate Expressions
konvertiert den (atomaren) Wert von expr in den Typ laut
atomic-type, z.B.: "51.4" cast as xs:decimal
-> konvertiert String "51.4" in Dezimalzahl
validate expr
– expr muss einen einzelnen element- oder document-node
(= „candidate-node“) ergeben.
• expr castable as atomic-type
testet ob der (atomaren) Wert von expr in den Typ laut
atomic-type konvertierbar ist, z.B.:
"51.4" castable as xs:decimal (: true:)
– Der „candidate-node“ wird mittels validate gegen eine
XML Schema-Definition validiert.
– Falls Validierung möglich: expr wird in entsprechende Data
Model Instance (= value + type annotation) umgewandelt.
• expr treat as sequence-type
– expr bekommt sequence-type als static type
ev. für static type checking bei Funktionsaufrufen wichtig
– Falls Validierung scheitert: => error
– zur Laufzeit: Überprüfung, ob der Typ von expr den
sequence-type matcht.
– Motivation: Damit expr einen bestimmten sequence-type
matcht, ist ev. vorher Validierung gegen ein Schema nötig.
Übungsbeispiel A
Übungsbeispiel B
Betrachten Sie die XML-Dateien Teilnehmer.xml und Gruppen.xml.
Schreiben Sie ein XQuery Programm Xml2Htm.xq, das aus diesen
2 XML-Dateien eine HTML-Datei mit folgender Tabelle erzeugt.
1.
Jede Zeile enthält Nachname, Vorname, MatrNr, Kennzahl,
Email und Gruppe eines Studenten.
Die Studenten sollen alphabetisch (nach dem Nachnamen – bei
Gleichheit nach dem Vornamen) sortiert werden.
Zusätzlich soll (als erste Spalte) eine fortlaufende Nummer
ausgegeben werden.
2.
3.
Verwenden Sie für die Zeilen der Tabelle abwechselnd zwei
verschiedene Formatierungen (z.B.: Hintergrundfarbe, Schriftfarbe,
etc. ).
Rang Raum
Vorlesungen
Name
2125
Sokrates
C4
226
MatrNr
Name
Semester
2126
Russel
C4
232
24002
Xenokrates
18
2127
Kopernikus C3
Popper
Stellen Sie jede Tabelle mit einer eigenen XML-Datei dar, z.B.:Studenten.xml
<Studenten>
<Student>
<MatrNr>24002</MatrNr>
<Name>Xenokrates</Name>
<Semester>18</Semester>
</Student>
<Student>
<MatrNr>25403</MatrNr>
<Name>Jonas</Name>
<Semester>12</Semester>
</Student>
...
<Studenten>
Die relationale Uni-DB
Professoren
PersNr
2133
Betrachten Sie die relationale Uni-DB (nächste Folie) mit den folgenden Tabellen:
Studenten, Professoren, Assistenten, Vorlesungen, voraussetzen, hören
C3
Studenten
310
25403
Jonas
12
52
26120
Fichte
10
2134
Augustinus
C3
309
26830
Aristoxenos
8
2136
Curie
C4
36
27550
Schopenhauer
6
2137
Kant
C4
7
28106
Carnap
3
hören
MatrNr
VorlNr
26120
5001
27550
5001
27550
4052
29120
Theophrastos
2
29555
Feuerbach
2
voraussetzen
VorlNr
Titel
5001
Grundzüge
4
2137
5041
Ethik
4
2125
5043
Erkenntnistheorie
3
2126
5049
Mäeutik
2
2125
4052
Logik
4
2125
5052
Wissenschaftstheorie
3
2126
5216
Bioethik
2
2126
5259
Der Wiener Kreis
2
2133
5022
Glaube und Wissen
2
2134
4630
Die 3 Kritiken
Assistenten
4
Vorgänger Nachfolger
28106
5041
28106
5052
5001
5041
PersNr
28106
5216
5001
5043
3002
28106
5259
5001
5049
3003
Name
SWS gelesen
von
Schreiben Sie ein XQuery-Programm sql.xquery, das ein HTML-Dokument mit
5 Tabellen erzeugt, die die Ergebnisse der folgenden SQL-Anfragen enthalten:
a) Informationen über Studenten, die Vorlesungen von Sokrates besuchen:
select h.MatrNr, v.Titel, v.VorlNr
from hören h, Vorlesungen v, Professoren p
where p.Name = ´Sokrates´ and v.gelesenVon = p.PersNr and
v.VorlNr = h.VorlNr;
2137
b) Informationen über die Lehrbelastung der Professoren in Rang C4:
Fachgebiet
Boss
Platon
Ideenlehre
2125
Aristoteles
Syllogistik
2125
Sprachtheorie
Fortsetzung (Übungsbeispiel B)
29120
5001
5041
5216
3004 Wittgenstein
29120
5041
5043
5052
3005
Rhetikus
Planetenbewegung
2127
29120
5049
5041
5052
3006
Newton
2127
29555
5022
5052
5259
Keplersche
Gesetze
2126
25403
5022
3007
Spinoza
Gott und Natur
2126
select PersNr, Name, ( select sum(SWS) as Lehrbelastung
from Vorlesungen where gelesenVon = PersNr )
from Professoren
where Rang = ´C4´
order by Name;
9
Fortsetzung (Übungsbeispiel B)
c) Informationen über Professoren, die überwiegend lange Vorlesungen halten:
select gelesenVon, Name, avg(SWS)
from Vorlesungen, Professoren
where gelesenVon = PersNr
group by gelesenVon, Name
having avg(SWS) >= 3;
d) Namen aller Uni-Angehörigen (Professoren, Asssistenten, Studenten) :
( select Name from Professoren ) union
( select Name from Assistenten ) union
( select Name from Studenten );
e) Liste aller Vorlesungen sowie zu jeder Vorlesung die Liste aller direkt oder
indirekt vorausgesetzten Vorlesungen (d.h.: transitiver Abschluss der Tabelle
„voraussetzen“ -> ist nicht ausdrückbar in SQL-92!!).
10
Herunterladen