Upload
wieland-aderhold
View
114
Download
4
Embed Size (px)
Citation preview
1
Teil ITeil I
DatenmodelleDatenmodelle
Kapitel 7: Semistrukturierte Modelle
2
Ursprung: Web-Daten unterscheiden sich drastisch von den bisher gewohnten Daten in Datenbanken: selbst-beschreibend heterogen, tief verschachtelt, unregelmäßig gemischt Dokument- und faktische Daten
Heutige Bedeutung: Diese Eigenschaften definieren ein universelles Datenaustauschformat Dafür sollte sich wieder ein Datenmodell angeben lassen
Wunsch nach Datenbankunterstützung: Vermeiden von Datentransformationen durch den Benutzer. Problem: Datenmodelle von Dokumentexperten, nicht
Datenbankexperten entworfen.
Motivation
3
Literatur
Abiteboul, Buneman, Suciu: Data on the Web: From Relational to Semistructured to XML. Morgan Kaufmann. 1999
Kazakos, W.; Schmidt, A.; Tomczyk, P.: Datenbanken und XML – Konzepte, Anwendungen, Systeme. Springer. 2002
Klettke, M.; Mayer, H.: XML & Datenbanken. dpunkt.verlag. 2003
Rahm, E.; Vossen, G. (Hrsg.): Web & Datenbanken – Konzepte, Architekturen, Anwendungen. dpunkt.verlag. 2003
4
Kapitel 7.1: Der Beginn - OEM
5Polymorphe Typen
Atomare Typen stringPolymorphe Typen
Obj ::= ∥sel:Typ∥Set ::= {Obj}
Typ Atomarer Typ oder Obj. Objekt: Geordnete Sammlung als zusammengehörig
betrachteter atomarer oder zusammengesetzter Datenelemente. Die Zahl der Komponenten ist offen, jede wird nicht-eindeutig durch einen Selektor (Attribut) identifiziert.
Set: Menge von Objekten. Lässt sich auch über Objekt nachbilden, indem alle Mengenelemente das selbe Attribut erhalten.
6
Bewertung
Strukturelle Mächtigkeit gering Beschränkte aber mächtige strukturelle Orthogonalität
Set Obj Atomarer Typ
7
&o1
&o12 &o24 &o29
&o43&o96
&o243 &o206
&o25
“Serge”“Abiteboul”
1997
“Victor”“Vianu”
122 133
paperbook
paper
references
referencesreferences
authortitle
yearhttp
author
authorauthor
title publisherauthor
authortitle
pages
firstnamelastname
firstname lastname firstlast
bib
Veranschaulichung von Objekten als gerichtete Graphen
complex object
atomic object
Object Exchange Model (OEM)
object identifier
8
&o1
&o12 &o24 &o29
&o43&o96
&o243 &o206
&o25
“Serge”“Abiteboul”
1997
“Victor”“Vianu”
122 133
paperbook
paper
references
referencesreferences
authortitle
yearhttp
author
authorauthor
title publisherauthor
authortitle
pages
firstnamelastname
firstname lastname firstlast
Bib
Object Exchange Model (OEM)
bib: &o1 { paper: &o12 { … }, book: &o24 { … }, paper: &o29 { author: &o52 “Abiteboul”, author: &o96 { firstname: &o243 “Victor”, lastname: &o206 “Vianu”}, title: &o93 “Regular path queries with constraints”, references: &o12, references: &o24, pages: &o25 { first: &o64 122, last: &o92 133} } }
bib: &o1 { paper: &o12 { … }, book: &o24 { … }, paper: &o29 { author: &o52 “Abiteboul”, author: &o96 { firstname: &o243 “Victor”, lastname: &o206 “Vianu”}, title: &o93 “Regular path queries with constraints”, references: &o12, references: &o24, pages: &o25 { first: &o64 122, last: &o92 133} } }
9
bib: &o1 { paper: &o12 { … },
book: &o24 { … },
paper: &o29
{ author: &o52 “Abiteboul”,
author: &o96 { firstname: &o243 “Victor”,
lastname: &o206 “Vianu”},
title: &o93 “Regular path queries with constraints”,
references: &o12,
references: &o24,
pages: &o25 { first: &o64 122, last: &o92 133}
}
}
Object Exchange Model (OEM)
Textuelle Darstellung
{ paper: { author: “Abiteboul”, author: { firstname: “Victor”, lastname: “Vianu”}, title: “Regular path queries …”, pages: { first: 122, last: 133 } } }
{ paper: { author: “Abiteboul”, author: { firstname: “Victor”, lastname: “Vianu”}, title: “Regular path queries …”, pages: { first: 122, last: 133 } } }
OEM ohne Ordnung!
10
{ row: { name: “John”, phone: 3634 },
row: { name: “Sue”, phone: 6343 },
row: { name: “Dick”, phone: 6363 }
}
n a m e p h o n e
J o h n 3 6 3 4
S u e 6 3 4 3
D i c k 6 3 6 3
row row row
name name namephone phone phone
“John” 3634“Sue” “Dick”6343 6363
Object Exchange Model (OEM)
Vergleich mit relationalen Daten
11
Datenbasisschema
Wegen der Freizügigkeit des Modells: Keine a-priori Vereinbarung eines Schemas Hingegen: a-posteriori Extraktion eines Schemas: “Gibt es
gewisse Regelmäßigkeiten in den Daten?”
12
Kapitel 7.2: XML
13
XML eXtended Markup Language XML SGML Web-Standard (W3C) zum Datenaustausch:
Ein- und Ausgabedaten von Anwendungen können mittels XML beschrieben werden
Industrie muss sich dann noch pro Anwendungsbereich auf standardisierte Beschreibung einigen
Datenbank-Sichtweise: Als Meta-Grammatik eignet sich XML als Datenmodell für semistrukturierte Daten
14
XML-Syntax (1) – XML-Element XML-Element (engl. element):
Obj ::= tagged-struct(∥attribute|Obj∥, string) Beschreibung eines Objekts, die durch passende
Markierungen (tags) wie <author> und </author> geklammert ist
Inhalt eines Elements: Freitext, attributierte Eigenschaften und/oder weitere Elemente (Unterelemente)
Elemente können beliebig geschachtelt sein Leere Elemente: <year></year> kurz: <year/>
<author><firstname> Serge </firstname>
<lastname> Abiteboul </lastname> <email> [email protected] </email>
email address may be wrong!</author>
<author><firstname> Serge </firstname>
<lastname> Abiteboul </lastname> <email> [email protected] </email>
email address may be wrong!</author>
Element author
Startmarkierung
Endmarkierung
Unterelemente
Freitext
15
XML-Syntax (2) – XML-Attribut XML-Attribut (engl. attribute):
Name-Zeichenkettenwert-Paar Assoziiert mit einem Element Alternative Möglichkeit, Daten zu beschreiben
<author firstname=“Serge” lastname=“Abiteboul” email=“[email protected]”/><author firstname=“Serge” lastname=“Abiteboul” email=“[email protected]”/>
Attribut email
Weitere denkbare Beschreibung derselben Daten:
<author email=“[email protected]”><firstname> Serge </firstname> <lastname> Abiteboul </lastname>
</author>
<author email=“[email protected]”><firstname> Serge </firstname> <lastname> Abiteboul </lastname>
</author>
16
&o1
&o12 &o24 &o29
Serge AbiteboulVictor Vianu 122 133
1997
paper book paper
author yearauthor
pages
firstname lastnamefirstname lastname first last
bib
Veranschaulichung von Objekten als gerichtete Graphen
XML-Graph
Objektidentifikator als Attribut im Knoten vermerktKnoten sind markiert
Text im Knoten vermerkt
17
XML-Graph
&o1
&o12 &o24 &o29
Serge AbiteboulVictor Vianu 122 133
1997
paper book paper
author yearauthor
pages
firstname lastnamefirstname lastname first last
bib
<bib id=“o1”><paper id=“o12”>
<title> Foundations of Databases </title><author>
<firstname> Serge </firstname><lastname> Abiteboul </lastname>
</author> <year> 1997 </year><publisher> Addison Wesley </publisher>
</paper>...
</bib>
<bib id=“o1”><paper id=“o12”>
<title> Foundations of Databases </title><author>
<firstname> Serge </firstname><lastname> Abiteboul </lastname>
</author> <year> 1997 </year><publisher> Addison Wesley </publisher>
</paper>...
</bib>
18
XML vs HTML XML: freie Bezeichner zur Beschreibung von
anwendungsspezifischer Semantik (Meta-Grammatik) HTML: feste Bezeichner (tag), hauptsächlich für die
Darstellung von Text (Grammatik) HTMLXMLSGML
<h1> bib </h1><p>
<i> Foundations of Databases </i> Serge Abiteboul<br> Addison Wesley, 1997
<p>...
<h1> bib </h1><p>
<i> Foundations of Databases </i> Serge Abiteboul<br> Addison Wesley, 1997
<p>...
HTML
<bib id=“o1”><paper id=“o12”>
<title> Foundations of Databases </title><author>
<firstname> Serge </firstname><lastname> Abiteboul </lastname>
</author> <year> 1997 </year><publisher> Addison Wesley </publisher>
</paper>...
</bib>
<bib id=“o1”><paper id=“o12”>
<title> Foundations of Databases </title><author>
<firstname> Serge </firstname><lastname> Abiteboul </lastname>
</author> <year> 1997 </year><publisher> Addison Wesley </publisher>
</paper>...
</bib> XMLPräsentationsangabe
Inhaltsangabe
19
XML-Dokument
XML-Dokument: Ein Text-Dokument, das XML-Beschreibungen enthält
Wohlgeformtes XML-Dokument: Alle Elemente sind korrekt mit Start- und End-Tags
geklammert Dokument enthält genau ein Wurzelelement Wohlgeformte Dokumente dürfen aber immer noch
unstrukturierten Freitext enthalten Gültiges (engl. valid) XML-Dokument:
Wohlgeformtes XML-Dokument, das zu einem assoziierten Schema uneingeschränkt konform ist
Mittels eines Schemas kann man also die Gültigkeit eines XML-Dokumentes überprüfen
Schemas sind somit eine optionale Ergänzung
20
Schemata in XML
DTD – Document Type Definition (Dokumentsicht): Einfache Grammatik für ein XML-Dokument
Deklaration von Elementen, Attributen, u.a. Beschränkt die beliebige Verschachtelung von Elementen und Attributen
Ist Teil des XML-Standards Erbe von SGML
XML-Schema (Datenbasiseinfluss): Komplexere Datendefinitionssprache:
Viele standardisierte Basistypen, z.B. float, double, decimal, boolean Typen und typisierte Objektreferenzen Klassenhierarchien / Vererbung Konsistenzbedingungen
Ist inzwischen Teil des XML-Standards Abwärtskompatibel zu DTDs
21
XML-Schemata I: DTD Eine DTD definiert eine kontextfreie Grammatik für ein XML-
Dokument Zuvor beliebige Elemente und Attribute werden auf eine
definierte Auswahl und Struktur eingeschränkt
<bib><paper id=“o12”>
<title> Foundations of Databases </title><author>
<firstname> Serge </firstname><lastname> Abiteboul </lastname>
</author> <year> 1997 </year><publisher> Addison Wesley </publisher>
</paper>...
</bib>
<bib><paper id=“o12”>
<title> Foundations of Databases </title><author>
<firstname> Serge </firstname><lastname> Abiteboul </lastname>
</author> <year> 1997 </year><publisher> Addison Wesley </publisher>
</paper>...
</bib> XML
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]>
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]> DTD
22
DTD – Deklaration von Elementen Beschreibt die Einschränkungen
des Inhalts eines Elements Syntax:
<!ELEMENT Name (Definition)> Einziger atomarer Typ: #PCDATA
(Parsed Character DATA) (a,b,c): Liste von Unterelementen (a|b|c): Alternativen Kardinalitäten:
* keinmal oder beliebig oft
+ einmal oder beliebig oft
? kein- oder einmal (optional)
(ohne Angabe): genau einmal EMPTY: Erzwingen von leerem
Element
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]>
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]> DTD
23
DTD – Deklaration von Elementen (2) Beschreibt die Einschränkungen
des Inhalts eines Elements Syntax:
<!ELEMENT Name (Definition)> Einziger atomarer Typ: #PCDATA
(Parsed Character DATA) (a,b,c): Liste von Unterelementen (a|b|c): Alternativen Kardinalitäten:
* keinmal oder beliebig oft
+ einmal oder beliebig oft
? kein- oder einmal (optional)
(ohne Angabe): genau einmal EMPTY : Erzwingen von leerem
Element
Einleitung undFestlegung des Wurzelelements bib
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]> DTD
24
DTD – Deklaration von Elementen (3) Beschreibt die Einschränkungen
des Inhalts eines Elements Syntax:
<!ELEMENT Name (Definition)> Einziger atomarer Typ: #PCDATA
(Parsed Character DATA) (a,b,c): Liste von Unterelementen (a|b|c): Alternativen Kardinalitäten:
* keinmal oder beliebig oft
+ einmal oder beliebig oft
? kein- oder einmal (optional)
(ohne Angabe): genau einmal EMPTY : Erzwingen von leerem
Element
bib kann beliebig viele Elemente vomTyp paper enthalten
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]> DTD
25
DTD – Deklaration von Elementen (4) Beschreibt die Einschränkungen
des Inhalts eines Elements Syntax:
<!ELEMENT Name (Definition)> Einziger atomarer Typ: #PCDATA
(Parsed Character DATA) (a,b,c): Liste von Unterelementen (a|b|c): Alternativen Kardinalitäten:
* keinmal oder beliebig oft
+ einmal oder beliebig oft
? kein- oder einmal (optional)
(ohne Angabe): genau einmal EMPTY : Erzwingen von leerem
Element
paper besteht ausmindestens einem authorgenau einem year undeinem optionalen publisher
in genau dieser Reihenfolge!
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]> DTD
26
DTD – Deklaration von Elementen (5) Beschreibt die Einschränkungen
des Inhalts eines Elements Syntax:
<!ELEMENT Name (Definition)> Einziger atomarer Typ: #PCDATA
(Parsed Character DATA) (a,b,c): Liste von Unterelementen (a|b|c): Alternativen Kardinalitäten:
* keinmal oder beliebig oft
+ einmal oder beliebig oft
? kein- oder einmal (optional)
(ohne Angabe): genau einmal EMPTY : Erzwingen von leerem
Element
firstname ist vom Typ Zeichenkette
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]> DTD
27
DTD – Deklaration von Attributen Name-Zeichenkettenwert-Paar Assoziiert mit einem Element Syntax:
<!ATTLIST Element Attributname1 Typ1 Zusatz1 Attributname2 …>
Typ: CDATA Zeichenkette ID OID IDREF Referenz IDREFS Menge von
Referenzen Zusatz:
REQUIREDzwingend IMPLIED optional (Initialwert)
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]> DTD
28
DTD – Deklaration von Attributen (2) Name-Zeichenkettenwert-Paar Assoziiert mit einem Element Syntax:
<!ATTLIST Element Attributname1 Typ1 Zusatz1 Attributname2 …>
Typ: CDATA Zeichenkette ID OID IDREF Referenz IDREFS Menge von
Referenzen Zusatz:
REQUIREDzwingend IMPLIED optional (Initialwert)
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]> DTD
paper besitzt ein Attribut id, eineOID, die zwingend mit einemeindeutigen Wert belegt werdenmuss
29
DTD – Deklaration von Attributen (3) Name-Zeichenkettenwert-Paar Assoziiert mit einem Element Syntax:
<!ATTLIST Element Attributname1 Typ1 Zusatz1 Attributname2 …>
Typ: CDATA Zeichenkette ID OID IDREF Referenzen IDREFS Menge von
Referenzen Zusatz:
REQUIREDzwingend IMPLIED optional (Initialwert)
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]> DTD
Ein author hat ein Attribut age, mitdem ihm eine Zeichenkette mit demWert für sein Alter zugewiesenwerden kann (aber nicht muss!)
30
DTD – OIDs und Referenzen DTDs erlauben die Deklaration von OIDs, Referenzen und
Referenzmengen als Attribute Beispiel:
<family><person id=“jane” mother=“mary” father=“john”>
<name> Jane Doe </name></person> <person id=“john” children=“jane jack”>
<name> John Doe </name> </person>
<person id=“mary” children=“jane jack”><name> Mary Smith </name>
</person><person id=“jack” mother=“mary” father=“john”>
<name> Jack Smith </name></person>
</family>
<family><person id=“jane” mother=“mary” father=“john”>
<name> Jane Doe </name></person> <person id=“john” children=“jane jack”>
<name> John Doe </name> </person>
<person id=“mary” children=“jane jack”><name> Mary Smith </name>
</person><person id=“jack” mother=“mary” father=“john”>
<name> Jack Smith </name></person>
</family> XML
<!DOCTYPE family [<!ELEMENT family (person*)><!ELEMENT person (name)><!ELEMENT name (#PCDATA)><!ATTLIST person
id ID #REQUIREDmother IDREF #IMPLIEDfather IDREF #IMPLIEDchildren IDREFS #IMPLIED>
]>
<!DOCTYPE family [<!ELEMENT family (person*)><!ELEMENT person (name)><!ELEMENT name (#PCDATA)><!ATTLIST person
id ID #REQUIREDmother IDREF #IMPLIEDfather IDREF #IMPLIEDchildren IDREFS #IMPLIED>
]>DTD
31
Bewertung von DTDs
DTDs definieren kontextfreie Grammatiken
Rekursive Definitionen sind möglich
<!DOCTYPE paper [<!ELEMENT paper (section*)><!ELEMENT section ((title, section*)|text)><!ELEMENT title (#PCDATA)><!ELEMENT text (#PCDATA)>
]>
<!DOCTYPE paper [<!ELEMENT paper (section*)><!ELEMENT section ((title, section*)|text)><!ELEMENT title (#PCDATA)><!ELEMENT text (#PCDATA)>
]> DTD
DTDs weisen bei der Definition eines Schemas jedoch einige Schwächen auf: Ungewollte Festlegung der Reihenfolge:
<!ELEMENT person ( name, phone ) > Workaround: <!ELEMENT person ( (name, phone ) | ( phone, name ) ) >
Kann teilweise zu vage werden: <!ELEMENT person ( ( name | phone | email )* ) >
Referenzen können nicht eingeschränkt (typisiert) werden Alle Elementnamen sind global in einem Namensraum
32
DTDXML-Schema
XML-Schemata II: XML-Schema Echter Schemamechanismus mit vielen Erweiterungen über
DTDs hinaus Benutzt selbst wieder XML-Syntax zur Schemadefinition
<schema> <element name=“bib”> <complexType> <element name=“paper” minOccurs=“0” maxOccurs=“unbounded”> <complexType> <attribute name=“id” type=“ID” use=“required”/> <sequence> <element name=“author” type=“authorType” maxOccurs=“unbounded”/> <element name=“year” type=“string”/> <element name=“publisher” type=“string” minOccurs=“0”/> </sequence> </complexType> </element> </complexType> </element></schema>
<!DOCTYPE bib [<!ELEMENT bib (paper*)><!ELEMENT paper (author+, year, publisher?)><!ATTLIST paper id ID #REQUIRED><!ELEMENT author (firstname*, lastname)><!ATTLIST author age CDATA #IMPLIED><!ELEMENT firstname (#PCDATA)><!ELEMENT lastname (#PCDATA)><!ELEMENT year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>...
]>
33
XML-Schema: Elemente Syntax:
<element name=“Name“/>
Optionale Zusatzattribute: Typ
type = “Typ“ atomarer/einfacher/komplexer Typname Kardinalitäten (Voreinstellung: [1,1]):
minOccurs = “x“x { 0, 1, n } maxOccurs = “y“ y { 1, n, unbounded }
Wertvoreinstellungen (schließen sich gegenseitig aus!): default = “v“ veränderliche Vorgabe fixed = “u“ unveränderliche Vorgabe
34
XML-Schema: Attribute Syntax:
<attribute name=“Name“/>
Optionale Zusatzattribute: Typ:
type = “Typ“ Existenz:
use = “optional“ Kardinalität [0,1] use = “required“ Kardinalität [1,1]
Voreinstellwerte: use = “default“ value = “v“ veränderliche Vorgabe use = “fixed“ value = “u“ unveränderliche Vorgabe
35
XML-Schemata: Beispiele
XML-Schema
<schema> <element name=“bib”> <complexType> <element name=“paper” minOccurs=“0” maxOccurs=“unbounded”> <complexType> <attribute name=“id” type=“ID” use=“required”/> <sequence> <element name=“author” type=“authorType” maxOccurs=“unbounded”/> <element name=“year” type=“string”/> <element name=“publisher” type=“string” minOccurs=“0”/> </sequence> </complexType> </element> </complexType> </element></schema>
<bib><paper id=“o12”>
<title> Foundations of Databases </title><author>
<firstname> Serge </firstname><lastname> Abiteboul </lastname>
</author> <year> 1997 </year><publisher> Addison Wesley </publisher>
</paper>...
</bib>
Weitere Beispiele<attribute name=“age” type=“string” use=“optional”/>
<attribute name=“language” type=“string” use=“default” value=“de”/>
Beispiel für Elemente
Beispiel für Attribute
36
XML-Schema: Typen In XML-Schema wird zwischen atomaren, einfachen und
komplexen Typen unterschieden Atomare Typen:
Eingebaute Elementartypen wie int oder string Einfache Typen:
Haben weder eingebettete Elemente noch Attribute In der Regel von atomaren Typen abgeleitet
Komplexe Typen: Dürfen Elemente und Attribute besitzen
Zusätzlich kann man noch folgende Unterscheidung treffen: Benannte Typdefinitionen beschreiben wiederverwendbare
Typstruktur Unbenannte Typdefinitionen legen nur für Dokumente des
Schemas fest, welche Elemente wie im Dokument auftauchen dürfen
37
XML-Schema: Atomare Typen XML-Schema unterstützt eine große Menge eingebauter
Basistypen (>40): Numerisch: byte, short, int, long, float, double, decimal, binary,
… Zeitangaben: time, date, month, year, timeDuration,
timePeriod, … Sonstige: string, boolean, uriReference, ID, …
Beispiele:<element name=“year“ type=“year“/><element name=“pages“ type=“positiveInteger“/><attribute name=“age“ type=“unsignedShort“/>
38
XML-Schema: Einfache Typen Zusätzlich können von bestehenden Typen noch weitere,
sog. einfache Typen, abgeleitet werden: Typdefinition:
<simpleType name=“humanAge“ base=“unsignedShort“><maxInclusive value=“200“/> </simpleType>
Verwendung in der Dokumentdefinition:<attribute name=“age“ type=“humanAge“/>
In ähnlicher Weise können Listen definiert werden: Typdefinition:
<simpleType name=“authorType“ base=“string“derivedBy=“list“/>
(Name eines Autors als mit Leerzeichen getrennte Liste von Zeichenketten) Verwendung in der Dokumentdefiniton:
<element name=“author“ type=“authorType“/>
39
XML-Schema: Komplexe Typen Komplexe Typen dürfen im Gegensatz zu einfachen Typen
eingebettete Elemente besitzen Beispiel:
Typdefinition:<complexType name=“authorType“>
<sequence><element name=“firstname“ type=“string“ minOccurs=“0“
maxOccurs=“unbounded“/><element name=“lastname“ type=“string“/>
</sequence><attribute name=“age” type=“string” use=“optional”/>
</complexType>
Gruppierungs-Bezeichner: <sequence> … </sequence> Feste Reihenfolge (a,b) <all> … </all> Beliebige Reihenfolge (a,b oder
b,a) <choice> … </choice> Auswahl (entweder a oder b)
40
Typhierarchien (1)
Hierarchische Abhängigkeit zwischen zwei Typen durch Erweiterung (engl. extension) oder Restriktion (engl. restriction) einer bestehenden Typdefinition
Alle Typen bilden eine Typhierarchie Baum mit Wurzel: Typ Zeichenkette Keine Mehrfachvererbung
Typen sind entlang der Typhierarchie abwärtskompatibel: Für Typinstanzen gilt das Substituierbarkeitsprinzip Elemente eines bestimmten Typs akzeptieren auch Daten
einer Erweiterung oder Restriktion dieses Typs
41
Typhierarchien (2)
Erweiterung Strukturergänzung:
Hinzufügen weiterer Elemente oder Attribute
Restriktion Struktur bleibt gleich: es
dürfen keine Elemente oder Attribute weggelassen werden
Verschärfung von Angaben, z.B. bisher nicht angebene type-,
default- oder fixed-Attribute Einschränkung der
Kardinalitäten minOccurs, maxOccurs
42
Typhierarchien: Erweiterung von Typen (1) Beispiel:
<complexType name=“extendedAuthorType“><extension base=“authorType“>
<sequence><element name=“email“ type=“string“ minOccurs=“0“
maxOccurs=“1“/></sequence><attribute name=“homepage” type=“string”
use=“optional”/></extension>
</complexType> Erweitert den zuvor definierten Typ authorType um
ein optionales Element email ein optionales Attribut homepage
43
Typhierarchien: Erweiterung von Typen (2) Die Erweiterungen werden bei der Verarbeitung an die
bestehenden Definitionen angehängt:<complexType name=“extendedAuthorType“>
<sequence><element name=“firstname“ type=“string“ minOccurs=“0“
maxOccurs=“unbounded“/><element name=“lastname“ type=“string“/><element name=“email“ type=“string“ minOccurs=“0“
maxOccurs=“1“/> </sequence><attribute name=“age” type=“string” use=“optional”/><attribute name=“homepage” type=“string” use=“optional”/>
</complexType> <complexType name=“authorType“><sequence>
<element name=“firstname“ type=“string“ minOccurs=“0“maxOccurs=“unbounded“/>
<element name=“lastname“ type=“string“/></sequence><attribute name=“age” type=“string” use=“optional”/>
</complexType>
44
Typhierarchien: Restriktion von Typen Beispiel (Komplexer Typ):
<complexType name=“restrictedAuthorType“><restriction base=“authorType“>
<sequence><element name=“firstname“ type=“string“ minOccurs=“0“
maxOccurs=“2“/><element name=“lastname“ type=“string“/>
</sequence><attribute name=“age” type=“string” use=“required”/>
</restriction> </complexType>
Vorher: maxOccurs=“unbounded“Vorher: maxOccurs=“unbounded“
Vorher: use=“optional“Vorher: use=“optional“
<complexType name=“authorType“><sequence>
<element name=“firstname“ type=“string“ minOccurs=“0“maxOccurs=“unbounded“/>
<element name=“lastname“ type=“string“/></sequence><attribute name=“age” type=“string” use=“optional”/>
</complexType>
45
Polymorphe Konsistenzbedingungen (1) Elemente und Attribute können zusätzlich mit
Konsistenzbedingungen belegt werden Eindeutigkeit (Schlüsselkandidat):
<unique name=“eindeutigerAutorenName“><field xpath=“bib/paper/author/firstname“/><field xpath=“bib/paper/author/lastname“/>
</unique>Die Kombinationen von Vor- und Nachnamen bei den Autoren sind immer eindeutig Mittels field werden die entsprechenden Elemente oder
Attribute identifiziert Mittels xpath (siehe später!) wird der genaue Pfadausdruck
angegeben, unter dem das entsprechende field innerhalb der Dokumenthierarchie gefunden werden kann
46
Polymorphe Konsistenzbedingungen (2) Schlüsselbedingung:
<key name=“papierSchlüssel“><field xpath=“bib/paper/@id“/>
</key>Das Attribut id in paper dient als Schlüssel. Schlüssel sind eindeutig und können referenziert werden.
Fremdschlüsselbedingung:<keyref name=“papierFremdschlüssel“ refer=“papierSchlüssel“>
<field xpath=“bib/paper/@references“/></keyref>Ergänzend zum bisherigen Schema: references ist eine Liste von Papieren, die vom Papier aus referenziert werden, d.h. in dessen Literaturverzeichnis auftauchen. Beachte: Mit refer bezieht man sich auf das name-Attribut
einer Schlüsselbedingung, nicht auf das Schlüsselfeld! Die Werte in references müssen also immer unter den
Schlüsseln zu den Papieren zu finden sein.
47
Beispiel-Schema<!-- XMLSchema für eine Literaturdatenbank --><schema>
<!-- Globales Wurzelelement bib --><element name="bib">
<complexType><element name="paper" minOccurs="0" maxOccurs="unbounded">
<complexType><attribute name="id" type="ID" use="required"/><sequence>
<element name="author" type="authorType" maxOccurs="unbounded"/><element name="year" type="string"/><element name="publisher" type="string" minOccurs="0"/><element name="references" type="listOfPapers" minOccurs="0"/>
</sequence></complexType>
</element></complexType>
</element>
<!-- XMLSchema für eine Literaturdatenbank --><schema>
<!-- Globales Wurzelelement bib --><element name="bib">
<complexType><element name="paper" minOccurs="0" maxOccurs="unbounded">
<complexType><attribute name="id" type="ID" use="required"/><sequence>
<element name="author" type="authorType" maxOccurs="unbounded"/><element name="year" type="string"/><element name="publisher" type="string" minOccurs="0"/><element name="references" type="listOfPapers" minOccurs="0"/>
</sequence></complexType>
</element></complexType>
</element>
48
Beispiel-Schema (2)<!-- Reine Typdefinitionen --><simpleType name="listOfPapers" base="ID" derivedBy="list"/>
<complexType name="authorType"><sequence>
<element name="firstname" type="string" minOccurs="0" maxOccurs="unbounded"/><element name="lastname" type="string"/>
</sequence><attribute name="age" type="humanAge" use="optional"/>
</complexType>
<complexType name="extendedAuthorType"><extension base="authorType">
<sequence><element name="email" type="string" minOccurs="0" maxOccurs="1"/>
</sequence><attribute name="homepage" type="simpleURLType" use="optional"/>
</extension></complexType>
<!-- Reine Typdefinitionen --><simpleType name="listOfPapers" base="ID" derivedBy="list"/>
<complexType name="authorType"><sequence>
<element name="firstname" type="string" minOccurs="0" maxOccurs="unbounded"/><element name="lastname" type="string"/>
</sequence><attribute name="age" type="humanAge" use="optional"/>
</complexType>
<complexType name="extendedAuthorType"><extension base="authorType">
<sequence><element name="email" type="string" minOccurs="0" maxOccurs="1"/>
</sequence><attribute name="homepage" type="simpleURLType" use="optional"/>
</extension></complexType>
49
Beispiel-Schema (3)
<simpleType name="humanAge" base="unsignedShort"><maxInclusive value="200"/> </simpleType>
<simpleType name="simpleURLType" base="string"><pattern value="http://([^/?#]*)?([^?#]*)(\?([^#]*))?(#(.*))?"/> </simpleType>
<simpleType name="humanAge" base="unsignedShort"><maxInclusive value="200"/> </simpleType>
<simpleType name="simpleURLType" base="string"><pattern value="http://([^/?#]*)?([^?#]*)(\?([^#]*))?(#(.*))?"/> </simpleType>
50
Beispiel-Schema (4)<!-- Konsistenzbedingungen -->
<unique name="eindeutigerAutorenName"><field xpath="bib/paper/author/firstname"/><field xpath="bib/paper/author/lastname"/>
</unique>
<key name="papierSchlüssel"><field xpath="bib/paper/@id"/>
</key>
<keyref name="papierFremdschlüssel" refer="papierSchlüssel"><field xpath="bib/paper/@references"/>
</keyref>
</schema>
<!-- Konsistenzbedingungen -->
<unique name="eindeutigerAutorenName"><field xpath="bib/paper/author/firstname"/><field xpath="bib/paper/author/lastname"/>
</unique>
<key name="papierSchlüssel"><field xpath="bib/paper/@id"/>
</key>
<keyref name="papierFremdschlüssel" refer="papierSchlüssel"><field xpath="bib/paper/@references"/>
</keyref>
</schema>
51
Bewertung von XML-Schema Syntax und Ausdruckskraft von XML-Schema sind sehr
umfangreich: Mit XML-Schema können Datenbasis-Schemata natürlicher
als mit DTDs spezifiziert werden. Es kann viel mehr Semantik in einem Schema eingefangen
werden als mit DTDs. Einzige Schwäche: wenig Vielfalt bei Konsistenzbedingungen.
XML-Schema wird jedoch noch nicht weitläufig unterstützt, während DTDs bereits zum Kernstandard von XML gehören.
Mehr zu XML-Schema im Web: http://www.w3.org/TR/xmlschema-0/ Einführung http://www.w3.org/TR/xmlschema-1/ Teil I: Strukturen http://www.w3.org/TR/xmlschema-2/ Teil II: Datentypen
52
Kapitel 7.3: Anfragesprachen
53
Polymorphe Operatoren in XML Xpath (2.0)
Hierarchischer Adressierungs- und Navigationsformalismus für XML-Dokumente
Deskriptive Pfadausdrücke im XML-Dokumentbaum Erlaubt einfache bis mittelkomplexe Anfragen In abgespeckter Form auch in anderen XML-Standards (vgl.
key in XML-Schema) XQuery (1.0)
Freie deskriptive Anfragen über XML-Dokumente Vorbild: SQL und OQL Baut auf XPath zur Adressierung/Navigation auf
Beides sind offene W3C-Standards und erfreuen sich reger Nutzung
Beide Standards sind aufeinander abgestimmt
54
XPath: Pfadausdrücke (1) Pfadausdruck ist eine Folge
von Schritten. Ausgangspunkt ist ein
Kontextknoten. Schritte definieren Pfad(e)
durch XML-Dokumentbaum: In jedem Schritt werden
Folgeknoten ausgewählt, die einen Teilbaum aufspannen.
Endergebnis (= Pfadenden) ist eine Folge von Knoten oder einfachen Werten
55
XPath: Pfadausdrücke (2) Grobstruktur eines Xpath-Pfadausdrucks:
/ Schritt_1 / Schritt_2 / ... / Schritt_n Jeder Schritt ist von der Bauart:
Achse:: Knotentest [Auswahlbedingung] Ausgehend vom Kontextknoten wird also in jedem Schritt
die Achse festgelegt, nach der wir von diesem Knoten aus weiter navigieren (z.B. zu einem Kind- oder Elternelement),
ein Knotentest vereinbart, der den Knotentyp einschränkt (z.B. Elemente eines bestimmten Namens), und
optional eine Auswahlbedingung angegeben, die die Auswahl an Knoten weiter einschränkt.
Die Ergebnisknoten bilden dann den Kontext für nächsten Schritt.
56
Xpath: Achsen (1)
Kontextknoten
syntaktisch wie Kinder behandelt
57
Xpath: Achsen (2)
Ausgangspunkt: der über Pfad erreichte Kontextknoten
58
Xpath: Achsen (3)
Achse = Kontextknoten selbst: Pfad/self :: ...
59
Xpath: Achsen (4)
Alle Attribute des Kontextknotens: Pfad/attribute :: ...
60
Xpath: Achsen (5)
Alle Kindknoten: Pfad/child :: ...
61
Xpath: Achsen (6)
Alle Nachfahren: Pfad/descendant :: ...
Weitere Achse: descendant-or-self = descendant ∪ self
62
Xpath: Achsen (7)
Der Elternknoten: Pfad/parent :: ...
63
Xpath: Achsen (8)
Alle Vorfahren: Pfad/ancestor :: ...
64
Xpath: Achsen (9)
Alle nachfolgenden Geschwisterknoten: Pfad/following-sibling :: ...
65
Xpath: Achsen (10)
Alle vorangehenden Geschwisterknoten: Pfad/preceding-sibling :: ...
66
Xpath: Achsen (11)
Alle nachfolgenden Knoten: Pfad/following :: ...
67
Xpath: Achsen (12)
Alle vorangehenden Knoten: Pfad/preceding :: ...
68
XPath: Knotentests
Ausgangspunkt: Durch die Achse bestimmte Knotenmenge
außer Text!
69
Abkürzungen
descendant-or-self::node()
Alle Kinder, die Elemente sindchild::node()
Alle Nachfolgeelemente und der Knoten selbstAm Anfang eines Pfades: Alle Elemente samt Wurzelknoten /
= parent::*
Fehlt node() oder @attribute, wird text() unterstellt
70
XPath: Auswahlbedingungen Erlaubt komplexere Einschränkungen Liefert nur Unterknoten, für die Auswahlbedingung wahr ist Mögliche Ausdrücke
Pfadausdruck e (e = true, wenn e nicht-leere Ergebnismenge adressiert)
e1 op e2 mit op z.B. =, !=, <, >, <=, >= f(e1), z.B:
position(): Aktuelle Position in der Liste von Unterelementen( [n] ist Kurzform für [position() = n] )
last(): Anzahl aller Unterknoten des aktuellen Knotens count(Pfadausdruck): Anzahl der Unterknoten, für die der
Pfadausdruck wahr ist id(Pfadausdruck): Liefert alle Elemente, deren id-Attribute einem
der Ergebniswerte des Pfadausdrucks entsprechen. So ist eine Dereferenzierung von IDREF-ID-Paaren möglich.
71
XPath: Beispiele (1)
bib
id=&o29paperid=&o24bookid=&o12paper
Founda-tions of Data-bases
title age=51author 1997year
Sergefirstname Abiteboullastname
age=40author pages
Victorfirstname Vianulastname 122first 133last
Nachname des Autors des zweiten Papiers:/ child:: bib / child:: paper [position()=2] / child:: author / child:: lastnameoder kurz: / bib / paper [2] / author / lastname
72
XPath: Beispiele (2) Knotentest schränkt Auswahl unterhalb eines Knotens
weiter ein Nachnamen aller Autoren von Papieren
/ bib / paper / author / lastname Nachnamen aller Autoren
/ bib / * / author / lastname
Impliziert: / bib / paper / author / lastname / text() Alle Unterelemente von author ohne etwaig eingefügte
Zusatztexte zum Autor / bib / paper / author / node()
bib
paperbookpaper
title author 1997year
Sergefirstname Abiteboullastname
author pages
Victorfirstname Vianulastname 122first 133last
73
XPath: Beispiele (3) Autor des Papiers mit Titel „Foundations of Databases“
paper [title = „Foundations of Databases“] / author Autoren-Nachname des Papiers mit id „o12“
paper [@id = „o12“] / author / lastname Alle Papiere und Bücher, die später als 1995 erschienen sind
/ bib / * [year > 1995] Alle Papiere mit mehr als einem Autor
paper [count(author) > 1] Das zweite Papier in unserer Bibliographie
/ bib / paper [position() = 2] oder / bib / paper [2] Alle Autoren
/ bib // author Alle Koautoren von „Serge Abiteboul“
/bib//author[lastname=„Abiteboul“]/parent::node()/author[lastname<>„Abiteboul“]
bib
paperbookpaper
title author 1997year
Sergefirstname Abiteboullastname
author pages
Victorfirstname Vianulastname 122first 133last
74
XQuery Aktuell: Version 1.0 Baut auf XPath 2.0 auf Anfragen in Anlehnung an SQL/OQL:
Folge von Klauseln: spezifiziert deskriptiv, wie Endergebnis der Anfrage aussehen soll
XQuery-Implementierung kann Weg, wie man zum Endergebnis gelangt, selbst bestimmen (Optimierung)
Benutzerdefinierte Funktionen Erweitern der Anfrageklauseln zur Turing-vollständigen
Programmiersprache Ermöglichen von rekursiven Anfragen
Zwei mögliche Repräsentationen Leicht lesbare: FLWR-Ausdrücke (im Folgenden vorgestellt) XML-konforme Syntax: XQueryX
75
XQuery: FLWR-Ausdrücke (1)
Sukzessives Binden jeweils einer Variablen an das Ergebnis eines Pfadausdrucks
Einmaliges Binden jeweils einer Variablen an das Ergebnis eines Pfadausdrucks (ggf. Menge).
Bedingungen an die gebundenen Variablen (Selektion).
An die Variablen gebundene Werte, die die Bedingung erfüllen, eingebettet in die gewünschte Form eines XML-Dokuments.
Grundmuster FLWR (gesprochen „flower“)
for Bindungsliste
let Bindungsliste
where Bedingung
return Ergebnis
76
XQuery: FLWR-Audrücke (2) Syntax im Detail:
for var1 in ausdruck1, ..., varn in ausdruckn
let varn+1 := ausdruckn+1, ..., varn+m := ausdruckn+m
where bedingungs-ausdruck
order by ausdruck ascending/descending
return xml-ausdruck Sonderfälle:
for/let kann mehrfach auftreten Variablenbindungen können dann aufeinander aufbauen
for kann entfallen let kann entfallen where kann entfallen order by kann entfallen Geschachtelte Anfragen: überall wo Ausdruck erwartet wird
77
bib
bookbookbook
Data on the Web
title author author
Serge
firstname
Abiteboul
lastname
Peter
firstname
Bunemann
lastname
XQuery: Beispiel (1)
author publisher
MorganKaufmann
name
...<Buch titel=„Data on the Web“ /><Buch titel=„Transaction Processing“ /><Buch titel=„Active Database Systems“ /><Buch titel=„SQL 1999“ /><Buch titel=„Practical Digital Libraries“ /><Buch titel=„Readings in Object Oriented Database Systems“ />...
...<Buch titel=„Data on the Web“ /><Buch titel=„Transaction Processing“ /><Buch titel=„Active Database Systems“ /><Buch titel=„SQL 1999“ /><Buch titel=„Practical Digital Libraries“ /><Buch titel=„Readings in Object Oriented Database Systems“ />...
Ergebnis
„Alle Bücher, die im Morgan-Kaufmann-Verlag veröffentlicht wurden.“„Alle Bücher, die im Morgan-Kaufmann-Verlag veröffentlicht wurden.“
for $b in /bib/bookwhere $b/publisher/name = „Morgan Kaufmann“return <Buch titel=„{$b/title}“ />
for $b in /bib/bookwhere $b/publisher/name = „Morgan Kaufmann“return <Buch titel=„{$b/title}“ />
78
bib
bookbookbook
Data on the Web
title author author
Serge
firstname
Abiteboul
lastname
Peter
firstname
Bunemann
lastname
XQuery: Beispiel (2)
author publisher
Morgan-Kaufmann
name
...<Buch titel=„Data on the Web“>
<Autoren>Abiteboul Buneman Suciu</Autoren></Buch><Buch titel=„Transaction Processing“>
<Autoren>Gray Reuter</Autoren></Buch>...
...<Buch titel=„Data on the Web“>
<Autoren>Abiteboul Buneman Suciu</Autoren></Buch><Buch titel=„Transaction Processing“>
<Autoren>Gray Reuter</Autoren></Buch>...
Ergebnis
„Alle Bücher, die im Morgan-Kaufmann-Verlag veröffentlicht wurden, inklusive ihrer Autoren.“„Alle Bücher, die im Morgan-Kaufmann-Verlag veröffentlicht wurden, inklusive ihrer Autoren.“
for $b in /bib/booklet $a := $b/authorwhere $b/publisher/name = „Morgan Kaufmann“return <Buch titel=„{$b/title}“>
<Autoren>{$a/lastname}</Autoren></Buch>
for $b in /bib/booklet $a := $b/authorwhere $b/publisher/name = „Morgan Kaufmann“return <Buch titel=„{$b/title}“>
<Autoren>{$a/lastname}</Autoren></Buch>
79
bib
bookbookbook
Data on the Web
title author author
Serge
firstname
Abiteboul
lastname
Peter
firstname
Bunemann
lastname
XQuery: Beispiel (3a)
author publisher
Morgan-Kaufmann
name
...<Paar>
<Autor>Buneman</Autor><Buch>Data on the Web</Buch>
</Paar><Paar>
<Autor>Abiteboul</Autor><Buch>Data on the Web</Buch>
</Paar>...
...<Paar>
<Autor>Buneman</Autor><Buch>Data on the Web</Buch>
</Paar><Paar>
<Autor>Abiteboul</Autor><Buch>Data on the Web</Buch>
</Paar>...
Ergebnis
„Alle Autoren-Bücher-Paare aus dem Morgan-Kaufmann-Verlag.“ (Join!)„Alle Autoren-Bücher-Paare aus dem Morgan-Kaufmann-Verlag.“ (Join!)
for $b in /bib/book, $a in /bib//authorwhere $b/publisher/name = „Morgan Kaufmann“ and $b/author = $areturn <Paar>
<Autor>{$a/lastname}</Autor><Buch>{$b/title}</Buch>
</Paar>
for $b in /bib/book, $a in /bib//authorwhere $b/publisher/name = „Morgan Kaufmann“ and $b/author = $areturn <Paar>
<Autor>{$a/lastname}</Autor><Buch>{$b/title}</Buch>
</Paar>
Einfacher Join
80
bib
bookbookbook
Data on the Web
title author author
Serge
firstname
Abiteboul
lastname
Peter
firstname
Bunemann
lastname
XQuery: Beispiel (3b)
author publisher
Morgan-Kaufmann
name
...<Paar>
<Autor>Buneman</Autor><Buch>Data on the Web</Buch>
</Paar><Paar>
<Autor>Abiteboul</Autor><Buch>Data on the Web</Buch>
</Paar>...
...<Paar>
<Autor>Buneman</Autor><Buch>Data on the Web</Buch>
</Paar><Paar>
<Autor>Abiteboul</Autor><Buch>Data on the Web</Buch>
</Paar>...
Ergebnis
„Alle Autoren-Bücher-Paare aus dem Morgan-Kaufmann-Verlag.“ (Join!)„Alle Autoren-Bücher-Paare aus dem Morgan-Kaufmann-Verlag.“ (Join!)
for $b in /bib/book, $a in $b/authorwhere $b/publisher/name = „Morgan Kaufmann“return <Paar>
<Autor>{$a/lastname}</Autor><Buch>{$b/title}</Buch>
</Paar>
for $b in /bib/book, $a in $b/authorwhere $b/publisher/name = „Morgan Kaufmann“return <Paar>
<Autor>{$a/lastname}</Autor><Buch>{$b/title}</Buch>
</Paar>
Korrelierter Join
81
bib
bookbookbook
Data on the Web
title author author
Serge
firstname
Abiteboul
lastname
Peter
firstname
Bunemann
lastname
XQuery: Beispiel (4)
author publisher
Morgan-Kaufmann
name
„Alle Autoren inklusive aller ihrer Bücher und Sortierung nach Autorname.“„Alle Autoren inklusive aller ihrer Bücher und Sortierung nach Autorname.“
for $a in distinct-values(/bib//author)order by $areturn <Autor>
<Name >{$a/lastname}</Name> <Buchliste>
{ for $b in /bib/book[author=$a]return <Buch titel=„{$b/title}“ /Buch> }
</Buchliste></Autor>
for $a in distinct-values(/bib//author)order by $areturn <Autor>
<Name >{$a/lastname}</Name> <Buchliste>
{ for $b in /bib/book[author=$a]return <Buch titel=„{$b/title}“ /Buch> }
</Buchliste></Autor>
...<Autor>
<Name>Abiteboul</Name><Buchliste>
<Buch titel=„Data on the Web“/><Buch titel=„Foundations of Databases“/>
</Buchliste></Autor>...
...<Autor>
<Name>Abiteboul</Name><Buchliste>
<Buch titel=„Data on the Web“/><Buch titel=„Foundations of Databases“/>
</Buchliste></Autor>...
Ergebnis
Verschachtelte Anfrage
82
bib
bookbookbook
Data on the Web
title author author
Serge
firstname
Abiteboul
lastname
Peter
firstname
Bunemann
lastname
XQuery: Beispiel (5)
author publisher
Morgan-Kaufmann
name
„Alle Bücher mit der Anzahl ihrer Autoren, sortiert nach der Anzahl der Autoren.“„Alle Bücher mit der Anzahl ihrer Autoren, sortiert nach der Anzahl der Autoren.“
for $b in /bib/book/let $a := $b/authororder by count($a) descendingreturn <Buch titel=„{$b/title}“> {count($a)} </Buch>
for $b in /bib/book/let $a := $b/authororder by count($a) descendingreturn <Buch titel=„{$b/title}“> {count($a)} </Buch>
Aggregations-Funktion
...<Buch titel=„Data on the Web“> 3 </Buch><Buch titel=„Active Database Systems“> 3 </Buch><Buch titel=„Readings in Object Oriented Database Systems“> 3 </Buch><Buch titel=„Transaction Processing“> 2 </Buch><Buch titel=„SQL 1999“> 2 </Buch> <Buch titel=„Practical Digital Libraries“> 1 </Buch> ...
...<Buch titel=„Data on the Web“> 3 </Buch><Buch titel=„Active Database Systems“> 3 </Buch><Buch titel=„Readings in Object Oriented Database Systems“> 3 </Buch><Buch titel=„Transaction Processing“> 2 </Buch><Buch titel=„SQL 1999“> 2 </Buch> <Buch titel=„Practical Digital Libraries“> 1 </Buch> ...
Ergebnis
83
bib
bookbookbook
Data on the Web
title author author
Serge
firstname
Abiteboul
lastname
Peter
firstname
Bunemann
lastname
XQuery: Funktionen (Beispiel) [1]
author publisher
Morgan-Kaufmann
name
„Die Funktion soll zu einem Autor alle Bücher oder sonstigen Schriftwerke finden, die dieser jemals verfasst hat. Sortiert werden soll zuerst nach dem Jahr (absteigend), danach nach dem Titel (alphabethisch = aufsteigend).“
„Die Funktion soll zu einem Autor alle Bücher oder sonstigen Schriftwerke finden, die dieser jemals verfasst hat. Sortiert werden soll zuerst nach dem Jahr (absteigend), danach nach dem Titel (alphabethisch = aufsteigend).“
define function werkliste($autor as element author) as node*{
for $x in /bib/*where some $e in $x/author satisfies $e = $autororder by $x/year descending, $x/titlereturn {$x}
{
define function werkliste($autor as element author) as node*{
for $x in /bib/*where some $e in $x/author satisfies $e = $autororder by $x/year descending, $x/titlereturn {$x}
{
for $a in /bib//authorreturn <Autor>
<Name>{$a/lastname}</Name><Werkliste>
{werkliste($a)}</Werkliste>
</Autor>
for $a in /bib//authorreturn <Autor>
<Name>{$a/lastname}</Name><Werkliste>
{werkliste($a)}</Werkliste>
</Autor>
Funktionsdeklarationi.d.R. im Prolog eines XQuery-Blockes
Funktionsaufrufbeliebig innerhalb einer XQuery-Definition
84
bib
bookbookbook
Data on the Web
title author author
Serge
firstname
Abiteboul
lastname
Peter
firstname
Bunemann
lastname
XQuery: Funktionen (Beispiel) [2]
author publisher
Morgan-Kaufmann
name
define function werkliste($autor as element author) as node*{
for $x in /bib/*where some $e in $x/author satisfies $e = $autororder by $x/year descending, $x/titlereturn {$x}
{
define function werkliste($autor as element author) as node*{
for $x in /bib/*where some $e in $x/author satisfies $e = $autororder by $x/year descending, $x/titlereturn {$x}
{
Funktionsname(werkliste)
Parametername($autor)
Parametertyp(author-Element)
Rückgabetyp(immer Liste!, hier:
Liste beliebiger Knoten)
Kardinalität(„*“ = 0..∞)
(1) Binde x an alle Kind- Knoten von bib (2) Schränke Auswahl ein auf:
{x | ∃e {∈ x/author}: e=$autor}
(3) Sortiere nach (2) gefilterte x absteigend1. nach Jahr2. nach Titel
(4) Gib die Liste der gefilterten x aus.
Die Klammern „{…}“ kennzeichnen einen sog. berechneten Konstruktor.So werden nicht die Originalknoten sondern vollständige, rekursive Kopien (sog. „Deep-Copies“) mit neuen Knoten-Identitäten zurückgeliefert!In den meisten Fällen ist der Unterschied zu einem direkten Konstruktor (ohne Klammern) aber vernachlässigbar (so auch hier!)
85
bib
bookbookbook
Data on the Web
title author author
Serge
firstname
Abiteboul
lastname
Peter
firstname
Bunemann
lastname
XQuery: Funktionen (Beispiel) [3]
author publisher
Morgan-Kaufmann
name
„Die Funktion soll zu einem Autor alle Bücher oder sonstigen Schriftwerke finden, die dieser jemals verfasst hat. Sortiert werden soll zuerst nach dem Jahr (absteigend), danach nach dem Titel (alphabethisch = aufsteigend).“
„Die Funktion soll zu einem Autor alle Bücher oder sonstigen Schriftwerke finden, die dieser jemals verfasst hat. Sortiert werden soll zuerst nach dem Jahr (absteigend), danach nach dem Titel (alphabethisch = aufsteigend).“
define function werkliste($autor as element author) as node*{
for $x in /bib/*where some $e in $x/author satisfies $e = $autororder by $x/year descending, $x/titlereturn {$x}
{
define function werkliste($autor as element author) as node*{
for $x in /bib/*where some $e in $x/author satisfies $e = $autororder by $x/year descending, $x/titlereturn {$x}
{
for $a in /bib//authorreturn <Autor>
<Name>{$a/lastname}</Name><Werkliste>
{werkliste($a)}</Werkliste>
</Autor>
for $a in /bib//authorreturn <Autor>
<Name>{$a/lastname}</Name><Werkliste>
{werkliste($a)}</Werkliste>
</Autor>
...<Autor>
<Name>Abiteboul</Name><Werkliste>
<book><title>Data on the Web<title/>...<paper>...<title>A Logical View of Structured Files</title>...
...</Werkliste>
</Autor>...
...<Autor>
<Name>Abiteboul</Name><Werkliste>
<book><title>Data on the Web<title/>...<paper>...<title>A Logical View of Structured Files</title>...
...</Werkliste>
</Autor>...
Ergebnis
Annahme: es existieren neben book-Knoten auch z.B. paper-Knoten unterhalb von bib