Semistrukturierte Daten 2 - SQL/XML

Werbung
Semistrukturierte Daten 2
SS 2006
Semistrukturierte Daten 2
SQL/XML
Reinhard Pichler
11. Mai 2006
Reinhard Pichler
10. Mai 2006
Seite 1
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.
Relationale Speicherung und Auswertung
Überblick
Wie können die Inhalte einer Datenbank als XML-Dokumente
exportiert werden (Publizieren von XML)?
Wie können die Inhalte eines XML-Dokumentes in eine Datenbank
importiert werden (Speichern von XML in Datenbanken)?
Wie können Anfragen über XML-Dokumenten in SQL-Anfragen
abgebildet werden?
Reinhard Pichler
10. Mai 2006
Seite 2
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
SQL/XML
SQL/XML ist Teil des SQL:2003-Standards
XML kann direkt als Zeichenkette vom Typ VARCHAR oder CLOB
(CHARACTER LARGE OBJECT) gespeichert werden.
SQL/XML erweitert die zulässigen Datentypen in SQL um den
vordefinierten Datentyp XML, so dass ganze XML-Dokumente,
Elemente oder auch Mengen von Elementen als Werte vom Typ
XML
gespeichert,
mittels spezieller Operatoren innerhalb SQL erzeugt werden können.
Die Integration von XPath und XQuery in SQL wird prinzipiell
möglich, ist aber noch nicht standardisiert.
Reinhard Pichler
10. Mai 2006
Seite 3
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
Datentyp XML
XMLPARSE() wandelt ein als Zeichenkette gegebenes
XML-Dokument in einen Wert vom Datentyp XML.
XMLSERIALIZE() wandelt einen Wert vom Typ XML zu einer
Zeichenkette.
SQL/XML definiert eine Reihe von weiteren Funktionen, die als Teil
eines Select-From-Where Ausdrucks das Publizieren von XML aus
einer Datenbank mittels SQL erlauben.
Reinhard Pichler
10. Mai 2006
Seite 4
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
Relationen
Provinz
Land
PName
LCode
Fläche
Baden
Berlin
D
D
15
0,9
LCode
LName
HStadt
Fläche
D
Germany
Berlin
357
SName
PName
LCode
Einwohner
LGrad
BGrad
Berlin
Freiburg
Karlsruhe
Berlin
Baden
Baden
D
D
D
3472
198
277
13,2
7,51
8,24
52,45
47,59
49,03
Stadt
Lage
Mitglied
LCode
Kontinent
Prozent
LCode
Organisation
Art
D
Europe
100
D
EU
member
Reinhard Pichler
10. Mai 2006
Seite 5
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
Select-From-Where mit SQL/XML-Funktionen
SELECT
XMLELEMENT (
NAME Land,
XMLATTRIBUTES (L.LCode AS LCode),
XMLELEMENT (NAME LName, L.LName),
( SELECT XMLAGG (
XMLELEMENT
( NAME Provinz,
XMLELEMENT (NAME PName, P.PName),
XMLELEMENT (NAME Fläche, P.Fläche),
XMLAGG
( XMLELEMENT
( NAME Stadt,
XMLELEMENT (NAME SName, S.SName),
XMLELEMENT (NAME Einwohner, S.Einwohner)
)
ORDER BY S.Einwohner DESC
)
) )
FROM Provinz P, Stadt S
WHERE P.LCode = L.LCode and P.LCode = S.LCode and
P.PName = S.PName
GROUP BY P.PName, P.Fläche
),
Reinhard Pichler
10. Mai 2006
Seite 6
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
( SELECT
XMLELEMENT
( NAME Lage,
XMLELEMENT (NAME Kontinent, La.Kontinent),
XMLELEMENT (NAME Prozent, La.Prozent)
)
FROM Lage La
WHERE La.LCode = L.LCode
),
( SELECT
XMLELEMENT
( NAME Mitglied,
XMLATTRIBUTES
( M.Organisation AS Organisation,
M.Art AS Art
)
)
FROM Mitglied M
WHERE M.LCode = L.LCode
)
) AS Mondial
FROM Land L
Reinhard Pichler
10. Mai 2006
Seite 7
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
XML-Dokument
<Mondial>
<Land LCode = ’’D’’>
<LName>Germany</LName>
<Provinz>
<PName>Baden</PName>
<Flaeche>15</Fläche>
<Stadt>
<SName>Karlsruhe</SName>
<Einwohner>277</Einwohner>
</Stadt>
<Stadt>
<SName>Freiburg</SName>
<Einwohner>198</Einwohner>
</Stadt>
</Provinz>
<Provinz>
<PName>Berlin</PName>
<Flaeche>0,9</Fläche>
<Stadt>
<SName>Berlin</SName>
<Einwohner>3472</Einwohner>
</Stadt>
</Provinz>
<Lage>
<Kontinent>Europe</Kontinent>
<Prozent>100</Prozent>
</Lage>
<Mitglied Organisation = ’’EU’’
Art = ’’member’’/>
</Land>
</Mondial>
Reinhard Pichler
10. Mai 2006
Seite 8
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
XMLELEMENT()
XMLELEMENT() erzeugt Elemente.
Das erste Argument von XMLELEMENT definiert den Namen des
Elementes.
Das zweite Argument ist optional und dient zur Definition der
zugehörigen Attribute.
Der Rest definiert den Elementinhalt.
Ein leeres Element:
XMLELEMENT
(
NAME Mitglied,
XMLATTRIBUTES (
M.Organisation AS Organisation,
M.Art AS Art
)
)
Sind Attributnamen und Spaltennamen identisch, dann kann eine
abgekürzte Schreibweise gewählt werden, hier
XMLATTRIBUTES(M.Organisation, M.Art)
Reinhard Pichler
10. Mai 2006
Seite 9
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
XMLELEMENT()
Der Inhalt eines Elements kann im Allgemeinen selbst wiederum
mittels SQL/XML-Funktionen definiert werden.
SELECT
XMLELEMENT (
NAME Lage,
XMLELEMENT (NAME Kontinent, La.Kontinent),
XMLELEMENT (NAME Prozent, La.Prozent)
)
FROM Lage La
WHERE La.LCode = L.LCode
Reinhard Pichler
10. Mai 2006
Seite 10
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
XMLAGG()
Ein Aufruf von XMLELEMENT() als Content eines anderen
Elements darf pro Parent-Element immer nur ein Subelement liefern.
Ansonsten gibt es einen Fehler (in Oracle: “single-row subquery
returns more than one row”), z.B.:
SELECT XMLELEMENT ( NAME Land,
XMLELEMENT (NAME LName, L.LName),
( SELECT XMLELEMENT (NAME Mitglied, M.Mitglied)
FROM Mitglied M WHERE M.LCode = L.LCode )
Mit XMLAGG() dürfen mehrere Elemente, die mit einem
einzelnen XMLELEMENT()-Aufruf erzeugt werden,
gruppiert werden, z.B.:
SELECT XMLELEMENT ( NAME Land,
XMLELEMENT (NAME LName, L.LName),
( SELECT XMLAGG ( XMLELEMENT (NAME Mitglied, M.Mitglied) )
FROM Mitglied M WHERE M.LCode = L.LCode )
Reinhard Pichler
10. Mai 2006
Seite 11
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
XMLAGG()
XMLAGG() erzeugt zu jeder mittels GROUP BY definierten Gruppe von
Zeilen einer Tabelle eine Folge von Elementen.
SELECT
XMLELEMENT (
NAME Provinz,
XMLELEMENT (NAME PName, P.PName),
XMLELEMENT (NAME Fläche, P.Fläche),
XMLAGG (
XMLELEMENT (
NAME Stadt,
XMLELEMENT (NAME SName, S.SName),
XMLELEMENT (NAME Einwohner, S.Einwohner)
)
)
)
FROM Provinz P, Stadt S
WHERE P.LCode = L.LCode and P.LCode = S.LCode and
P.PName = S.PName
GROUP BY P.PName, P.Fläche
Reinhard Pichler
10. Mai 2006
Seite 12
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
XMLCONCAT()
XMLAGG erlaubt lediglich ein einziges Argument, das, jedoch mehrere
Kindelemente haben kann.
Mittels XMLCONCAT() kann eine Folge von Elementen mittels
Konkatenation ihrer Inhalte erzeugt werden.
XMLAGG (
XMLCONCAT (
XMLELEMENT (NAME SName, S.SName),
XMLELEMENT (NAME Einwohner, S.Einwohner)
)
)
Reinhard Pichler
10. Mai 2006
Seite 13
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
XMLFOREST()
Alternativ zu XMLCONCAT():
XMLAGG (
XMLFOREST (
S.SName AS SName,
S.Einwohner AS Einwohner
)
)
Die Elementnamen ergeben sich implizit aus den betreffenden
Spaltenbezeichnern, oder explizit über die AS-Klausel.
Abgekürzte Schreibweise: XMLFOREST(S.SName, S.Einwohner)
Die einzelnen Elemente haben keine Struktur und keine Attribute.
Reinhard Pichler
10. Mai 2006
Seite 14
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
Abbildungsregeln
SQL/XML enthält Abbildungsregeln,
um Tabellen generisch in XML-Dokumente zu transformieren,
um SQL-Datentypen XML-Schema Datentypen zuzuordnen, deren
Werte die in SQL zulässigen Werte möglichst exakt darstellen.
Reinhard Pichler
10. Mai 2006
Seite 15
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
Abbildungsregeln für Tabellen
Beispiele:
<Land>
<row>
<LName>France</LName>
<LCode>F</LCode>
<HStadt>Paris</HStadt>
<Fläche>547</Fläche>
</row>
<row>
<LName>Germany</LName>
<LCode>D</LCode>
<HStadt>Berlin</HStadt>
<Fläche>357</Fläche>
</row>
</Land>
<Land>
<LName>France</LName>
<LCode>F</LCode>
<HStadt>Paris</HStadt>
<Fläche>547</Fläche>
</Land>
<Land>
<LName>Germany</LName>
<LCode>D</LCode>
<HStadt>Berlin</HStadt>
<Fläche>357</Fläche>
</Land>
(a)
Reinhard Pichler
(b)
10. Mai 2006
Seite 16
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
Abbildungsregeln für Datentypen
Abbildungsregeln, um gegebenen Basis-SQL-Datentypen, wie
CHARACTER, NUMERIC, DATE und konstruierten Datentypen, wie
ROW, ARRAY, MULTISET, jeweils XML-Schema Datentypen
zuzuordnen.
Jedem Basis-SQL-Datentyp wird ein globaler XML-Schema
Datentyp zugeordnet, wobei sich der Zusammenhang zwischen den
einzelnen Typen über eine normierte Namensgebung ergibt.
<simpleType name = ’’INTEGER’’>
<restriction base = ’’int’’/>
</simpleType>
Reinhard Pichler
<simpleType name = ’’CHAR 50’’>
<restriction base = ’’string’’>
<length value = ’’50’’/>
</restriction>
</simpleType>
10. Mai 2006
Seite 17
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
Einige Unterscheidungen in SQL, wie beispielsweise CHARACTER VARYING
versus CHARACTER LARGE OBJECT, haben keine Entsprechung in
XML-Schema. Solche und andere Besonderheiten können in Form von
Annotationen der XML-Schema Datentypen festgehalten werden, wobei
SQL/XML die möglichen Inhalte festlegt.
<simpleType name = ’’CHAR 50’’>
<annotation>
<appinfo>
<sqltype kind = ’’PREDEFINED’’ name = ’’CHAR’’ length = ’’50’’
characterSetName = ’’LATIN1’’ collation = ’’DEUTSCH’’/>
</appinfo>
</annotation>
<restriction base = ’’string’’>
<length value = ’’50’’/>
</restriction>
</simpleType>
Reinhard Pichler
10. Mai 2006
Seite 18
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
konstruierter Datentyp ROW
<sequence>
<element name = ’’LName’’ nillable = ’’true’’
minoccurs = ’’1’’ maxoccurs = ’’1’’ type = ’’VARCHAR 50’’>
<element name = ’’LCode’’
minoccurs = ’’1’’ maxoccurs = ’’1’’ type = ’’CHAR 5’’>
</sequence>
Reinhard Pichler
10. Mai 2006
Seite 19
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.1. SQL/XML
XML-Datentyp zur Tabelle Land
<complexType name = ’’RowType.Mondial.Land’’ >
<sequence>
<element name = ’’LName’’ nillable = ’’true’’
minoccurs = ’’1’’ maxoccurs = ’’1’’ type = ’’VARCHAR 50’’>
<element name = ’’LCode’’
minoccurs = ’’1’’ maxoccurs = ’’1’’ type = ’’CHAR 5’’>
</sequence>
</complexType>
<complexType name = ’’TableType.Mondial.Land’’>
<sequence>
<element name = ’’row’’ type = ’’RowType.Mondial.Land
minoccurs = ’’0’’ maxoccurs = ’’unbounded’’/>
</sequence>
</complexType>
Reinhard Pichler
10. Mai 2006
Seite 20
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.2. Speichern von XML
Speichern von XML
generelle Techniken
strukturorientierte Speicherung: Jedem XML-Dokument wird ein
(erweiterter) XML-Baum zugeordnet; die resultierende Tabelle
nennen wir XML-Kantentabelle.
inhaltsorientierte Speicherung: In Abhängigkeit vom Typ des
XML-Dokumentes ist ein möglichst gut geeignetes relationales
Schema zu finden. Hierarchische Beziehungen im XML-Dokument
sind geeignet durch Fremdschlüsselbeziehungen zu repräsentieren.
Reinhard Pichler
10. Mai 2006
Seite 21
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.2. Speichern von XML
strukturorientierte Speicherung
XML-Kantentabelle
Reinhard Pichler
Knoten
Vorgänger
Ordnung
Name
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.
.
.
null
0
1
2
2
1
5
6
5
8
5
10
11
10
13
5
15
16
15
18
.
.
.
1
1
1
Mondial
Land
LName
@LCode
1
2
1
1
2
1
3
1
1
2
1
4
1
1
2
1
.
.
.
10. Mai 2006
Wert
D
Germany
Provinz
PName
Baden
Fläche
15
Stadt
SName
Freiburg
Einwohner
198
Stadt
SName
Karlsruhe
Einwohner
.
.
.
277
.
.
.
Seite 22
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.2. Speichern von XML
XML-Bäume sind geordnete Bäume.
Ordnung durch Nummerierung der Knoten in Dokument-Ordnung,
Alternativ Ordnung der Kindknoten eines Knotens.
Die Speicherung eines XML-Dokumentes als XML-Baum in einer
einzigen Tabelle ist eine generische Technik, die für jedes
XML-Dokument angewendet werden kann. Geeignet wenn zu den
Dokumenten keine Typ-Information bekannt ist, oder die Struktur
der zu speichernden Dokumente stark variiert.
Nachteile:
Alle Typ-Informationen gehen verloren.
Außerdem macht das Halten sämtlicher Informationen in einer
Tabelle die Formulierung von Anfragen und ihre effiziente
Auswertung problematisch: Auswertung des ’//’-Operators eines
XPath-Ausdrucks mittels SQL verlangt Rekursion im Allgemeinen.
Reinhard Pichler
10. Mai 2006
Seite 23
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.2. Speichern von XML
inhaltsorientierte Speicherung
Inverses Problem zum Publizieren von XML aus einer Datenbank.
Jedem Elementtyp, zu dem Kindelemente oder Attribute existieren, wird
eine Tabelle zugeordnet.
Allen skalaren Attributen und allen Kindelementen einfachen Typs, die
nicht mehrfach auftreten können, wird jeweils eine Spalte zugeordnet.
Lässt sich mit diesen Spalten kein geeigneter Primärschlüssel definieren,
so wird eine zusätzliche Primärschlüsselspalte aufgenommen.
Mehrwertigen Attributen und mehrfach auftretenden Kindelementen
einfachen Typs, bzw. Kindelementen komplexen Typs, wird ebenfalls eine
eigene Tabelle zugeordnet.
Der Bezug zu dem jeweiligen Parent-Element wird durch Hinzunahme
seines Primärschlüssels als Fremdschlüssel realisiert.
Ein so erzeugtes Datenbankschema kann nur als ein Ausgangspunkt für
einen umfassenderen Datenbankentwurf gelten.
Reinhard Pichler
10. Mai 2006
Seite 24
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.2. Speichern von XML
XML-Dokument
<Mondial>
<Land LCode = ’’D’’>
<LName>Germany</LName>
<Provinz>
<PName>Baden</PName>
<Flaeche>15</Fläche>
<Stadt>
<SName>Freiburg</SName>
<Einwohner>198</Einwohner>
</Stadt>
<Stadt>
<SName>Karlsruhe</SName>
<Einwohner>277</Einwohner>
</Stadt>
</Provinz>
<Provinz>
<PName>Berlin</PName>
<Flaeche>0,9</Fläche>
<Stadt>
<SName>Berlin</SName>
<Einwohner>3472</Einwohner>
</Stadt>
</Provinz>
<Lage>
<Kontinent>Europe</Kontinent>
<Prozent>100</Prozent>
</Lage>
<Mitglied Organisation = ’’EU’’
Art = ’’member’’/>
</Land>
</Mondial>
Reinhard Pichler
10. Mai 2006
Seite 25
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.2. Speichern von XML
Relationen
Provinz
Land
LCode
LName
D
Germany
PName
LCode
Fläche
Baden
Berlin
D
D
15
0,9
Stadt
SName
PName
LCode
Einwohner
Berlin
Freiburg
Karlsruhe
Berlin
Baden
Baden
D
D
D
3472
198
277
Lage
Mitglied
LCode
Kontinent
Prozent
LCode
Organisation
Art
D
Europe
100
D
EU
member
Reinhard Pichler
10. Mai 2006
Seite 26
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.3. XPath und SQL
XPath und SQL
Anfragen nach den Nachfolgern oder Vorgängern eines Knotens eines
Baumes können in einem geschlossenen SQL-Ausdruck im Allgemeinen
nur mittels Rekursion ausgedrückt werden.
Anfragen dieser Art können mit einer festen Anzahl
Verbundoperationen ausgewertet werden,
wenn wir etwas mehr Informationen über die einzelnen Knoten
vorsehen.
Quelle: XRel: A Path-Based Approach to Storage and Retrieval of XML
Documents Using Relational Databases, M. Yoshikawa et al., ACM ToIT,
Vol. 1, No. 1, 2001.
Reinhard Pichler
10. Mai 2006
Seite 27
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.3. XPath und SQL
Den einzelnen Knoten eines XML-Baumes werden Intervalle so
zugeordnet, dass direkte und indirekte Vorgänger und
Nachfolgerbeziehungen durch Analyse der Intervalle ohne Rekursion
entschieden werden können.
Des Weiteren nützen wir die Pattern-Matching-Möglichkeiten von
SQL so aus, dass Lokationspfade, die keine Prädikate enthalten,
ohne Verbundoperationen ausgewertet werden können.
Reinhard Pichler
10. Mai 2006
Seite 28
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.3. XPath und SQL
Zur Repräsentation eines XML-Baumes führen wir unterschiedliche
Tabellen ein.
Für Element-, Attribut- und Textknoten werden jeweils eigene
Tabellen verwendet.
Zusätzlich werden alle über dem XML-Baum ausdrückbaren
einfachen XPath-Ausdrücke, die ausgehend von der Wurzel ein Blatt
lokalisieren, in einer eigenen weiteren Tabelle gespeichert.
Ein einfacher XPath-Ausdruck ist eine Folge von Ausdrücken der
Form #/EName und #/@Attr, wobei ’#’ ein für das spätere
Pattern-Matching benötigtes Trennzeichen ist.
Reinhard Pichler
10. Mai 2006
Seite 29
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.3. XPath und SQL
Element
Start End PId
0
9
25
47
56
76
95
102
125
159
166
190
234
243
264
284
291
312
357
363
392
421
480
470
46
233
75
94
158
124
150
223
189
215
356
263
283
346
311
338
420
391
413
462
Reinhard Pichler
1
2
4
5
6
7
8
9
10
8
9
10
5
6
7
8
9
10
11
12
13
14
Text
Start End
Attribut
PId Start End Wert
3
15
16
10
422
422
10
D
422 Europe
422 member
32
63
84
109
136
173
201
250
272
298
323
374
401
10. Mai 2006
Wert
38 Germany
67
Baden
85
15
116 Freiburg
138
198
181 Karlsruhe
203
277
255 Berlin
274
0,9
303 Berlin
326
3472
379 Europe
403
100
PId
4
6
7
9
10
9
10
6
7
9
10
12
13
Seite 30
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.3. XPath und SQL
Pfad
PId
PathExpr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#/Mondial
#/Mondial#/Land
#/Mondial#/Land#/@LCode
#/Mondial#/Land#/LName
#/Mondial#/Land#/Provinz
#/Mondial#/Land#/Provinz#/PName
#/Mondial#/Land#/Provinz#/Fläche
#/Mondial#/Land#/Provinz#/Stadt
#/Mondial#/Land#/Provinz#/Stadt#/SName
#/Mondial#/Land#/Provinz#/Stadt#/Einwohner
#/Mondial#/Land#/Lage
#/Mondial#/Land#/Lage#/Kontinent
#/Mondial#/Land#/Lage#/Prozent
#/Mondial#/Land#/Mitglied
#/Mondial#/Land#/Mitglied#/@Organisation
#/Mondial#/Land#/Mitglied#/@Art
Reinhard Pichler
10. Mai 2006
Seite 31
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.3. XPath und SQL
Die Region eines Text- und Elementknotens ist ein Intervall der
Form [a, b], wobei a die Start- und b die Endposition der
zugehörigen Tags im Dokument ist.
Die Region eines Attributknotens ist gegeben durch zwei identische
Zahlen, die gleich der Startposition seines Parent-Elements erhöht
um 1 sind. Hat ein Element mehrere Attribute, so ist in dieser Weise
keine Ordnung auf den Attributen impliziert.
Um die Zuordnung der Element-, Attribut- und Textknoten in den
Tabellen zu ihren Positionen im Dokument zu rekonstruieren, sind
lediglich die relativen Verhältnisse der Werte zu Start von
Bedeutung.
Reinhard Pichler
10. Mai 2006
Seite 32
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.3. XPath und SQL
/Mondial/Land/Provinz/Stadt:
SELECT E.Start, E.End
FROM Element E, Pfad P
WHERE P.PathExp LIKE ’#/Mondial#/Land#/Provinz#/Stadt’ AND
E.PId = P.PId
/Mondial//Stadt:
SELECT E.Start, E.End
FROM Element E, Pfad P
WHERE P.PathExp LIKE ’#/Mondial#%/Stadt’ AND
E.PId = P.PId
Reinhard Pichler
10. Mai 2006
Seite 33
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.3. XPath und SQL
/Mondial//Provinz//SName:
SELECT E.Start, E.End
FROM Element E, Pfad P
WHERE P.PathExp LIKE ’#/Mondial#%/Provinz#%/SName’ AND
E.PId = P.PId;
Reinhard Pichler
10. Mai 2006
Seite 34
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.3. XPath und SQL
(//Stadt)[2]:
SELECT E.S, E.E
FROM Element E, Pfad P
WHERE P.PathExpr LIKE ’%/Stadt’ AND E.PId = P.PId
AND 1 =
( SELECT count(*)
FROM Element EE
WHERE EE.S < E.S AND
EE.PId = E.PId )
Reinhard Pichler
10. Mai 2006
Seite 35
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.3. XPath und SQL
//Land[Lage/Kontinent = "Europe"]//Stadt/SName:
SELECT E2.Start, E2.End
FROM Pfad P1, Pfad P2, Pfad P3,
Element E1, Element E2, Text T
WHERE P1.PathExp LIKE ’#%/Land’
AND P2.PathExp LIKE ’#%/Land#/Lage#/Kontinent’
AND P3.PathExp LIKE ’#%/Land#%/Stadt#/SName’
AND E1.PID = P1.PID
AND E2.PID = P3.PID
AND T.PID = P2.PID
AND E1.Start < T.Start AND E1.End > T.End
AND E1.Start < E2.Start AND E1.End > E2.End
AND T.Wert = ’Europe’
Reinhard Pichler
10. Mai 2006
Seite 36
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.3. XPath und SQL
//Stadt[SName = //Provinz[PName = "Baden"]//SName]:
SELECT E1.S, E1.E
FROM Pfad P1, Pfad P2, Pfad P3, Pfad P4, Pfad P5,
Element E1, Element E2, Element E3,
Element E4, Element E5,
Text T1, Text T2, Text T3
WHERE P1.PathExpr LIKE ’#%/Stadt’
AND P2.PathExpr LIKE ’#%/Stadt#/SName’
AND P3.PathExpr LIKE ’#%/Provinz’
AND P4.PathExpr LIKE ’#%/Provinz#/PName’
AND P5.PathExpr LIKE ’#%/Provinz#%/SName’
AND E1.PId = P1.PId AND E2.PId = P2.PId AND E3.PId = P3.PId
AND E4.PId = P4.PId AND E5.PId = P5.PId
AND E4.S < T1.S AND E4.E > T1.E AND T1.Wert = ’Baden’
AND E2.S < T2.S AND E2.E > T2.E
AND E5.S < T3.S AND E5.E > T3.E
AND T2.Wert = T3.Wert
AND E1.S < E2.S AND E1.E > E2.E
AND E3.S < E4.S AND E3.E > E4.E
AND E3.S < E5.S AND E3.E > E5.E
Reinhard Pichler
10. Mai 2006
Seite 37
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.4. Übungsbeispiele
Übungsbeispiel A
Betrachten Sie einen Teil der Uni-Datenbank von Übungsbeispiel 1B mit
den Tabellen Professoren, Studenten, Vorlesungen und hören. Definieren
Sie einen SQL/XML-Befehl für folgenden XML-Output:
Informationen über Studenten gemäß folgender DTD:
<!DOCTYPE studenten [ <!ELEMENT studenten (student)*>
<!ELEMENT student (studenten-name, semester, vorlesungen)>
<!ELEMENT vorlesungen (vorlesung)*>
<!ELEMENT vorlesung (titel, sws, professor-name)> ...
(Nehmen Sie weiters an, dass alle hier nicht näher definierten
Elemente den Inhalt #PCDATA haben).
d.h.: zu jedem Studenten werden die Studenten-Daten (lt.
Studenten-Tabelle) plus Informationen über die vom jeweiligen
Studenten gehörten Vorlesungen (titel lt. Vorlesungen-Tabelle und
Name des Professors lt. Professoren-Tabelle) ausgegeben.
Reinhard Pichler
10. Mai 2006
Seite 38
Semistrukturierte Daten 2
SS 2006
1. Relationale Speicherung und Auswertung
1.4. Übungsbeispiele
Übungsbeispiel B
Betrachten Sie die Uni-Datenbank wie im vorigen Beispiel und geben Sie einen
SQL/XML-Befehl für folgenden XML-Output an:
Informationen über Professoren gemäß folgender DTD:
<!DOCTYPE professoren [ <!ELEMENT professoren (professor)*>
<!ELEMENT professor (professoren-name, rang, vorlesungen)>
<!ELEMENT vorlesungen (vorlesung)*>
<!ELEMENT vorlesung (titel, sws, studenten)>
<!ELEMENT studenten (studenten)*>
<!ELEMENT studenten (name, semester)> ...
(Nehmen Sie weiters an, dass alle hier nicht näher definierten Elemente
den Inhalt #PCDATA haben).
d.h.: zu jedem Professor werden die Professoren-Daten (lt.
Professoren-Tabelle) plus Informationen über die vom jeweiligen Professor
gelesenen Vorlesungen (lt. Vorlesungen-Tabelle) plus Informationen über
die Studenten (lt. Studenten-Tabelle), die die jeweiligen Vorlesungen
besuchen, ausgegeben.
Reinhard Pichler
10. Mai 2006
Seite 39
Herunterladen