1 teil i datenmodelle kapitel 7: semistrukturierte modelle

Post on 05-Apr-2015

114 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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> sab@abc.com </email>

email address may be wrong!</author>

<author><firstname> Serge </firstname>

<lastname> Abiteboul </lastname> <email> sab@abc.com </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=“sab@abc.com”/><author firstname=“Serge” lastname=“Abiteboul” email=“sab@abc.com”/>

Attribut email

Weitere denkbare Beschreibung derselben Daten:

<author email=“sab@abc.com”><firstname> Serge </firstname> <lastname> Abiteboul </lastname>

</author>

<author email=“sab@abc.com”><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

top related