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