Seminar 1912: XML und Datenbanken
Transcription
Seminar 1912: XML und Datenbanken
Seminar 1912 im Sommersemester 2002 XML und Datenbanken Präsenzphase: 28. und 29. Juni 2002 Praktische Informatik IV Inhalt Übersicht XML Lorel Lore XQL, XPath YATL, YAT XML-QL Quilt, XQuery Speicherung von XML-Daten in relationalen Datenbanksystemen I Speicherung von XML-Daten in relationalen Datenbanksystemen II XML-Sichten auf relationale Datenbanken Natix, Tamino Übersicht XML Seminar XML und Datenbanken Lehrgebiet Praktische Informatik IV, Prof. Dr. Güting Seminararbeit im SS 2002 Autor: Edmund Buchbinder Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 Inhaltsverzeichnis 1. EINLEITUNG 4 2. GESCHICHTE UND ABGRENZUNG VON XML 4 2.1. Geschichte von XML 4 2.2. Abgrenzung und Gemeinsamkeiten mit SGML 4 2.3. Abgrenzung und Gemeinsamkeiten mit HTML 5 2.4. Abgrenzung und Gemeinsamkeiten mit XHTML 5 3. XML 5 3.1. 3.1.1. Grundkonzept Auszeichnungen im XML 5 5 3.2. Aufbau eines XML-Dokuments 6 3.3. XML-Körper 7 3.4. 3.4.1. wichtige Begriffe und Hinweise für XML wichtige Begrifflichkeiten 8 8 3.5. 3.5.1. 3.5.2. Well-formed Dokumente vs. Valide Dokumente well-formed Dokument Valide Dokumente 9 9 10 3.6. 3.6.1. 3.6.2. 3.6.3. DTD Was ist eine DTD Vor- und Nachteile einer DTD Aufbau einer DTD 10 10 10 11 REFERENZ IM INHALT 11 REFERENZ IM ATTRIBUT-WERT 11 AUFTRETEN ALS ATTRIBUT-WERT 12 3.7. 3.7.1. 3.7.2. 3.7.3. 3.7.4. 3.7.5. 3.7.6. 3.7.7. XML-Schema Was ist ein XML-Schema Vorteile eines XML-Schemas Nachteile eines XML-Schemas Aufbau eines XML-Schemas Erweiterte Konzepte Beispiel eines XML-Schemas Abarbeitung eines XML-Schemas 17 17 17 17 17 20 20 22 3.8. XLink und XPointer 22 3.9. 3.9.1. 3.9.2. XML – Konvertierungen CSS1 und CSS2 XSL 23 23 23 Edmund Buchbinder 24.06.02 Seite 2/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 4. XML-TOOLS 23 4.1. Darstellung von XML in Browsern 23 4.2. XML-Editoren 24 4.3. XML-Prozessoren 24 5. EINSATZMÖGLICHKEITEN IN DER PRAXIS 6. VORSTELLUNG PROJEKT „XML ALS INSTANDHALTUNGSANWEISUNGEN DER DB AG“ 24 FORMAT FÜR 24 6.1. Anforderungen 25 6.2. Lösung 25 6.3. Aktueller Projektstand 27 6.4. Erfahrungen aus dem Projekt 27 7. ZUSAMMENFASSUNG UND AUSBLICK 28 8. VERZEICHNISSE 29 8.1. Literaturverzeichnis 29 8.2. Abbildungsverzeichnis 29 8.3. Tabellenverzeichnis 29 9. ANHANG 9.1. 30 Anhang:vollständige XML-Grammatik in Extended-Backus- Nauer-Form Edmund Buchbinder 24.06.02 30 Seite 3/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 1. Einleitung Die Extensible Markup Language, im folgenden XML genannt, wurde nach Bray et al. (2000) entwickelt, um die folgenden Ziele zu erreichen: 1. XML soll direkt über das Internet nutzbar sein. 2. XML soll eine große Bandbreite von Applikationen unterstützen. 3. XML soll mit SGML kompatibel sein. 4. Es soll einfach sein, Programme zu schreiben, die XML Dokumente verarbeiten. 5. Die Anzahl der optionalen Features in XML sollte auf ein absolutes Mininum beschränkt sein, idealerweise null! 6. XML Dokumente sollten von einem Menschen lesbar und verständlich sein.. 7. Das XML Design soll schnell vorbereitet werden können. 8. Das Design von XML sollte formal und knapp sein. 9. XML – Dokumente sollten einfach herzustellen sein. 10. Die Kürze (Bündigkeit) im XML-Markup ist von geringer Bedeutung. XML Dokumente sind damit herstellerunabhängig. Ein weiterer Nutzen, der durch die oben formulierten Ziele erreicht wird, liegt darin, daß XML Dokumente durch Internet Suchmaschinen sehr viel leichter zu klassifizieren sind. Die XML – Spezifikation wurde vom W3C Konsortium entwickelt und wird auch von diesem weitergepflegt. 2. Geschichte und Abgrenzung von XML 2.1. Geschichte von XML Die erste Version der XML – Spezifikation wurden vom W3C Konsortium im Februar 1998 veröffentlicht. Die eigentliche Entwicklung fand im Jahr 1996 statt. Leiter des Teams, das XML entwickelte, war John Bosak von der Firma Sun Microsystems. XML hat aktuell den Status einer W3C Recommendation. Der aktuelle Stand kann im WWW unter http://www.w3.org/TR/REC-xml abgerufen werden. Im folgenden werden die Vorläufer von XML sowie ähnliche Konzepte wie z.B. HTML kurz vorgestellt. 2.2. Abgrenzung und Gemeinsamkeiten mit SGML Die Standard Generalized Markup Language, kurz SGML, ist der umfassende Vorläufer von XML. XML ist dabei als echte Untermenge der SGML zu sehen. Allerdings bedeutet dies nicht, daß es durch XML keine Neuerungen gab. Vielmehr ist es so, daß Neuerungen, die durch XML geschaffen wurden, im SGML nachgezogen wurden. Der Nachteil von SGML war die hohe Komplexität der Sprache, die die Sprache schwierig zu erlernen und anzuwenden machte. Dadurch war SGML eigentlich nur für große Firmen (z.B. hat IBM mehrere hundert Millionen Seiten an Dokumentation im SGML Format) bzw. staatliche Organisationen einsetzbar, die die notwendigen Ressourcen dafür hatten. Hier soll jetzt XML eine Möglichkeit bieten, die Vorteile von SGML weiter zu nutzen, SGML aber so zu beschränken, daß es einfacher einsetzbar wird. Dies hat natürlich auch den Vorteil, daß die Tools (Editoren, Validierprogramme etc.) zur XML Bearbeitung Edmund Buchbinder 24.06.02 Seite 4/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 deutlich einfacher (und aus wirtschaftlicher Sicht auch billiger) sind als die entsprechenden Tools für SGML. Es gibt in der Zwischenzeit eine Vielzahl von SGML Standards (sogenannte SGMLDTDs), die z.B. in der Luftfahrtindustrie im Einsatz sind. In der Praxis werden heute häufig die SGML-DTDs in XML-DTDs bzw. XML-Schemata umgewandelt. SGML wurde auf Basis von GML (Generalized Markup Language) entwickelt, einer Sprache, die 1969 von IBM zur Verwaltung der Handbücher geschaffen wurde. 2.3. Abgrenzung und Gemeinsamkeiten mit HTML Die Hypertext Markup Language (kurz HTML) ist das weit verbreitete Format, um Information im Internet darzustellen. Allerdings hat HTML einige bedeutende Nachteile. Die meisten Definitionen (Tags), die HTML anbietet, beziehen sich auf das Aussehen des Dokuments und weniger den Inhalt. Gleichzeitig sind die Definitionen genau vorgeschrieben, das bedeutet, daß der Autor seine Texte in diese Definitionen pressen muß. Hier bietet XML eine erhöhte Präzision an, weil die Definition vom Autor selbst erstellt werden kann. Daneben wird durch den Einsatz von XML eine Trennung von Inhalt und Layout ermöglicht, die so im HTML nicht vorgesehen ist. Gleichzeitig bietet XML den Vorteil, daß derselbe Text je nach Gerät auf die unterschiedlichste Weise dargestellt werden kann. 2.4. Abgrenzung und Gemeinsamkeiten mit XHTML Die Extensible Hypertext Markup Language (XHTML) ist eine Auszeichnungssprache, die Ähnlichkeit mit HTML hat. Die Definition erfolgt über eine XML Dokument Typ Definition (XML-DTD). Dies ist ein logischer Schritt, da HTML ursprünglich als SGML-DTD definiert war. Der Vorteil von XHTML liegt darin, daß die Sprache erweiterbar und somit an die speziellen Belange anpaßbar ist. Es gibt inzwischen sogar Konvertierungsprogramme wie z.B. Tidy, das HTML in XHTML umwandelt. 3. XML 3.1. Grundkonzept Das Grundkonzept von XML besteht darin, daß ein Dokument äquivalent z.B. zu einem Auto aus einer Vielzahl von Teilen besteht, die nach einem bestimmten Schema zusammengesetzt sind. Die Darstellung der XML-Spezifikation wurde in Form von Backus-Nauer-Produktionen vorgenommen. Die Einfachheit des Designs kann man z.B. auch daran erkennen, daß insgesamt nur 89 erweiterte Backus-Nauer Produktionen (siehe Abschnitt 9.1) benötigt wurden. Zum genauen Verständnis der Sprache ist es allerdings wichtig, daß auch die zu den jeweiligen Produktionen gehörenden Beispiele mit beachtet werden. XML Dokumente bestehen aus einzelnen Einheiten (Entities), die entweder geparsed oder nicht geparsed werden. Die geparsten Einheiten sind entweder Auszeichnungen oder Zeichendaten. 3.1.1. Auszeichnungen im XML Tabelle 1 gibt eine Übersicht über die im XML möglichen Auszeichnungen. Alle anderen Daten, die nicht in der Tabelle aufgeführt wurden, sind Zeichendaten. Edmund Buchbinder 24.06.02 Seite 5/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 Tabelle 1: Auszeichnungen im XML Auszeichnungstyp Auszeichnungssyntax Starttags <elementName [attributes] Schlusstags ...</elementName> Leere-Element-Tags <elementName [attributes] /> Entity-Referenzen &entityName; %parameterEntityName; Zeichenreferenzen &#decimalNumber; oder &#hexNumber Kommentare <!—comment --> Delimitierer des CDATA-Abschnitts <![CDATA[ cdata stuff ]]> Dokumenttyp-Deklaration <!DOCTYPE name externel ID? [DTD Stuff]> Verarbeitungsanweisungen <?processorID data ?> XML-Deklaration <?xml version encoding standalone ?> oder 3.2. Aufbau eines XML-Dokuments Im folgenden wird der Aufbau eines XML-Dokuments anhand eines Beispiels vorgestellt und diskutiert. Es handelt sich bei dem Beispiel um das Adreßbuch einer Firma. In eckigen Klammern stehen bei vielen XML-Konstruktionen die erweiterten BackusNauer-Produktionen, auf denen die Konstruktion basiert. Listing 1 (Abbildung 1) zeigt das Beispiel des XML-Dokuments. Dieses besteht aus drei Elementen [1]: Es gibt einen Prolog, ein Element und einen Misc-Inhalt. Im folgenden werden die einzelnen Elementeile näher vorgestellt. 3.2.1.1. Prolog Der Prolog [22] besteht im Listing aus den Zeilen 1 – 3. Dabei wird zunächst in Zeile 1 die XML-Version sowie die Zeichenkodierung festgelegt. Bei der XML-Version steht der Wert auf 1.0, bei der Zeichendefinition wird UTF-8 angegeben. Dies ist der am häufigsten verwendete Zeichencode für das amerikanische Englisch. Daneben wird bei vielen Windows-Systemen häufig mit dem Code ISO-8859-1 gearbeitet. Weiterhin wird in Zeile 2 die DTD[28] angegeben, d.h. die Dokumenttyp-Deklaration, auf der das Dokument beruht. Hier wird als Dokumenttyp-Deklaration die Datei addressbook.dtd angegeben. Diese liegt im selben Verzeichnis wie die eigentliche XML Datei. In der dritten Zeile wird der XSL-Stylesheet angegeben, der zur Formatierung der XMLDatei verwendet wird. Der Style-Sheet liegt im selben Verzeichnis wie das eigentliche XML-Dokument und trägt den Dateinamen demo.xsl. Diese dritte Zeile ist optional, wird sie auskommentiert, gibt es auch bei validierenden Browsern eine unformatierte Ausgabe. Von der Syntax wird der Stylesheet in Form einer Prozessoranweisung an das System übergeben. Edmund Buchbinder 24.06.02 Seite 6/33 Seminar „XML und Datenbanken“ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. Thema: Übersicht XML Matrikel Nr. 5717574 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE addressbook SYSTEM "addressbook.dtd" > <?xml:stylesheet type="text/xsl" href="demo.xsl"?> <addressbook> <person employee-number="A0000" family-name="Gates" first-name="Bob"> <contact-info> <!--Confidential--> </contact-info> <address city="Los Angeles" street="Pine Rd." number="1239" state="CA"/> <job-info is-manager="no" job-description="Manager" employee-type="Full-Time"/> <manager employee-number="A0000"/> </person> <person employee-number="A7000" family-name="Brown" first-name="Robert" middleinitial="L."> <contact-info> <email address="robb@iro.ibm.com"/> <home-phone number="03-3987873"/> </contact-info> <address city="New York" street="118 St." number="344" state="NY"/> <job-info is-manager="yes" job-description="Group Leader" employee-type="Full-Time"/> <manager employee-number="A0000"/> </person> <person employee-number="A7890" family-name="DePaiva" first-name="Kassie" middleinitial="W."> <contact-info> <!-- Kassie's agent phone: 03-987654 --> </contact-info> <address city="Los Angeles" street="Pine Rd." number="1234" state="CA"/> <job-info is-manager="no" job-description="Actor" employee-type="Full-Time"/> <manager employee-number="A0000"/> <misc-info>One of the most talented actresses on Daytime. Kassie plays the devious and beautiful Blair Cramer on ABC's "One Life To Live."</misc-info> </person> <person employee-number="A7987" family-name="Smith" first-name="Joe"> <contact-info> <email address="joes@iro.ibm.com"/> <mobile-phone number="888-7657765"/> <home-phone number="03-8767898"/> <home-phone number="03-8767871"/> </contact-info> <address city="New York" street="W. 15th Ave." number="12789" state="NY"/> <job-info is-manager="no" job-description="Hacker" employee-type="Part-Time"/> <manager employee-number="A7000"/> </person> </addressbook> Abbildung 1: Listing 1 XML-Dokument eines Firmenadreßbuchs 3.3. XML-Körper Ab Zeile 4 beginnt der Körper des Dokuments. In Zeile 4 steht dabei der Starttag des Wurzel-Elementes des Dokuments[1], das addressbook. Entscheidend ist, daß jedes XML-Dokument nur eine Wurzel haben darf. Der Schlußtag steht in Zeile 44. Wichtig ist zu beachten, daß es für jeden Starttag auch einen Schlußtag geben muß. Weiterhin müssen immer erst die inneren Elemente geschlossen sein, bevor ein äußeres geschlossen werden kann. In Zeile 5 beginnt der erste Ast des Dokuments mit dem Starttag für das Element person, der Schlußtag findet sich dazu in Zeile 12. In Zeile 5 läßt sich erkennen, daß dem Edmund Buchbinder 24.06.02 Seite 7/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 Element Person die Attribute [41] employee-number, family-name und first-name zugeordnet sind. Die jeweiligen Werte für die Attribute finden sich hinter dem Gleichheitszeichen in den doppelten Anführungsstrichen. In Zeile 6 steht der Starttag für das Element contact-info. Dieses Element enthält einen Kommentar und endet in Zeile 8. Der eigentliche Kommentar [15] steht in der Zeile 7. In Zeile 9 ist ein leeres Element [44] address zu erkennen, dieses enthält nur die Attribute city, street, number und state mit ihren jeweiligen Werten. Ebenfalls leere Elemente befinden sich in den Zeilen 10 und 11. Anschließend beginnt in Zeile 13 die nächste Person. 3.4. wichtige Begriffe und Hinweise für XML XML berücksichtigt sowohl bei den Auszeichnungen als auch den Zeichendaten Großund Kleinschreibung. Bei der Anordnung der Tags ist zu berücksichtigen, daß der Tag, der zuerst geöffnet wurde, zuletzt geschlossen wird. Es handelt sich damit also um eine echte Baumstruktur. 3.4.1. wichtige Begrifflichkeiten Im folgenden stelle ich die wichtigsten Begrifflichkeiten dar, die zum Verständnis eines XML-Dokuments benötigt werden. 3.4.1.1. Entitiy Eine Einheit (entity) [70] besteht aus Buchstaben. Diese können entweder Mark-Up oder „Charakter“ Data beschreiben! Als erlaubte Buchstaben gelten dabei das Tabulatorzeichen, der Wagenumbruch (carriage return), der Wagenvorlauf und die erlaubten Buchstaben von Unicode und ISO/IEC 10646. 3.4.1.2. Literale Ein Literal [11] ist eine beliebige, in Anführungszeichen eingeschlossene Zeichenkette, die nicht das Anführungszeichen enthält, das zur Begrenzung der Zeichenkette verwendet wird. Literale werden verwendet, um den Inhalt von internen Entities (EntityValue), die Werte von Attributen (AttValue) und um externe Bezeichner (SystemLiteral) anzugeben. Ein SystemLiteral kann analysiert (parsed) werden, ohne nach Markup zu suchen. 3.4.1.3. Zeichendaten und Auszeichnungen: Text besteht wie bereits oben beschrieben aus miteinander vermengten Zeichendaten und Auszeichnungen (siehe Tabelle 1). Jeder Text, der nicht Auszeichnung ist, bildet die Zeichendaten des Dokuments. Das &-Zeichen und das <-Zeichen dürfen in der literalen Form nur als Markup-Zeichen oder innerhalb eines Kommentars benutzt werden. Ansonsten werden müssen die Zeichen umschrieben ("escaped") werden durch "&" und "<". Gleiches gilt für das >-Zeichen. Dieses wird ersetzt durch „>“. 3.4.1.4. Tag Für Tags gelten die folgenden Besonderheiten: - Tags dürfen nicht mit XML beginnen (d.h. weder XML, noch Xml, noch xml etc.) - Tags sollten keinen Doppelpunkt enthalten, da dieser in Zukunft für die Identifikation eines Namensraums vorgesehen ist. Edmund Buchbinder 24.06.02 Seite 8/33 Seminar „XML und Datenbanken“ - Thema: Übersicht XML Matrikel Nr. 5717574 Ein Tagname muß mit einem Buchstaben anfangen. 3.4.1.5. Kommentare Kommentare dürfen an jeder beliebigen Stelle außerhalb der Markups stehen. Ein Kommentar darf dabei nicht mit einem –Zeichen enden. 3.4.1.6. Prozessor Anweisungen Durch Prozessor Anweisungen können einzelne Dokument Anweisungen für externe Programme wie z.B. einen Java-Skript Interpreter enthalten. 3.4.1.7. CDATA-Abschnitte CDATA-Abschnitte enthalten Informationen, die an die Anwendung weitergegeben werden sollen, ohne auf Auszeichnungen geparst zu werden. CDATA-Abschnitte dürfen dabei nicht verschachtelt sein. 3.5. Well-formed Dokumente vs. Valide Dokumente XML unterscheidet zwischen wohlgeformten Dokumenten (well-formed documents) und validen Dokumenten (valid documents). 3.5.1. well-formed Dokument Ein XML-Dokument ist wohlgeformt, wenn es die folgenden Anforderungen erfüllt: - Als ganzes gesehen fügt es sich in die als Dokument (siehe Anhang 9.1) bezeichnete Produktion. - Es erfüllt alle Bedingungen zur Wohlgeformtheit, die in der Spezifikation (der XML1.0-Empfehlung) angegeben werden. Dazu gehört, daß ein XML-Dokument mindestens ein Element enthalten muß. Daneben muß sichergestellt, daß es sich bei dem Dokument um einen Baum handelt. Es muß eine eindeutig definierte Wurzel vorliegen. - Alle geparsten Entities, auf die eine direkte oder indirekte Referenz im Dokument besteht, sind wohlgeformt. Im folgenden werden nun die Bedingungen für die Wohlgeformtheit aufgeführt: - Parameter-Entities in der internen Untermenge dürfen nur dort auftreten, wo Auszeichnungen stehen können. Sie können nicht innerhalb der Auszeichnung stehen. - Der Name im Schlußtag eines Elements muß dem Namen im Starttag entsprechen. - Ein Attributname kann nur einmal in jedem Starttag oder dem Tag für ein leeres Element vorkommen. - Attributwerte können keine direkten oder indirekten Referenzen auf externe Entities enthalten. - Der Ersetzungstext einer Entity, auf die direkt oder indirekt Bezug genommen wird (außer „<“) darf kein < Zeichen enthalten. - Zeichen, auf die man sich mit Hilfe von Zeichenreferenzen bezieht, müssen zulässig sein. - In einem Dokument ohne DTD, einem Dokument mit einer nur internen DTDTeilmenge ohne Referenz auf einer Parameter-Entity oder in einem Dokument mit dem Wert „standalone=‘yes‘“ in der XML-Deklaration muß der Name, der in der Entity-Referenz angegeben wird, dem in der Entity-Deklaration entsprechen. Eine Edmund Buchbinder 24.06.02 Seite 9/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 Ausnahme besteht darin, daß wohlgeformte Dokumente keine der folgenden Entities deklarieren müssen: &, <, &apos, ". - Grundsätzlich muß die Deklaration einer Parameter-Entity jeglicher Referenz auf sie vorausgehen. Es gibt aber einige Situationen, in denen ein nicht-validierender XMLProzessor die Verarbeitung von Entity-Deklarationen beendet. Etwa, wenn der nichtvalidierende Prozessor davon ausgeht, daß alle Deklarationen gelesen und verarbeitet wurden, kann er einen Fehler bei der Wohlgeformtheit deklarieren und die Verarbeitung abbrechen, wenn er eine nicht deklarierte Entity findet. Andererseits ist es kein Fehler, eine nicht deklarierte Entity zu finden, wenn der nicht-validierende Prozessor aus irgendeinem dieser Gründe die Verarbeitung von Entities beendet hat. - Eine Entity-Referenz darf nicht den Namen einer ungeparsten Entity enthalten. Man kann damit keine Binärdaten mitten in den Text einfügen, ohne irgendeine Art von Verarbeitungsmechanismus zu deklarieren. - Eine geparste Entity darf keine rekursive Referenz aus sich selbst enthalten, weder direkt noch indirekt. - Referenzen auf die Parameter-Entities dürfen nur innerhalb der DTD auftreten. 3.5.2. Valide Dokumente Bei validen Dokumenten wird neben der Wohlgeformtheit auch überprüft, ob diese Dokumente den Vorgaben einer DTD (siehe Abschnitt 3.6) oder eines XML-Schemas (siehe Abschnitt 3.7) entsprechen. Validierende Parser dürfen ein Dokument erst anzeigen, wenn es valide (gültig) ist. Damit können sich z.T. beträchtliche Wartezeiten für den Benutzer ergeben. 3.6. DTD 3.6.1. Was ist eine DTD Eine Dokumenttyp-Definition (Document Type Definition), im folgenden DTD genannt, definiert die Form und die Syntax eines XML-Sprachkonstrukts. Sie beschreibt damit das Vokabular, aus dem die einzelnen XML-Instanzen dann zusammengesetzt sind. Es besteht dabei ein deutlicher Unterschied in der Syntax zwischen einem XMLDokument und einer XML-DTD. Eine DTD muß in Ihrem Namen den Namen des Wurzel-Elements enthalten. 3.6.2. Vor- und Nachteile einer DTD 3.6.2.1. Vorteile einer DTD Eine DTD bietet die folgenden Vorteile: - Bietet die Möglichkeit, auch erweiterte Zeichensätze oder Codierungen zu nutzen. - Attributen können Standardparameter zugewiesen werden - Die Texterstellung kann während des Schreibprozesses validiert werden. Dies ist eine wichtige Unterstützung für den Autor. - Editier-Werkzeuge können bei einer vorliegenden DTD den Autor unterstützen, in dem sie ihm nur die zulässigen Element anbieten. 3.6.2.2. Nachteile einer DTD Den Vorteilen stehenden die folgenden Nachteile entgegen, die beim Einsatz einer DTD mit abgewogen werden müssen: Edmund Buchbinder 24.06.02 Seite 10/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 - Durch die unterschiedliche Syntax werden von Autoren noch zusätzliche Kenntnisse verlangt. In der Praxis läßt man sich häufig die DTD aus einem bereits erstellten XML Dokument automatisch erzeugen. Diese wird bei Bedarf dann noch manuell nachbearbeitet. - Die Komplexität des Parsers wird erhöht - Bei manchen Tools ist keine Zwischenspeicherung in einem nicht validen Zustand erlaubt. Die Benutzer werden dadurch gegängelt. - durch externe Leseoperationen kann sich die Bearbeitungszeit beim Einsatz einer DTD deutlich verlängern 3.6.3. Aufbau einer DTD Eine DTD besteht aus der Deklaration der einzelnen Entities, die im Dokument verwendet werden können. Als Entities sind dabei Parameter-Entities, allgemeine Entities und ungeparste Entities möglich.. Daneben enthält eine DTD Elemente, die zu den Elementen zugeordneten Attribute sowie Notationen. 3.6.3.1. Entities Ausgehend von der Vorstellung, daß ein XML-Dokument eine Ansammlung von Entities ist, kann man eine Entity-Deklaration als Möglichkeit sehen, auf eine Instanz eines bestimmten Objektes zu zeigen. Die Syntax sieht dabei in der Grundform wie folgt aus: <!ENTITY name value > Wie bereits erwähnt, wird dabei unterschieden zwischen Parameter-Entities, allgemeinen Entities und ungeparsten Entities. Auf eine allgemeine Entity bezieht man sich mit dem &-Zeichen: &name Auf eine Parameter-Entity mit dem %-Zeichen: %name Auch in der Deklaration unterscheiden sich die beiden Entity-Typen. Parameter-Entities enthalten ein %-Zeichen vor dem Namen der Entity. Ungeparste Entities funktionieren zusammen mit einer Notation. Die entsprechende Notation muß deklariert sein, bevor sie in einer Entity verwendet werden kann. Der folgende Abschnitt ist aus der XML-1.0 Empfehlung des W3C entnommen. Sie beschreibt den Umgang mit Entities sowohl in den Dokumenten als auch in DTDs: "Die folgende Tabelle (Tabelle 2) faßt zusammen, in welchem Kontext Zeichenreferenzen, Entity-Referenzen und der Aufruf von nicht-analysierten Entities stehen dürfen und wie sich ein XML-Prozessor in jedem Fall zu verhalten hat. Die Einträge in der linken Spalte beschreiben den Kontext: Referenz im Inhalt ist eine Referenz zwischen Start-Tag und End-Tag eines Elements. Korrespondiert mit dem Nicht-Terminal content. Referenz im Attribut-Wert ist eine Referenz entweder im Wert eines Attributes (im Starttag) oder ein Vorgabewert in einer Attributdeklaration. Korrespondiert mit dem Nicht-Terminal AttValue. Edmund Buchbinder 24.06.02 Seite 11/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 Auftreten als Attribut-Wert als ein Name, nicht als Referenz, entweder als Wert eines Attributs, das als Typ ENTITY deklariert wurde, oder als ein Wert einer Liste von Token (durch Leerzeichen getrennt) in einem Attribut des Typs ENTITIES. Referenz im Entity-Wert ist eine Referenz innerhalb des literalen Entity-Werts in der Deklaration eines Parameteroder internen Entity. Korrespondiert mit dem Nicht-Terminal EntityValue. Referenz in der DTD ist eine Referenz in der internen oder externen Teilmenge der DTD, aber außerhalb eines EntityValue oder AttValue. Tabelle 2: Entity-Typen und ihre Auswirkung Parameter Referenz im Inhalt Nicht erkannt Referenz im Attribut-Wert Auftreten als Attribut-Wert Referenz im EntityWert Nicht erkannt Nicht erkannt Entity-Typ Zeichen intern, extern-analysiert, nichtallgemein allgemein analysiert Inkludiert, falls Inkludiert Verboten Inkludiert validierend in Literal Verboten Verboten Inkludiert inkludiert Nicht Verboten Verboten Informieren erkannt in Literal Durchgereicht inkludiert Als Parameter(PE) Verboten Referenz in der DTD Entity inkludiert Durchgereicht Verboten Inkludiert Verboten Verboten Verboten Nicht erkannt Außerhalb der DTD hat das Prozent-Zeichen (%) keine besondere Bedeutung. Folglich wird das, was in der DTD ein Parameter-Entity wäre, im Inhalt nicht als Markup erkannt. Ebenso werden die Namen von nicht-analysierten Entities nicht erkannt, es sei denn, sie erscheinen als Wert eines entsprechend deklarierten Attributs. Inkludiert Ein Entity wird inkludiert, wenn sein Ersetzungstext an der Stelle der Referenz selbst geladen und verarbeitet wird, so als ob es Teil des Dokumentes wäre und zwar an der Stelle, an der die Referenz steht. Der Ersetzungstext kann sowohl Zeichendaten als auch Markup enthalten (mit Ausnahme der Parameter-Entities), die in der üblichen Weise behandelt werden, abgesehen davon, daß Ersetzungstext, der dazu dient, Markup-Zeichen zu schützen (die Entities amp, lt, gt, apos, quot), stets als Zeichendaten behandelt wird. (Die Zeichenkette »AT&T;« expandiert zu »AT&T;« und das übriggebliebene et-Zeichen wird nicht als Begrenzung einer Entity-Referenz angesehen.) Eine Zeichenreferenz wird inkludiert, wenn das referenzierte Zeichen an Stelle der Referenz verarbeitet wird. Inkludiert, falls validierend Wenn der XML-Prozessor bei dem Versuch, ein Dokument zu validieren, auf eine Referenz zu einem analysierten Entity stößt, dann muß der Prozessor dessen Edmund Buchbinder 24.06.02 Seite 12/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 Ersetzungstext inkludieren. Wenn es sich um ein externes Entity handelt und der Prozessor gar nicht versucht, das XML-Dokument zu validieren, ist es dem Prozessor freigestellt, den Ersetzungtext zu inkludieren. Wenn ein nicht-validierender Parser einen Ersetzungtext nicht inkludiert, muß er die Anwendung darüber informieren, daß er auf ein Entity gestoßen ist, dieses aber nicht eingelesen hat. Diese Regel basiert auf der Erkenntnis, daß die automatische Inkludierung, die durch den Entity-Mechanismus von SGML und XML zur Verfügung steht und dazu gedacht war, Modularität bei der Texterstellung zu ermöglichen, nicht unbedingt für andere Anwendungen geeignet ist, insbesondere für das Dokument-Browsing. Beispielsweise könnten Browser sich dafür entscheiden, eine Referenz auf ein extern-analysiertes Entity visuell anzuzeigen und das Entity erst auf Anfrage zu laden und darzustellen. Verboten Das folgende ist verboten und stellt einen kritischen Fehler dar: • das Erscheinen einer Referenz auf ein nicht-analysiertes Entity • das Erscheinen einer Zeichen- oder allgemeinen Entity-Referenz in der DTD, es sei denn sie steht innerhalb eines EntityValue oder AttValue • eine Referenz auf ein externes Entity in einem Attribut-Wert In Literal inkludiert Wenn eine Entity-Referenz in einem Attribut-Wert erscheint oder wenn eine ParameterEntity-Referenz in einem literalen Entity-Wert erscheint, wird dessen Ersetzungstext an Stelle der Referenz selbst verarbeitet; so, als ob er Teil des Dokuments an der Stelle wäre, an der die Referenz steht. Eine Ausnahme ist, daß ein einfaches (Apostroph) oder doppeltes Anführungszeichen im Ersetzungstext stets als normales Zeichen behandelt wird und das Literal nicht beendet. Zum Beispiel ist folgendes wohlgeformt: <!ENTITY % JN '"Ja"' > <!ENTITY WasErSagte "Er sagte &JN;" > Dieses jedoch nicht: <!ENTITY EndAttr "27'" > <element attribute='a-&EndAttr;> Informieren Wenn der Name eines nicht-analysierten Entity als ein Token im Wert eines Attributs erscheint, dessen deklarierter Typ ENTITY oder ENTITIES ist, dann muß ein validierender Prozessor die Anwendung über den System- und Public-Identifier (falls vorhanden) des Entity und dessen Notation informieren. Durchgereicht Wenn eine Referenz auf ein allgemeines Entity im EntityValue in einer EntityDeklaration erscheint, wird es unverändert durchgereicht. Als PE inkludiert Genau wie extern-analysierte Entities müssen auch Parameter-Entities nur dann inkludiert werden, wenn das Dokument validiert wird. Wenn eine Parameter-EntityReferenz in der DTD erkannt und inkludiert wird, wird dessen Ersetzungstext um ein führendes und abschließendes Leerzeichen (#x20) erweitert. Die Absicht ist es, den Ersetzungstext so zu beschränken, daß er in sich geschlossene grammatikalische Token der DTD enthält." (Bray et al.. 2000, Übersetzung durch Behme und Wintert) 3.6.3.2. Elemente und Attribute Grundsätzlich sieht eine ELEMENT-Deklaration in einer DTD wie folgt aus: <!Element name content-model> Edmund Buchbinder 24.06.02 Seite 13/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 Als Inhaltsmodell (content-model) können dabei beliebige terminale und nicht-terminale Elemente gewählt werden. Nicht-terminale Elemente sind dabei andere Elemente, die wiederum terminal oder nicht-terminal sein können. Terminale Elemente werden durch den Typ #PCDATA beschrieben. Zu jedem Element können Attribute in einer Attributliste zugeordnet werden. Für die Attributliste gilt dabei die folgenden Syntax: <!ATTLIST element-name attribute-name-1 datatype default-data attribute-name-1 datatype default-data ...> Im Gegensatz zu den Elementen sind damit bei den Attributen mehrere terminale Datentypen erlaubt. Tabelle 3 gibt eine Übersicht über die Attributs-Datentypen, die in einer DTD verwendet werden können. Tabelle 3: Attributs-Datentypen in einer DTD Attributs-Datentyp Beschreibung CDATA Zeichendaten, die einen String bilden. ID Eine benannte einzigartige ID innerhalb eines Dokuments. IDREF Eine benannte einzigartige ID IDREFS Eine benannte Liste von Referenzen auf einzigartige IDs innerhalb eines Dokuments. ENTITY Eine benannte Referenz auf eine Entity, die sich auf eine Notation bezieht. ENTITIES Eine benannte Liste von Referenzen auf Entities, die sich auf Notationen bezieht. NMTOKEN Eine benannte Referenz auf ein NAMEToken. NMTOKENS Eine benannte Referenz auf eine Liste von NAME-Token. NOTATION Eine aufgezählte Referenz auf eine Liste von Notations-Datentypen. Dies ist die Ausnahme von der Regel, daß alle ungeparsten Entities extern sein müssen. Referenz auf eine Wie oben bereits beschrieben, bieten Attribute zusätzlich die Möglichkeit, Standarddaten für das Attribut vorzugeben. Edmund Buchbinder 24.06.02 Seite 14/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 Tabelle 4: Standarddaten für Attribute Standarddatum Bedeutung #REQUIRED Es wird kein Standardwert vorgegeben. In einem validen XML-Dokument muß hier ein Wert eingegeben werden. #IMPLIED Das Attribut muß vorhanden sein. "default-value" Es gibt einen Standardwert. Dieser kann überschrieben werden. #FIXED "constant-value" Es gibt einen Standardwert, dieser kann nicht überschrieben werden nicht unbedingt Tabelle 5: Frequenzindikatoren, die in XML-DTDs verwendet werden Syntax Bedeutung ? Kein oder einmaliges Auftreten + Einmaliges oder mehrmaliges Auftreten * Kein oder mehrfaches Auftreten (a|b) Entweder a oder b, aber nicht beide (a,b) a gefolgt von b 3.6.3.3. Notationen Zu einer Notation gehört all das, was der XML-Prozessor nicht verstehen und auswerten kann. Dabei sind sowohl binäre Daten denkbar als auch Text, der nicht für den XMLProzessor bestimmt ist. Bei der Verwendung von Notationen muß berücksichtigt werden, daß ein Zugriff auf die entsprechende DTD zwingend erforderlich ist, um sie in einem Dokument zu verwenden. Die Syntax einer Notation sieht wie folgt aus: <!NOTATION name identifier "helper"> 3.6.3.4. Beispiel einer DTD Das folgende Listing 2 zeigt die zu dem XML-Dokument in Listing 1 passende DTD. In Zeile 1 wird äquivalent zu einem XML-Dokument zunächst die Kodierung der DTD definiert. In Zeile 2 ist zu erkennen, daß die Kommentare in einer DTD der Syntax der Kommentare in einem XML-Dokument entsprechen. In den Zeilen 3 bis 11 werden Parameter-Entities definiert. Dieses Vorgehen hat den Vorteil, daß die DTD später relativ einfach auf verschiedene Länder angepaßt werden kann. Für einen deutschen Autor müssen nur die Werte in den Anführungszeichen in die deutsche Sprache übersetzt werden, z.B. wird aus dem "addressbook" das "Adreßbuch", aus dem "first-name" der "Vorname" etc. Da es sich hier nur um eine Beispiel DTD handelt, wurden dabei nicht alle später verwendeten Elemente und Attribute als Parameter-Entities definiert. Dies müßte bei der endgültigen Verwendung noch nachgezogen werden. Edmund Buchbinder 24.06.02 Seite 15/33 Seminar „XML und Datenbanken“ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. Thema: Übersicht XML Matrikel Nr. 5717574 <?xml encoding="UTF-8"?> <!-- Element names --> <!ENTITY % Doctype "addressbook" > <!ENTITY % Person "person"> <!ENTITY % Contact-info "contact-info"> <!ENTITY % Address "adress"> <!ENTITY % Job-info "job-info"> <!ENTITY % Manager "manager"> <!ENTITY % Misc-info "misc-info"> <!ENTITY % First-name "first-name"> <!ENTITY % Family-name "family-name"> <!-- Content Substitution --> <!ELEMENT %Doctype; ( %Person;)+> <!ELEMENT %Person; (%Contact-info;, %Address;,%Job-info;,%Manager;,(%Miscinfo;)?)> <!ATTLIST %Person; %First-name; CDATA #REQUIRED %Family-name; CDATA #REQUIRED middle-initial CDATA #IMPLIED employee-number ID #REQUIRED> <!ELEMENT %Contact-info; (home-phone|mobile-phone|email)*> <!ELEMENT home-phone EMPTY> <!ATTLIST home-phone number CDATA #REQUIRED> <!ELEMENT mobile-phone EMPTY> <!ATTLIST mobile-phone number CDATA #REQUIRED> <!ELEMENT email EMPTY> <!ATTLIST email address CDATA #REQUIRED> <!ELEMENT %Address; EMPTY> <!ATTLIST %Address; state NMTOKEN #REQUIRED city CDATA #REQUIRED street CDATA #REQUIRED number CDATA #REQUIRED> <!ELEMENT %Job-info; EMPTY> <!ATTLIST %Job-info; is-manager (yes|no) 'no' job-description CDATA #REQUIRED employee-type (Full-Time|Part-Time|Intern) 'Full-Time'> <!ELEMENT %Manager; EMPTY> <!ATTLIST %Manager; employee-number IDREF #REQUIRED> <!ELEMENT %Misc-info; (#PCDATA)> Abbildung 2: Listing 2 DTD für das Dokument aus Listing 1 Ab der Zeile 13 (nach einem Kommentar in Zeile 12) beginnt die Definition der Elemente und Attribute. Das erste Element, das definiert wird, ist das Wurzelelement in Zeile 13. Hier wird die in Zeile 3 definierte Parameter-Referenz auf den Wert "addressbook" eingesetzt, d.h. im entsprechenden XML-Dokument heißt das WurzelElement addressbook. Gleichzeitig ist definiert, daß das Wurzelelement mindestens 1 Element vom Typ Parameter-Entity %Person enthalten muß. In Zeile 14 wird das Element %Person definiert, dies enthält eine Kontakt-Information, eine Adresse, eine Job-Information sowie keine oder eine gemischte Information. Dabei ist festgelegt, daß die Bestandteile in einer festen Reihenfolge stehen müssen. Weiterhin ist zu beachten, daß hier ebenfalls Parameter-Entities verwendet wurden. Edmund Buchbinder 24.06.02 Seite 16/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 In Zeile 15 bis einschließlich Zeile 19 wird die zu dem Element %Person gehörige Attributliste definiert. Pflichtattribute sind der %First-name, der %Family-name und die employee-number. Das Attribut middle-initial muß dagegen nicht gefüllt werden. Die Attribute %First-name, %Family-name und middle-initial sind vom Typ CDATA, das Attribut employee-number vom Typ ID. An diesem Beispiel ist zu sehen, daß Attribute sowohl direkt (in Zeile 18 und 19) als auch als Parameter-Entities definiert werden können. In Zeile 20 wird das Element %Contact-info definiert. Dieses besteht aus den Elementen home-phone, mobile-phone und email. Es kann dabei eins von den drei Elementen ausgewählt werden, die Auswahl kann aber null bis mehrmals hintereinander erfolgen. In Zeile 20 wird das leere Element home-phone definiert. Dieses besteht nur aus einer Attributliste, die das Pflicht-Attribut number vom Typ CDATA enthält. In den Zeilen 38 und 40 ist zu erkennen, wie mit Vorschlagswerten für die Attributbelegung gearbeitet wird. In Zeile 44 enthält das Element %Misc-info als Bestandteil den terminalen Inhalt PCDATA. 3.7. XML-Schema 3.7.1. Was ist ein XML-Schema Ein Schema ist eine weitere Möglichkeit, eine Vorlage für XML-Dokumente zu definieren. Seit Mai 2001 hat das Schema den Status einer W3C-Recommendation. XML-Schemata erlauben im Gegensatz zu DTDs echte Fehler- und Bereichsüberprüfung. Damit können Dokumente schon bei der Erstellung auf die interne Validität überprüft werden. Dies hat natürlich den Vorteil, daß man damit den Datenverkehr, der über die Netzwerke läuft, deutlich reduzieren kann, weil keine „falschen“ Daten mehr verschickt werden. 3.7.2. Vorteile eines XML-Schemas Der Einsatz eines XML-Schemas bietet die folgenden Vorteile: - Das XML-Schema bietet eine Vielzahl von Datentypen an, so daß eine große Zahl von Validierungen direkt bei der Eingabe vorgenommen werden können. - Die Unterstützung für reguläre Ausdrücke ist sehr gut. - Ein XML-Schema wird in XML geschrieben. Für die Autoren ist daher kein Erlernen einer neuen Syntax notwendig 3.7.3. Nachteile eines XML-Schemas Der Einsatz eines XML-Schemas hat die folgenden Nachteile: - XML-Schemata sind noch nicht so weit verbreitet wie DTDs. Entsprechend ist die Tool-Unterstützung noch nicht so ausgeprägt. - Die Erstellung eines Schemas verleitet dazu, die Eingaben der Benutzer sehr stark einzuschränken. Die Folge davon ist eine regelmäßige Veränderung an den Schemata. 3.7.4. Aufbau eines XML-Schemas Im folgenden werden die wichtigsten Bestandteile eines XML-Schemas vorgestellt. Es wird empfohlen, zu diesem Abschnitt parallel den Abschnitt 3.7.6 zu beachten. Edmund Buchbinder 24.06.02 Seite 17/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 Grundsätzlich werden bei XML-Schemata zwischen komplexen Datentypen und einfachen Datentypen unterschieden. Einfache Datentypen dürfen keine Elemente als Inhalt und keine Attribute besitzen. Globale Elemente und Attribute werden direkt als Unterelemente des Schema-Elementes vergeben. Auf diese kann dann über eine "ref"-Beziehung zugegriffen werden. Wichtig ist, daß globale Elemente keine Referenzen enthalten dürfen. Daneben darf es bei globalen Elementen keine Beschränkung der Kardinalität geben. Die Beschränkung darf es nur bei einer Referenz auf die globalen Elemente geben. In einem XML-Schema können per Definition die in Tabelle 6 folgenden simplen Typen enthalten sein: Tabelle 6 : Simple Typen (Tabelle aus Fallside, 2001) Simple Type string normalizedString token byte unsignedByte base64Binary hexBinary integer positiveInteger negativeInteger nonNegativeInteger nonPositiveInteger int unsignedInt long unsignedLong short unsignedShort decimal float double boolean time Examples (delimited by commas) Confirm this is electric Confirm this is electric Confirm this is electric -1, 126 0, 126 GpM7 0FB7 -126789, -1, 0, 1, 126789 1, 126789 -126789, -1 0, 1, 126789 -126789, -1, 0 -1, 126789675 0, 1267896754 -1, 12678967543233 0, 12678967543233 -1, 12678 0, 12678 -1.23, 0, 123.4, 1000.00 -INF, -1E4, -0, 0, 12.78E2, 12, INF, NaN -INF, -1E4, -0, 0, 12.78E2, 12, INF, NaN true, false 1, 0 13:20:00.000, 13:20:00.000-05:00 dateTime 1999-0531T13:20:00.000-05:00 duration P1Y2M3DT10H30M12.3 S date gMonth gYear gYearMonth 1999-05-31 --05-1999 1999-02 Edmund Buchbinder 24.06.02 Notes see (3) see (4) see (2) see (2) see (2) see (2) see (2) see (2) see (2) see (2) see (2) see (2) see (2) see (2) see (2) see (2) equivalent to single-precision 32-bit floating point, NaN is "not a number", see (2) equivalent to double-precision 64-bit floating point, see (2) see (2) May 31st 1999 at 1.20pm Eastern Standard Time which is 5 hours behind Co-Ordinated Universal Time, see (2) 1 year, 2 months, 3 days, 10 hours, 30 minutes, and 12.3 seconds see (2) May, see (2) (5) 1999, see (2) (5) the month of February 1999, Seite 18/33 Seminar „XML und Datenbanken“ Simple Type Thema: Übersicht XML Examples (delimited by commas) Matrikel Nr. 5717574 Notes regardless of the number of days, see (2) (5) the 31st day, see (2) (5) every May 31st, see (2) (5) XML 1.0 Name type XML Namespace QName XML Namespace NCName, i.e. a QName without the prefix and colon gDay gMonthDay Name QName ---31 --05-31 shipTo po:USAddress NCName USAddress anyURI http://www.example.com/ , http://www.example.com/ doc.html#ID5 valid values for xml:lang as defined in XML 1.0 XML 1.0 ID attribute type, see ID (1) XML 1.0 IDREF attribute type, IDREF see (1) XML 1.0 IDREFS attribute IDREFS type, see (1) XML 1.0 ENTITY attribute ENTITY type, see (1) XML 1.0 ENTITIES attribute ENTITIES type, see (1) XML 1.0 NOTATION attribute NOTATION type, see (1) US, XML 1.0 NMTOKEN attribute NMTOKEN Brésil type, see (1) XML 1.0 NMTOKENS US UK, attribute type, i.e. a whitespace NMTOKENS Brésil Canada Mexique separated list of NMTOKEN's, see (1) Notes: (1) To retain compatibility between XML Schema and XML 1.0 DTDs, the simple types ID, IDREF, IDREFS, ENTITY, ENTITIES, NOTATION, NMTOKEN, NMTOKENS should only be used in attributes. (2) A value of this type can be represented by more than one lexical format, e.g. 100 and 1.0E2 are both valid float formats representing "one hundred". However, rules have been established for this type that define a canonical lexical format, see XML Schema Part 2. (3) Newline, tab and carriage-return characters in a normalizedString type are converted to space characters before schema processing. (4) As normalizedString, and adjacent space characters are collapsed to a single space character, and leading and trailing spaces are removed. (5) The "g" prefix signals time periods in the Gregorian calender. language en-GB, en-US, fr Neue simple Datentypen können aus existierenden simplen Datentypen gewonnen werden, in dem z.B. eine Einschränkung des Bereichs vorgenommen wird. In List-Typen hat das einzelne Zeichen für sich eine Bedeutung. Es besteht aus mehreren atomaren Typen, die durch Leerzeichen getrennt sind. Auch hier sind Einschränkungen möglich, wie die Länge, die maximale Länge, die minimale Länge oder auch Aufzählungen. Ein Union-Typ enthält alle möglichen Werte eines simplen Datentypen oder eines ListDatentypen. Edmund Buchbinder 24.06.02 Seite 19/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 Daneben bietet ein Schema auch die Möglichkeit, anonyme Datentypen zu definieren. Dies ist sinnvoll, wenn man die Datentypen noch nicht einschränken will. Aus simplen Datentypen können neue komplexe Datentypen gewonnen werden. Es gibt natürlich auch in einem XML-Schema die Möglichkeit, leere Elemente zu definieren, die nur Inhalt enthalten. anyType Objekte können jeglichen Inhalt enthalten, d.h. sowohl einfache als auch komplexe Datentypen. Dieser Typ wird immer dann vom System angenommen, wenn kein expliziter Datentyp erklärt wird. Es gibt in einem XML-Schema drei Formen für Annotationen. Einerseits die Dokumentations-Elemente, die helfen sollen, das Schema für einen menschlichen Leser besser verständlich zu machen. Daneben gibt es das appInfo-Element. Dieses wird eingesetzt, um Informationen an andere Applikationen zu liefern. Das AnnotationsElement ist das "Über"-Element für die beiden erwähnten Elemente. Wird kein expliziter Namensraum angegeben, dann setzt der Prozessor automatisch den Namensraum xsd:, den Namensraum für das allgemeine XML-Schema. Allerdings wird empfohlen, explizit den Namensraum anzugeben, um so Verwirrungen vorzubeugen. 3.7.5. Erweiterte Konzepte Im folgenden noch einige erweiterte Konzepte, diese werden aber nicht intensiver behandelt. Weitere erweiterte Konzepte werden bei Fallside (2001) dargestellt. 3.7.5.1. Schema in mehreren Dokumenten Ein Schema kann aus mehreren Dokumenten bestehen. Entscheidend dafür ist, daß die Dokumente denselben Target-Namespace benutzen. Es können dabei mehrere Dokumente inkludiert werden. 3.7.5.2. Ableitung von Typen durch Erweiterung Neue komplexe Typen können auch durch Erweiterung von bestehenden komplexen Typen entstehen. 3.7.6. Beispiel eines XML-Schemas Im Listing 3 (Abbildung 3) wird ein Beispiel für ein XML-Schema vorgestellt. Das Schema ist Fallside (2001) entnommen. In Zeile 1 wird zunächst der Namensraum xsd durch den folgenden Zugriffspfad http://www.w3.org/2001/XMLSchema definiert. In den Zeilen 2 – 7 erfolgt ein Kommentar (documentation) als Unterelement einer Annotation. In Zeile 8 erfolgt die Deklaration eines Elements aus dem Namensraum xsd. D.h. der Elementbegriff bezieht sich hier auf den Namensraum xsd. Der Name des Elements lautet purchaseOrder, es ist vom Typ PurchaseOrderTyp. In Zeile 9 wird das Element (ebenfalls xsd Element) comment deklariert. Dieses hat den einfachen Typ string. Der Typ PurchaseOrderType ist dagegen ein komplexer Typ (Zeile 10). Dieser besteht aus einer Sequenz (sequence), d.h. einer Reihenfolge der folgenden Elemente: • shipTo vom Typ USAddress (Zeile 12); dieses Element erscheint genau einmal • billTo vom Typ USAddress (Zeile 13); dieses Element erscheint genau einmal Edmund Buchbinder 24.06.02 Seite 20/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 • comment (Zeile 14), hier beschrieben als Referenz zu dem in Zeile 9 definierten Element. Das Element comment muß in der Sequenz nicht vorkommen, dies wird ausgedrückt durch die Beschreibung minOccurs="0" • items (Zeile 15), dieses Element erscheint genau einmal. In Zeile 16 wird die Sequenz der Elemente innerhalb des komplexen Typs PurchaseOrderTyp abgeschlossen. Daneben enthält der komplexe Typ PurchaseOrderTyp noch das Attribut orderDate (Zeile 17) vom einfachen Typ date aus dem Namensraum xsd. In Zeile 18 wird die Definition des komplexen Typs PurchaseOrderTyp abgeschlossen. Ab Zeile 19 erfolgt die Definition des komplexen Typs USAddress, dieser besteht aus einer Sequenz von Elementen einfachen Typs (Zeile 21-25). Daneben enthält er ein Attribut vom Typ NMTOKEN aus dem Namensraum xsd. Dieses Attribut muß den Wert US haben, wird es im abgeleiteten Dokument nicht verwendet, enthält es dort automatisch den Wert US. Abgeschlossen wird die Definition des komplexen Typs USAddress in Zeile 29. Ab Zeile 30 erfolgt die Definition des komplexen Typs Items. Besonders interessant ist hier zunächst die Zeile 32, dort wird das Element item definiert. Dieses muß minimal überhaupt nicht auftreten (minOccurs="0") und darf maximal unbegrenzt auftreten (maxOccurs="unbounded"). Daneben ist besonders die Definition des Typ des Elements quantity interessant. Diese wird aus dem einfachen Typ positiveInteger abgeleitet, wobei in Zeile 39 festgelegt wird, daß das Element in einem abgeleiteten Dokument maximal den Wert 100 (einschließlich) annehmen darf. Weiterhin von besonderen Interesse ist die Definition des einfachen Datentyps SKU (steht für Stock Keeping Unit) ab Zeile 53. Dieser wird vom Typ String abgeleitet. Dabei erfolgt eine Restriktion auf einen regulären Ausdruck (Zeile 54 und 55). In einem abgeleiteten Dokument dürfen hier Inhalte der folgenden Art eingefügt werden: Zunächst müssen drei Zahlen kommen, anschließend ein Bindestrich und zum Abschluß zwei Großbuchstaben. In Zeile 58 wird die Definition des Schemas abgeschlossen. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:annotation> <xsd:documentation xml:lang="en"> Purchase order schema for Example.com. Copyright 2000 Example.com. All rights reserved. </xsd:documentation> </xsd:annotation> <xsd:element name="purchaseOrder" type="PurchaseOrderType"/> <xsd:element name="comment" type="xsd:string"/> <xsd:complexType name="PurchaseOrderType"> <xsd:sequence> <xsd:element name="shipTo" type="USAddress"/> <xsd:element name="billTo" type="USAddress"/> <xsd:element ref="comment" minOccurs="0"/> <xsd:element name="items" type="Items"/> </xsd:sequence> <xsd:attribute name="orderDate" type="xsd:date"/> </xsd:complexType> <xsd:complexType name="USAddress"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="street" type="xsd:string"/> Edmund Buchbinder 24.06.02 Seite 21/33 Seminar „XML und Datenbanken“ 24. 25. 23. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. Thema: Übersicht XML Matrikel Nr. 5717574 <xsd:element name="state" type="xsd:string"/> <xsd:element name="zip" type="xsd:decimal"/> <xsd:element name="city" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/> </xsd:complexType> <xsd:complexType name="Items"> <xsd:sequence> <xsd:element name="item" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="productName" type="xsd:string"/> <xsd:element name="quantity"> <xsd:simpleType> <xsd:restriction base="xsd:positiveInteger"> <xsd:maxExclusive value="100"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="USPrice" type="xsd:decimal"/> <xsd:element ref="comment" minOccurs="0"/> <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="partNum" type="SKU" use="required"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <!-- Stock Keeping Unit, a code for identifying products --> <xsd:simpleType name="SKU"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{3}-[A-Z]{2}"/> </xsd:restriction> </xsd:simpleType> </xsd:schema> Abbildung 3: Listing 3, ein Beispiel für ein XML-Schema 3.7.7. Abarbeitung eines XML-Schemas Der erste Schritt beginnt damit, daß das Wurzelelement überprüft wird, anschließend wird jedes folgenden Element überprüft. Zunächst wird für jedes Element nachgesehen, wo dieses Element im Schema deklariert wurde. Anschließend werden die Namensräume für das Element kontrolliert. Ist die Überprüfung bis zu diesem Punkt erfolgreich, werden die Inhalte und Attribute des entsprechenden Elements kontrolliert. Grundsätzlich wird von Prozessoren verlangt, daß sie darüber Bericht erstatten, welche Prüfung sie gerade ausführen. 3.8. XLink und XPointer XLink und XPointer sind die in XML verwendeten Verknüpfungsmechanismen. XLink beschreibt dabei, wie Links erstellt und durchquert werden. Es handelt sich dabei um eine Erweiterung des aus HTML bekannten Anker-Tags und bietet die folgenden zusätzlichen Möglichkeiten: - Links auf mehrere Zielorte Edmund Buchbinder 24.06.02 Seite 22/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 - bidirektionale Links - Links, die auf Dokumente zeigen, die nur zum Lesen bestimmt sind - Links, die mit beschreibenden Titeln versehen sind, die klar machen, wie der Link verwendet wird - Links, die sich vor Ort erweitern (Transklusion genannt), um externen Inhalt in ein XML-Dokument einzubetten, so wie derzeit Bilder eingebettet werden. - Links, die automatisch durchquert werden, wenn das Dokument geladen wird. Dies kann den Einschluß externen Inhalts oder die Ersetzung einer Seite durch eine andere zulassen. XPointer ist als eine auf XPath beruhende Unterstützung für XLink zu sehen. XPointer bietet alle Funktionen, die in XPath definiert sind, mit einigen Erweiterungen. Es stellt damit erweiterte Methoden zur Verfügung, wie man auf bestimmte Standorte oder Bereiche innerhalb von Dokumenten zeigen kann. 3.9. XML – Konvertierungen 3.9.1. CSS1 und CSS2 Cascading Style Sheets (CSS) 1 sind eigentlich die erste praktikable Methode für das Web, in der die Darstellung der Daten vom Inhalt der Daten getrennt wurde. CSS wurde inzwischen zu CSS 2 weiterentwickelt. Dabei wurde vor allem die Mächtigkeit im typographischen Bereich ergänzt. Beim Einsatz von CSS ist allerdings immer die Browserunterstützung zu beachten. Nicht alle im Web aktuell benutzten Browser unterstützen CSS2. Noch nicht leisten kann dagegen CSS das Erstellen von Inhaltsverzeichnissen, das Sortieren von Listen vor der Ausgabe oder bestimmte ungewöhnliche Layouttechniken. 3.9.2. XSL XSL steht für Extensible Style Language. XSL unterstützt z.B. das automatische Erstellen von Inhalts- und Stichwortverzeichnissen. Von der Implementierung ähnelt XSL stark XML und HTML, so daß hier von einer hohen Lernkurve für den Entwickler ausgegangen werden kann. Auch XSL besitzt eine DTD, d.h. es kann validiert werden. Von der Leistungsfähigkeit kann festgehalten werden, daß XSL fast den gesamten Funktionsumfang von CSS1 und CSS 2 unterstützt. Insgesamt besteht XSL aus drei Teilen: Das eigentliche XSL, XSLT (XSL Transformations und Xpath (XML-Adressierungssprache). 4. XML-Tools 4.1. Darstellung von XML in Browsern Die Darstellung von XML in Browsern ist noch sehr unterschiedlich. Auf jeden Fall ist zu bedenken, daß nicht alle Benutzer Browser des neuesten Typs im Einsatz haben. Bei validen Dokumenten ist zu bedenken, daß die Leser der entsprechenden Dokumente Zugriff auf alle benötigten DTDs und XML-Schemata benötigen. Gleichzeitig wird das Dokument nicht eher angezeigt, bis die Validität des Dokuments bestätigt ist. Eine Art Streaming, wie sie gerade bei großen Dokumenten von Benutzern gewünscht wird, ist damit nicht möglich. Edmund Buchbinder 24.06.02 Seite 23/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 4.2. XML-Editoren Der Markt bietet inzwischen eine Vielzahl von XML-Editoren jeglicher Preis- und Leistungsstufe. Vor dem Einsatz im Projekt sind dabei vor allem die folgenden Aspekte zu überprüfen: • Welche Dokumente können erstellt werden? Handelt es sich ausschließlich um XML-Dokumente, oder können auch XML-Schemata oder DTDs erstellt werden. • Unterstützt der Editor eine Validierung bei der Eingabe? • Bietet der Editor nur die Elemente bei der Eingabe an, die laut XML-Schema oder DTD erlaubt sind? • Wenn der Editor weniger für Entwickler als für Endbenutzer genutzt werden soll, ist zu überprüfen, inwieweit die Oberfläche angepaßt werden kann. Daneben ist die Frage zu stellen, ob die Editoren eine deutsche Benutzungs-Oberfläche anbieten. 4.3. XML-Prozessoren Entscheidend ist zu überprüfen, wieweit die Prozessoren die XML Dokumente verarbeiten. Der SAP XML Prozessor baut z.B. aus dem XML-Dokument einen Baum auf, führt aber keinerlei Konsistenzprüfung durch. Das heißt, die Überprüfung nach der Validität der Eingaben erfolgt durch die Applikation. 5. Einsatzmöglichkeiten in der Praxis XML wird in der Praxis in zwei großen Bereichen eingesetzt. Auf der einen Seite wird es genutzt, um einen einfachen Datenaustausch zwischen verschiedenen Systemen zu ermöglichen. Langfristiges Ziel ist dabei, Standards zu etablieren und damit die Schnittstellenproblematik (für jede Schnittstelle eine neu zu definierende Schnittstellenvereinbarung zu schaffen) zu entschärfen. Gleichzeitig werden die Schnittstellen für den menschlichen Nutzer leichter verständlich. Vor diesem Hintergrund kann z.B. das Bestreben vieler Firmen gesehen werden, die EDI (Electronic Data Interchange) –Schnittstellen langfristig durch XML Schnittstellen zu ersetzen: Bisher war der EDI-Austausch eigentlich nur für große Firmen möglich, da zunächst das genaue Datenformat in einem komplexen Projekt zwischen den Projektpartnern ausgearbeitet werden mußte. Anschließend mußte das Datenformat in die entsprechende IT noch implementiert werden. Alles in allem ist diese Anstrengung für kleinere Firmen kaum zu leisten gewesen. Der zweite große Einsatzpunkt von XML ist in der Dokumentenerzeugung und Dokumentenpublikation. Hier bietet sich XML an, weil es eine saubere Trennung von Format und Inhalt der Dokumente gibt. Gleichzeitig ist es in Zukunft immer wichtiger, aus dem selben Inhalt die Information auf verschiedene Kanäle zielgruppengerecht publizieren zu können. Denkbar ist hier, dieselben Inhalte einmal für eine Web-Site, für eine Zeitschrift und für ein WAP-Handy aufzubereiten. Hierfür bietet sich der Einsatz von XML in Ergänzung mit XSL und XSLT an. 6. Vorstellung Projekt „XML als Format Instandhaltungsanweisungen der DB AG“ für Qualität und Wirtschaftlichkeit der Instandhaltung ist ein langfristiges Ziel vieler Großunternehmen, unter anderem auch der Deutschen Bahn. Das im folgenden beschriebene Projekt bezieht sich dabei auf die Instandhaltung von fahrendem Material, also Lokomotiven und Wagen. Edmund Buchbinder 24.06.02 Seite 24/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 6.1. Anforderungen Durch eine entsprechende IT-Lösung soll das oben beschriebene Ziel unterstützt werden. Vom Auftraggeber wurden dabei u.a. die folgenden Anforderungen an die SoftwareLösung und Technologie gestellt: • Durchgängigkeit der Informationskette von den Autoren Instandhaltungsregelwerke bis zu den Arbeitsscheinen für die Handwerkern • Langfristig lesbares Softwareherstellern • Entlastung technischer Redakteure von Formatierungsarbeiten an Dokumenten • Rechtssichere Ablage der Dokumente • Möglichkeit eines einfachen Dokumentenaustausch mit verschieden Herstellern von Fahrzeugen • gezielter Zugriff auf einzelne Elemente der Dokumente (wie z.B. Meßwerte, Betriebsstoffe etc.) • Integration in das bestehende PPS-System der Deutschen Bahn (Es handelt sich hierbei um eine große SAP R/3 Installation) • Publikation der Information über verschiedene Kanäle Dokumentformat ohne Abhängigkeit von der einzelnen 6.2. Lösung In einer Prototypenphase wurden verschiedene Ansätze untersucht, wie diese Anforderungen erfüllt werden können. Aufgrund dieser Anforderungen fiel die Entscheidung, XML-Dokumente auf Basis eines selbst erstellten XML-Schemas im SAP R/3 System zu erzeugen. Dadurch ist die Möglichkeit gegeben, die Dokumente auch langfristig lesen und bearbeiten zu können. Die Dokumente werden im SAP R/3 System durch einen selbstentwickelten Editor erstellt. Die Validierung der Eingaben erfolgt dabei durch die Anwendung und nicht durch das XML-Schema. Die Begründung liegt darin, daß der SAP XML-Prozessor das Konzept einer DTD oder eines XML-Schemas nicht unterstützt. Das Schema dient somit zur Kommunikation mit den Benutzern, zur Dokumentation und zur Erzeugung eines leeren Musterdokuments, welches im Editierprozess dann bearbeitet wird. Die Dokumentenablage erfolgt in dem Dokumentenverwaltungssystem (DVS-Modul) von SAP. Damit können die Standardmechanismen für Check-In, Check-out und Versionierung von Dokumenten benutzt werden. Durch den Ansatz, die Dokumente im SAP System zu erstellen, wird die Möglichkeit geboten, Daten, die im SAP System vorliegen wie z.B. eindeutige Materialnummern, Fahrzeugnummern, Instandhaltungsnummern etc. auszulesen und zu nutzen. Es wird damit die gesamte Schnittstellenproblematik, die sonst bei einem externen Zugriff in das SAP-System hinein notwendig wäre, erspart. Um die Dokumente in einen langfristige lesbaren Zustand zu überführen und in diesem auch zukünftig archivieren zu können, werden die Dokument auf Bedarf der Redakteure und auf jeden Fall bei der Freigabe in ein PDF-Dokument konvertiert. Das Vorgehen dafür ist in Abbildung 4 dargestellt. Zunächst erfolgt die Transformation in das logische Layout mit Hilfe einer XSLT-Transformation. In einem zweiten Schritt wird dann das logische Layout in das eigentlich grafische Layout mit Hilfe der Rendering Enginge konvertiert. Edmund Buchbinder 24.06.02 Seite 25/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 XML à PDF • PDTec Layout Engine (PLE) Throughout the whole transformation process, PLE enables keeping control over every layouting and rendering step. n At first the XML document is transformed to a set of XML structures that can be interpreted by the PLE or by the custom layout component. n After that the custom layout component controls high-level aspects such as page sequences and feeds appropriate XML fragments into the PLE. The PLE creates the PDF document. White-Box Transformation White-Box Transformation Custom Layout Original XML Document 1 XSLT Intermediate XML Document 2 Rendering Engine Business Semantics PLE (PDTec Layout Engine) PDF Document PDF Driver Logical Layout Graphical Layout © 2002 PDTec GmbH • ProSTEP Symposium • 2002-04-17 • Ehrler / Buchbinder • 1 Abbildung 4: Konvertierung XML in ein PDF-Dokument Für die Konvertierung selbst wurde die in Abbildung 5 dargestellte Architektur gewählt. Aus dem SAP heraus wird ein Rendering Service über eine RFC-Schnittstelle aufgerufen. Dieser ist dann für die Konvertierung des Dokuments zuständig. Anschließend wird das konvertierte Dokument ebenfalls in das Dokumentenverwaltungssystem von SAP eingecheckt. Die ganze Architektur ist dadurch skalierbar, daß pro SAP System mehrere Rendering-Server möglich sind. Insgesamt wird durch den gewählten Ansatz das XML vor den einzelnen Redakteuren vollkommen verborgen. Die Redakteure nehmen die Eingaben in der speziellen Redakteursoberfläche vor. Dort werden auch die Arbeitsergebnisse korrigiert. Zur Betrachtung des gesamten Dokuments steht pentweder die PDF-Konvertierung oder als Schnellkonvertierung eine HTML-Konvertierung zur Verfügung. Als rechtsverbindlich gelten nur die Dokumente im PDF Format. Edmund Buchbinder 24.06.02 Seite 26/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 PDM/ERP Integration • Example: SAP R/3 PLM HTML XML PDF PDF GIF TIFF SAP GUI Local Filesystem Frontend RFC Server profiles Profiles Custom Layout SAP PLM Application Rendering Service SAP PLM PDTec Layout Engine profiles XSLT (ABAP API) Rendering Engine PDF Driver Rendering Server SAP R/3 © 2002 PDTec GmbH • ProSTEP Symposium • 2002-04-17 • Ehrler / Buchbinder • 1 Abbildung 5: Architektur zur Konvertierung der XML-Dokumente 6.3. Aktueller Projektstand Aktuell werden Arbeitsanweisungen in dem oben beschriebenen System erstellt. Die Akzeptanz durch die Benutzer ist sehr gut. Vor allem die nicht mehr notwendige Formatierung der Dokumente, die bisher sehr viel Zeit in Anspruch genommen hat, wird immer wieder positiv hervorgehoben. Der Auftraggeber sieht es sehr positiv, daß durch den gewählten Ansatz eine Standardisierung in der Erstellung der Dokumente erreicht wird. Die nächsten Schritte bestehen darin, verschiedene Arbeitsanweisungen zu sogenannten Instandhaltungsbüchern zusammenzufassen. In diesem Rahmen gehört es auch dazu, daß Verzeichnisse z.B. von Grenzwerten oder Meßwerkzeugen über Arbeitsanweisungen hinweg erstellt werden. Auch hier greift ein weiterer Vorteil des XML-Ansatzes, da hier die entsprechenden Informationen sehr viel leichter aus den Dokumenten ausgelesen werden können als dies z.B. in Word- oder Excel-Dokumenten der Fall wäre. Im nächsten Release ist dann die vollständige Integration in das PPS-System geplant. In diesem Projektschritt ist es wichtig, daß es einerseits eine sehr hohe Verfügbarkeit des Systems geben muß. Andererseits muß die Integration sukzessive erfolgen. Für einen gewissen Zeitraum müssen die bisherigen Auftragsdokumente und die neuen Auftragsdokumente parallel arbeiten können. 6.4. Erfahrungen aus dem Projekt Die erste Erfahrung, die im Rahmen diese Projektes gemacht wurde, war, daß die XMLUnterstützung, die die einzelnen Tools bieten, häufig nicht den MarketingVersprechungen der Hersteller entsprechen. Hier ist eine entsprechende Überprüfung auf jeden Fall notwendig. Der Markt an XML-Experten in Deutschland ist ein wachsender Markt, zu Beginn unseres Projekts war es eine Herausforderung, das nötige Know-How vorzuhalten. Eine wichtige Entscheidung im Projekt war, die Daten mit Hilfe eines XML-Schemas und nicht einer DTD zu modellieren. Die Begründung liegt in der größeren Flexibilität Edmund Buchbinder 24.06.02 Seite 27/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 und den genaueren Definitionsmöglichkeiten eines Schemas. Auch hier ist aber wieder bei allen beteiligten Tools zu überprüfen, inwieweit diese XML-Schemas unterstützen. Bei dem Design der Anwendung ist kritisch zu überprüfen, ob die Validierung der einzelnen Eingaben durch die Anwendung oder das XML-Schema erfolgen soll. Beide Ansätze haben Vorteile und sind in jedem Projekt für sich abzuwägen. 7. Zusammenfassung und Ausblick XML bietet alle Möglichkeiten für einen plattform- und systemübergreifenden Datenaustausch. Die Unterstützung durch entsprechende Tools nimmt immer weiter zu. Aus meiner Sicht wird sich das XML-Schema langfristig gegenüber der DTD durchsetzen, da es einerseits eine größere Flexibilität bietet, andererseits ermöglicht es eine genauere Überprüfung der Eingaben. Zukünftig wird es standardisierte XML-Schemata (oder auch DTDs) für bestimmte Problembereiche oder Anwendungsfälle geben, die dann direkt genutzt und den persönlichen Bedürfnissen angepaßt werden können. Im Rahmen der Weiterentwicklung von XML muß allerdings darauf geachtet werden, daß die Herstellerunabhängigkeit des Formats erhalten bleibt. Eine Entwicklung, wie sie sich eine Zeitlang für HTML abzeichnete oder sich z.T. noch abzeichnet, muß auf jeden Fall vermieden werden. Es bleibt noch zu erwähnen, daß bei der Arbeit mit XML die Daten- und Dokumentsicherheit besonders zu beachten ist, da die Informationen im unverschlüsselten Zustand sowohl durch den Menschen als auch die Maschine leicht auszulesen und auch zu manipulieren sind. Hier bietet sich der Einsatz der entsprechenden Verschlüsselungs- bzw. Signatursoftware an. Edmund Buchbinder 24.06.02 Seite 28/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 8. Verzeichnisse 8.1. Literaturverzeichnis T. Bray, J. Paoli, C. M. Sperberg-McQueen und E. Maler. Extensible Markup Language (XML). Second Edition, W3C Recommendation, 2000, http:/www.w3.org/TR/REC-xml D. C. Fallside. XML Schema Part 0: Primer, W3C Recommendation, 2001, http://www.w3.org/TR/xmlschema-0/ S. Adler et al. Extensible Stylesheet Language (XSL), Version 1.0. W3C Recommendation,2001, http://www.w3.org/TR/xsl/ J. Clark. XSL Transformations (XSLT), Version 1.0. W3C Recommendation, 2001, http:// www.w3.org/TR/xsl/ A. Philips. XML Modernes Daten- und Dokumentenmanagement , 2002, Markt + Technik 8.2. Abbildungsverzeichnis Abbildung 1: Listing 1 XML-Dokument eines Firmenadreßbuchs.................................... 7 Abbildung 2: Listing 2 DTD für das Dokument aus Listing 1 ......................................... 16 Abbildung 3: Listing 3, ein Beispiel für ein XML-Schema ............................................. 22 Abbildung 4: Konvertierung XML in ein PDF-Dokument............................................... 26 Abbildung 5: Architektur zur Konvertierung der XML-Dokumente................................ 27 8.3. Tabellenverzeichnis Tabelle 1: Auszeichnungen im XML.................................................................................. 6 Tabelle 2: Entity-Typen und ihre Auswirkung ................................................................. 12 Tabelle 3: Attributs-Datentypen in einer DTD................................................................. 14 Tabelle 4: Standarddaten für Attribute ............................................................................. 15 Tabelle 5: Frequenzindikatoren, die in XML-DTDs verwendet werden.......................... 15 Tabelle 6 : Simple Typen (Tabelle aus Fallside, 2001) .................................................... 18 Edmund Buchbinder 24.06.02 Seite 29/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 9. Anhang 9.1. Anhang:vollständige Nauer-Form XML-Grammatik in Extended-Backus- [1] document ::= prolog element Misc* [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */ [3] S ::= (#x20 | #x9 | #xD | #xA)+ /* Whitespace is space, tab, cr, lf */ [4] NameChar ::= Letter | Digit | ‘.’ | ‘-’ | ‘_’ | ‘:’ | CombiningChar | Extender [5] Name ::= (Letter | ‘_’ | ‘:’) (NameChar)* [6] Names ::= Name (#x20 Name)* [7] Nmtoken ::= (NameChar)+ [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)* [9] EntityValue ::= ‘“‘ ([^%&”] | PEReference | Reference)* ‘“‘ | “‘“ ([^%&’] | PEReference | Reference)* “‘“ [10] AttValue ::= ‘“‘ ([^<&”] | Reference)* ‘“‘ | “‘“ ([^<&’] | Reference)* “‘“ [11] SystemLiteral ::= (‘“‘ [^”]* ‘“‘) | (“‘“ [^’]* “‘“) [12] PubidLiteral ::= ‘“‘ PubidChar* ‘“‘ | “‘“ (PubidChar - “‘“)* “‘“ [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-’()+,./:=?;!*#@$_%] [14] CharData ::= [^<&]* - ([^<&]* ‘]]>’ [^<&]*) [15] Comment ::= ‘<!--’ ((Char - ‘-’) | (‘-’ (Char - ‘-’)))* ‘-->’ [16] PI ::= ‘<?’ PITarget (S (Char* - (Char* ‘?>’ Char*)))? ‘?>’ [17] PITarget ::= Name - ((‘X’ | ‘x’) (‘M’ | ‘m’) (‘L’ | ‘l’)) [18] CDSect ::= CDStart CData CDEnd [19] CDStart ::= ‘<![CDATA[‘ [20] CData ::= (Char* - (Char* ‘]]>’ Char*)) [21] CDEnd ::= ‘]]>’ [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? [23] XMLDecl ::= ‘<?xml’ VersionInfo EncodingDecl? SDDecl? S? ‘?>’ [24] VersionInfo ::= S ‘version’ Eq (“‘“ VersionNum “‘“ | ‘“‘ VersionNum ‘“‘) [25] Eq ::= S? ‘=’ S? [26] VersionNum ::= ([a-zA-Z0-9_.:] | ‘-’)+ [27] Misc ::= Comment | PI | S [28] doctypedecl ::= ‘<!DOCTYPE’ S Name (S ExternalID)? S? (‘[‘ (markupdecl | PEReference | S)* ‘]’ S?)? ‘>’ [ VC: Root Element Type ] [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment [ VC: Proper Declaration/PE Nesting ] [ WFC: PEs in Internal Subset ] [30] extSubset ::= TextDecl? extSubsetDecl [31] extSubsetDecl ::= ( markupdecl | conditionalSect | PEReference | S )* [32] SDDecl ::= S ‘standalone’ Eq ((“‘“ (‘yes’ | ‘no’) “‘“) | (‘“‘ (‘yes’ | ‘no’) ‘“‘)) [ VC: Standalone Document Declaration ] [33] LanguageID ::= Langcode (‘-’ Subcode)* Edmund Buchbinder 24.06.02 Seite 30/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 [34] Langcode ::= ISO639Code | IanaCode | UserCode [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) [36] IanaCode ::= (‘i’ | ‘I’) ‘-’ ([a-z] | [A-Z])+ [37] UserCode ::= (‘x’ | ‘X’) ‘-’ ([a-z] | [A-Z])+ [38] Subcode ::= ([a-z] | [A-Z])+ [39] element ::= EmptyElemTag | STag content ETag [ WFC: Element Type Match ] [ VC: Element Valid ] [40] STag ::= ‘<’ Name (S Attribute)* S? ‘>’ [ WFC: Unique Att Spec ] [41] Attribute ::= Name Eq AttValue [ VC: Attribute Value Type ] [ VC: Valid xml:lang ] [ WFC: No External Entity References ] [ WFC: No < in Attribute Values ] [42] ETag ::= ‘</’ Name S? ‘>’ [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)* [44] EmptyElemTag ::= ‘<’ Name (S Attribute)* S? ‘/>’ [ WFC: Unique Att Spec ] [45] elementdecl ::= ‘<!ELEMENT’ S Name S contentspec S? ‘>’ [ VC: Unique Element Type Declaration ] [46] contentspec ::= ‘EMPTY’ | ‘ANY’ | Mixed | children [47] children ::= (choice | seq) (‘?’ | ‘*’ | ‘+’)? [48] cp ::= (Name | choice | seq) (‘?’ | ‘*’ | ‘+’)? [49] choice ::= ‘(‘ S? cp ( S? ‘|’ S? cp )+ S? ‘)’ [ VC: Proper Group/PE Nesting ] [50] seq ::= ‘(‘ S? cp ( S? ‘,’ S? cp )* S? ‘)’ [ VC: Proper Group/PE Nesting ] [51] Mixed ::= ‘(‘ S? ‘#PCDATA’ (S? ‘|’ S? Name)* S? ‘)*’ | ‘(‘ S? ‘#PCDATA’ S? ‘)’ [ VC: Proper Group/PE Nesting ] [ VC: No Duplicate Types ] [52] AttlistDecl ::= ‘<!ATTLIST’ S Name AttDef* S? ‘>’ [53] AttDef ::= S Name S AttType S DefaultDecl [54] AttType ::= StringType | TokenizedType | EnumeratedType [55] StringType ::= ‘CDATA’ [56] TokenizedType ::= ‘ID’ [ VC: ID ] [ VC: One ID per Element Type ] [ VC: ID Attribute Default ] | ‘IDREF’ [ VC: IDREF ] | ‘IDREFS’ [ VC: IDREF ] | ‘ENTITY’ [ VC: Entity Name ] | ‘ENTITIES’ [ VC: Entity Name ] | ‘NMTOKEN’ [ VC: Name Token ] | ‘NMTOKENS’ [ VC: Name Token ] [57] EnumeratedType ::= NotationType | Enumeration [58] NotationType ::= ‘NOTATION’ S ‘(‘ S? Name (S? ‘|’ S? Name)* S? ‘)’ [ VC: Notation Attributes ] [ VC: One Notation per Element Type ] [59] Enumeration ::= ‘(‘ S? Nmtoken (S? ‘|’ S? Nmtoken)* S? ‘)’ [ VC: Enumeration ] [60] DefaultDecl ::= ‘#REQUIRED’ | ‘#IMPLIED’ | ((‘#FIXED’ S)? AttValue) [ VC: Required Attribute ] [ VC: Attribute Default Legal ] [ WFC: No < in Attribute Values ] [ VC: Fixed Attribute Default ] [61] conditionalSect ::= includeSect | ignoreSect [62] includeSect ::= ‘<![‘ S? ‘INCLUDE’ S? ‘[‘ extSubsetDecl ‘]]>’ [63] ignoreSect ::= ‘<![‘ S? ‘IGNORE’ S? ‘[‘ ignoreSectContents* ‘]]>’ [64] ignoreSectContents ::= Ignore (‘<![‘ ignoreSectContents ‘]]>’ Ignore)* [65] Ignore ::= Char* - (Char* (‘<![‘ | ‘]]>’) Char*) [66] CharRef ::= ‘&#’ [0-9]+ ‘;’ | ‘&#x’ [0-9a-fA-F]+ ‘;’ [ WFC: Legal Character ] [67] Reference ::= EntityRef | CharRef Edmund Buchbinder 24.06.02 Seite 31/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 [68] EntityRef ::= ‘&’ Name ‘;’ [ WFC: Entity Declared ] [ VC: Entity Declared ] [ WFC: Parsed Entity ] [ WFC: No Recursion ] [69] PEReference ::= ‘%’ Name ‘;’ [ VC: Entity Declared ] [ WFC: No Recursion ] [ WFC: In DTD ] [70] EntityDecl ::= GEDecl | PEDecl [71] GEDecl ::= ‘<!ENTITY’ S Name S EntityDef S? ‘>’ [72] PEDecl ::= ‘<!ENTITY’ S ‘%’ S Name S PEDef S? ‘>’ [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) [74] PEDef ::= EntityValue | ExternalID [75] ExternalID ::= ‘SYSTEM’ S SystemLiteral | ‘PUBLIC’ S PubidLiteral S SystemLiteral [76] NDataDecl ::= S ‘NDATA’ S Name [ VC: Notation Declared ] [77] TextDecl ::= ‘<?xml’ VersionInfo? EncodingDecl S? ‘?>’ [78] extParsedEnt ::= TextDecl? content [79] extPE ::= TextDecl? extSubsetDecl [80] EncodingDecl ::= S ‘encoding’ Eq (‘“‘ EncName ‘“‘ | “‘“ EncName “‘“ ) [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | ‘-’)* /* Encoding name contains only Latin characters */ [82] NotationDecl ::= ‘<!NOTATION’ S Name S (ExternalID | PublicID) S? ‘>’ [83] PublicID ::= ‘PUBLIC’ S PubidLiteral [84] Letter ::= BaseChar | Ideographic [85] BaseChar ::= [#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | [#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | [#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | [#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3#x03CE] | [#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | [#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | [#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | [#x04EE-#x04F5] | [#x04F8#x04F9] | [#x0531-#x0556] | #x0559 | [#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | [#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | [#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | [#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | [#x09AA-#x09B0] | #x09B2 | [#x09B6#x09B9] | [#x09DC-#x09DD] | [#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | [#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35#x0A36] | [#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | [#x0A85#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | [#x0AAA-#x0AB0] | [#x0AB2#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | [#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | [#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | [#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92#x0B95] | [#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | [#x0BA8#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | [#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | [#x0C60-#x0C61] | [#x0C85#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | [#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | [#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | [#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | [#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | #x0E8D | [#x0E94#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | #x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | #x0EBD | [#x0EC0-#x0EC4] | [#x0F40#x0F47] | [#x0F49-#x0F69] | [#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | [#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | #x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | [#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | [#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | [#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | [#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | [#x1F20- Edmund Buchbinder 24.06.02 Seite 32/33 Seminar „XML und Datenbanken“ Thema: Übersicht XML Matrikel Nr. 5717574 #x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | #x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | [#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | [#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6#x1FFC] | #x2126 | [#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | [#x30A1#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3] [86] Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029] [87] CombiningChar ::= [#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591#x05A1] | [#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | [#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | [#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | #x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | [#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0#x09C4] | [#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | #x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | [#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | [#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | #x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | [#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6#x0BC8] | [#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | [#x0C46#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | [#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | [#x0D02-#x0D03] | [#x0D3E#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | #x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | [#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | #x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | [#x0F86#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | [#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | #x3099 | #x309A [88] Digit ::= [#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | [#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | [#x0BE7#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | [#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29] [89] Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE] Edmund Buchbinder 24.06.02 Seite 33/33 /RUHO HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ $XVDUEHLWXQJ#HLQHV#5HIHUDWV#LP#5DKPHQ#GHV 6HPLQDUV#4<45#%;0/#XQG#'DWHQEDQNHQ%/#66#5335 /HKUJHELHW#3UDNWLVFKH#,QIRUPDWLN#,9 Zugrundeliegender Artikel: S. Abiteboul, D. Quass, J. McHugh, J. Widom und J.L. Wiener. The Lorel Query Language for Semistructured Data. International Journal on Digital Libraries 1 (1), 68-88, 1997. http://dbpubs.stanford.edu:8090/pub/1996-36 Inga Overkamp Matrikel-Nr: q5688493 Studiengang Informatik (Bachelor) München, den 16.06.2002 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 ,QKDOWVYHU]HLFKQLV 4 (,1/(,781* 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111116 5 =8*581'(/,(*(1'(#'$7(102'(//( 11111111111111111111111111111111111111111111111111111111111111111117 514 2%-(&7#(;&+$1*(#02'(/#+2(0,111111111111111111111111111111111111111111111111111111111111111111111111111111111 7 515 2%-(&7#'$7$%$6(#0$1$*(0(17#*5283#+2'0*, 111111111111111111111111111111111111111111111111111111111111 8 6 /25(/#$/6#$1)5$*(0635$&+( 1111111111111111111111111111111111111111111111111111111111111111111111111119 614 &2(5&,211111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 9 615 9(5:(1'81*#921#(,1)$&+(1#3)$'$86'5h&.(1 11111111111111111111111111111111111111111111111111111111111111 : 616 9(5:(1'81*#921#$//*(0(,1(1#3)$'$86'5h&.(1 11111111111111111111111111111111111111111111111111111111111 ; 617 5(68/7$7(#921#/25(/0$1)5$*(1 1111111111111111111111111111111111111111111111111111111111111111111111111111111 43 7 /25(/#$/6#83'$7(0635$&+( 111111111111111111111111111111111111111111111111111111111111111111111111111 43 714 2%-(.7(567(//81*11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 44 715 1$0(16=8:(,681*(1 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 44 716 2%-(.783'$7(6 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 44 717 %8/.#/2$',1* 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 45 8 /25(/#,03/(0(17,(581*#,0#/25(#6<67(0 111111111111111111111111111111111111111111111111111111111 45 9 =86$00(1)$6681*#81'#6&+/8‰ 1111111111111111111111111111111111111111111111111111111111111111111111 45 : /,7(5$7859(5=(,&+1,61111111111111111111111111111111111111111111111111111111111111111111111111111111111 47 2 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 4 (LQOHLWXQJ Die Entwicklung des World Wide Web (WWW), eines multimedialen Hypertextsystems für dezentrale Netzwerke auf der Basis des TCP/IP Protokolls, löste Anfang der 90er Jahre einen exponentiellen Anstieg des weltweiten Datenaustausches aus. Aufgrund der verteilt erstellten Datensammlungen und der hohen Dynamik des Internets sind diese Daten in ihrer Mehrheit lediglich semistrukturiert, ihre Struktur ist also häufig • implizit, d.h. ohne explizite Beschreibung des zugrundeliegenden Schemas • irregulär, d.h. die Objekte können fehlen bzw. mehrmals auftreten und die verwendeten Datentypen sind nicht zwangsläufig einheitlich • partiell, d.h. neben strukturierten Daten können auch unformatierte Textelemente oder binäre 1 Daten abgelegt sein Die Verwaltung von Daten ohne strenge Typisierung stellt spezielle Anforderungen an das verwendete Datenbank Management System (DBMS). Beim Aufbau relationaler und objektorientierter Datenbanken muss zunächst ein konzeptionelles Modell definiert werden. Diese Schemabildung setzt eine vollständige Kenntnis der vorhandenen Strukturen und Beziehungen voraus. Gemäß ihrer Definition besitzen semistrukturierte Daten solche einheitlichen und vollständigen Strukturen gerade nicht. Darüber hinaus sollen die Datenbanken flexibel genug sein, um die dynamische Weiterentwicklung der semistrukturierten Daten und ihrer Anwendungen abbilden zu können. Für das effektive Retrieval von implizit und irregulär strukturierten Daten sollte das DBMS Mechanismen zur Verfügung stellen, anhand derer Anfragen an die Datenbank formuliert werden können, ohne dass die Struktur der Daten im Detail bekannt sein muss. Weiterhin sollten Anfragesprachen für semistrukturierte Daten nicht lediglich die Inhalte der Datenbank, sondern auch die Struktur selber suchbar machen. Insgesamt sind also die konventionellen DBMS nicht zur Verwaltung von semistrukturierten Daten geeignet und daher wurde nach neuen Ansätzen gesucht. 2 Mit dem „Lightweight Object Repository“ (Lore) begann die Datenbank-Gruppe der Universität Stanford 1995 ein Projekt, das die Entwicklung eines Systems zur effektiven Verwaltung von semistrukturierten Daten aus heterogenen Quellen zum Ziel hatte. Dabei basierte Lore zunächst auf einem eigenen Datenmodell (OEM). In den folgenden Jahren setzte sich XML als Quasi-Standard für die Repräsentation und den Austausch von Daten im WWW durch. An dem ursprünglichen Lore-Datenmodell wurden daher 1999 einige Änderungen vorgenommen, um die Verwaltung von XML-Dokumenten vollständig unterstützen zu 3 können . Die Datenmanipulationssprache Lorel („Lore Language“), die innerhalb dieses Projekts entwickelt wurde, ist syntaktisch an die deklarative Object Query Language (OQL) angelehnt. Obwohl Lorel speziell als Anfragesprache für Daten im Lore System entwickelt wurde, kann sie auch auf objektorientierte DBMS übertragen werden. Die in der zugrundeliegenden Arbeit beschriebene Beispiel-Implementierung wird in 4 dieser schriftlichen Ausarbeitung allerdings nicht behandelt werden . Die vorliegende schriftliche Ausarbeitung führt in Kapitel 2 zunächst kurz die dem Lore System zugrundeliegenden Datenmodelle ein. In Kapitel 3 und 4 werden die wesentlichen Erweiterungen von Lorel im Vergleich zu OQL dargestellt: • Einführung von Mechanismen zur Umformung von Datentypen (Type Coercion) • Verwendung von regulären Ausdrücken in Pfadangaben zur Abfrage von Daten in unbekannten Strukturen • Implementierung von Befehlen zur Datenmanipulation Kapitel 5 gibt eine kurzen Einblick in die Implementierung der Lorel Anfragesprache im Lore DBMS und im Kapitel 6 wird versucht, die in dieser Ausarbeitung vorgestellten Konzepte kritisch zu beurteilen. 1 vgl. (Greiner, 1999) und den entsprechenden Eintrag im Internet-Lexikon der Gesellschaft für Informatik: http://giserver.giev.de/informatik/lexikon 2 Weiterführende Informationen zu LORE finden sich auf der Projekt-Hompage: http://www-db.stanford.edu/lore 3 Die vorgenommenen Änderungen bei der Migration des Datenmodells auf XML sind ausführlich in (Goldman et al, 2000) beschrieben 4 vgl. (Abiteboul et al, 1997, S. 83f) 3 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 5 =XJUXQGHOLHJHQGH#'DWHQPRGHOOH Dieses Kapitel gibt einen Überblick über die Datenmodelle, die bei der Entwicklung des Lore-DBMS berücksichtigt wurden. 514 2EMHFW#([FKDQJH#0RGHO#+2(0, OEM ist ein Datenmodell, das für die Darstellung von semistrukturierten Daten geeignet ist. Ursprünglich an der Universität Stanford für das Tsimmis Projekt (The Stanford-IBM Manager of Multiple Information Sources) entwickelt, wurde das Modell im Sinne der Interoperabilität anschließend weiteren Projekten wie 3 5 zum Beispiel Lore und C zugrunde gelegt . Im Gegensatz zu XML gibt es in OEM kein Konzept zur expliziten Beschreibung der Grammatik in Form von Document Type Defintions (DTD). Ein Datenmodell zur Beschreibung semistrukturierter Daten muss sehr flexibel sein, um uneinheitliche Ansammlungen von Informationen abbilden zu können. Im OEM werden Daten und ihre Beziehungen untereinander als gerichtete Graphen dargestellt, wobei die OEM-Objekte durch die Knoten und ihre Attribute durch die beschrifteten Kanten (Labels) repräsentiert werden. Jedem Objekt wird ein eindeutiger Bezeichner (engl. "object identifier" = oid) zugewiesen. Man unterscheidet zwischen atomaren und komplexen Objekten: • Atomare Objekte sind die Blätter des OEM-Graphen. Sie enthalten Werte beliebiger Basisdatentypen, z. B. integer, string, gif, mpeg, java. • Alle restlichen Knoten im OEM-Graph werden als komplexe (zusammengesetzte) Objekte betrachtet. Diese bestehen aus einer Menge von Attributen, die wiederum „Subobjekte“, d.h. Referenzen auf untergeordnete Objekte sind. Objektreferenzen werden als Paar (Label, oid) dargestellt. Darüber hinaus besitzt jeder OEM-Graph mindestens eine benannte Wurzel, von der alle anderen Objekte erreichbar sein müssen, wobei Zyklen innerhalb des Graphen erlaubt sind. Die folgende Abbildung zeigt einen OEM Graphen für eine Datenbank zur Hausverwaltung: Hausverwaltung &1 Haus Haus Nachbarhaus &2 &12 Nachbarhaus PLZ &3 81541 Straße &4 Ort Wohnung &6 &5 „Hagener „München“ Str. 14“ Zimmerzahl Miete &7 Wohnung Wohnung &8 &13 Mieter Besitzer &44 Mieter &21 3 &45 &49 „I. Overkamp“ 19555555 5 &15 qm Name qm qm &14 78 Name KontoNr Adresse &16 &25 Besitzer Ort &31 &39 PLZ Strasse &26 &27 „München“ „81541“ „Hagener Str. 12“ Vorname Nachname Ort Postleitzahl 112 &22 &32 &33 &34 &35 „Knut Frick“ „Meike“ „Schmidt“ „Hagen“ 58084 Eine vollständige Beschreibung des Object Exchange Model findet sich bei (Goldman et al, 1996). 4 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 Der Knoten mit der oid &1 ist die Wurzel und gleichzeitig auch ein komplexes Objekt des OEM-Graphen für die Datenbank zur Hausverwaltung. Weitere Beispiele für komplexe Objekte sind die Knoten &2, &6 und &31. Jedes komplexe Objekt besitzt eine Reihe von Attributen bzw. Referenzen auf Subobjekte, für das Objekt &2 sind dies z.B. (Postleitzahl, &3), (Straße, &4), (Ort, &5), (Wohnung, &6) und (Nachbarhaus, &12). Die Knoten &3, &4 und &26 repräsentieren atomare Objekte, die Werte unterschiedlicher Basisdatentypen enthalten: 81541 ist vom Typ integer, während „Hagener Str. 14“ und „81541“ als Zeichenketten (Strings) abgelegt sind. Eine textuelle Darstellung obiger OEM-Datenbank könnte wie folgt aussehen: Hausverwaltung &1 Haus &2 PLZ &3 81541 Straße &4 "Hagener Str. 14" Ort &5 "München" Wohnung &6 Zimmerzahl &7 3 Miete &8 "850 •% Mieter &44 Name &45 "I. Overkamp" KontoNr &49 19555555 Nachbarhaus &12 Haus &12 Nachbarhaus &2 Wohnung &13 qm &14 78 qm &16 112 Besitzer &44 Mieter &21 Name &22 "Knut Frick" Wohnung &15 qm &16 Besitzer &31 Vorname &32 "Meike" Nachname &33 "Schmidt" Ort &34 "Hagen" Postleitzahl &35 58084 Adresse &25 Ort &39 "München" PLZ &26 "81514" Strasse &27 "Hagener Str. 12" Die Hausverwaltungs-Datenbank verdeutlicht die potentielle Irregularität semistrukturierter Daten. Inhaltsverwandte Objekte können z. B. • uneinheitlich bezeichnet sein: „Postleitzahl“ <#Ä3/=³ • in verschiedenen Ebenen innerhalb der Struktur abgelegt sein: „Straße“ • unterschiedliche Attribute bzw. Subobjekte umfassen: Besitzer = „Name“, „KontoNr“, „Vorname“, „Nachname“, „Ort“, „PLZ“ • einzelne Attribute bzw. Subobjekte nicht oder wiederholt enthalten: „Wohnung“ • von unterschiedlichem Datentyp sein: „PLZ“ 515 2EMHFW#'DWDEDVH#0DQDJHPHQW#*URXS#+2'0*, Anfang der 90er Jahre haben sich führenden Hersteller von objektorientierten Datenbank Management Systemen (ODBMS) zur ODMG zusammengeschlossen und gemeinsam ein Datenmodell für 6 objektorientierte Datenbanken definiert . Der ODMG-Standard umfasst u.a. die Object Query Language (OQL) zur Bildung von Anfragen auf Datenbankobjekten, die der SQL-Syntax angelehnt ist. 6 Weiterführende Informationen zum ODMG finden sich auf deren Homepage: http://www.odmg.org 5 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 Mit den folgenden Anpassungen ist es möglich, OEM Objekte ins ODMG Datenmodell zu integrieren: • Einführung von speziellen OEM-Datentypen ins ODMG Modell, z.B. OEM , OEMcomplex, OEMstring, ..., OEMnil • Direkte Umsetzung der atomaren OEM-Objekte ins ODMG Datenmodell • Erweiterung der komplexen OEM-Objekte zu einheitlichen Tupeln aller in der Datenbank vorkommenden Attribute. Als Konsequenz sind die komplexen Objekte anschließend alle vom gleichen Datentyp (OEMcomplex). 7 6 /RUHO#DOV#$QIUDJH06SUDFKH Um semistrukturierte Daten erfolgreich und effektiv abfragen zu können, wurde Lorel gegenüber OQL um einige mächtige Mechanismen zur Typanpassung (Type Coercion) und zur Formulierung von Pfadausdrücken erweitert. 614 &RHUFLRQ Semistrukturierte Daten sind irregulär und daher würden strukturbasierte Anfragen an diese Daten regelmäßig Fehlermeldungen zurückliefern. Folgende OQL-Anfragen können in der HausverwaltungsDatenbank aus Kap. 2.1 nicht erfolgreich abgearbeitet werden: Beispiel 1: select H.Wohnung from Hausverwaltung.Haus H where H.PLZ = "81541" Fehlermeldung, da unterschiedliche Datentypen (string <#LQWHJHU,#PLWHLQDQGHU#YHUJOLFKHQ#ZHUGHQ sollen Beispiel 2: select W.Besitzer from Hausverwaltung.Haus H, H.Wohnung W where W.qm = 78 Fehlermeldung, da in der where-Klausel versucht wird, eine Vergleichsoperation auf einer Menge von Zahlen durchzuführen (W.qm liefert für das Objekt &13 die Ergebnismenge {78, 112}) Beim Retrieval nach semistrukturierten Daten können beim Nutzer keine detaillierten Kenntnisse über die Struktur der komplexen Objekten oder über die präzisen Datentypen der atomaren Objekte vorausgesetzt werden. Die Entwickler von Lorel haben den Grundsatz: „Doing the intuitive thing“ geprägt (vgl. Abiteboul, 1997, S. 73). Sie meinen damit, dass Lorel-Anfragen, die Sinn machen, keine Laufzeitfehler bei der Ausführung auf OEM-Daten erzeugen sollen. Zur Umsetzung der obigen Anfragen werden in Lorel Anpassungen (Coercion) auf verschiedenen Ebenen vorgenommen: • Beispiel 1: Vergleich von atomaren Objekten mit Werten Zunächst müssen die atomaren Objekte dereferenziert und anschließend in vergleichbare Werte konvertiert werden (Type Coercion). Die Umformung geschieht anhand von TypanpassungsRegeln, die vorher für alle in der Datenbank vorkommenden Basisdatentypen in Bezug auf die gültigen Operationen definiert werden müssen. Ist für den Wert des atomaren Objektes keine Umsetzung in den erforderlichen Datentyp möglich, wird der Rückgabewert false generiert. Für die Auswertung der Gleichheitsoperation zwischen Werten der Typen integer und string 8 könnten z.B. folgende Regeln gelten : 81541 = 81541 Zwei integer Werte können ohne Umformung miteinander verglichen werden. Rückgabewert: true 81541 = "test" Der String kann nicht in einen integer Wert umgeformt werden. Rückgabewert: false 81541 = "081541" Die Umformung gelingt und anschließend wird ein Vergleich durchgeführt. Rückgabewert: true "81541" = "081541" Beide Operanden sind vom Typ string und müssen daher nicht umgeformt werden. Rückgabewert false 7 Der Typ OEM bildet eine Obermenge über die restlichen OEM-Datentypen Obwohl in dem Beispiel lediglich der Gleichheitsoperator angewendet wird, gelten die Regel auch für die restlichen arithmetischen Vergleichsoperationen, z.B.: <, >, ≠ 8 6 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 • Beispiel 2: Vergleich eines Werts / atomaren Objektes mit einer Objektmenge Um die zweite Anfrage gemäß den Erwartungen des Nutzers zu gestalten, wird bei der Umsetzung der WHERE-Anfrage durch Lorel automatisch ein Existenz-Operator eingefügt: where exists Q in W.qm : Q = 78 Die Variable Q wird nun nacheinander mit den Objekten aus der Objektmenge belegt. Im Anschluß an die zusätzlich notwendige Type Coercion (s.o.) können die Vergleichsoperationen auf den Werten durchgeführt werden. Das letzte Beispiel macht bereits deutlich, dass Lorel die Rückgabe zu einer Anfrage immer als Menge 9 von OEM-Objekten interpretiert . Falls die abgefragten Attribute bei den betrachteten Objekten fehlen, wird eine leere Ergebnismenge zurückgeliefert. Da die Abfrage der Existenz eines Elementes auf einer leeren Menge lediglich ein Spezialfall der allgemeinen Operation ist, wird auch in diesen Fällen nie eine Fehlermeldung ausgelöst. Zur Vollständigkeit seien noch folgende Gleichheitsoperationen genannt: • Vergleich zwischen Objekten: Bei der Prüfung der Objektidentität wird analog zu OQL true zurückgeliefert, falls oid1 = oid2 gilt. Darüber hinaus führt Lorel einen weiteren Vergleichsoperator (==) ausschließlich für atomare Objekte ein. Dieser testet im Gegensatz zur Objektidentität, ob die Werte der Objekte gleich sind. • Vergleich zwischen Objektmengen: Überprüfung der Mengenidentität, d.h. für jedes Objekt der einen Menge muss ein identisches Objekt in der anderen Menge existieren. • Vergleich eines Werts, atomaren Objektes oder einer Objektmenge mit einem komplexen Objekt: Da es nicht eindeutig ist, welche Subobjekte des komplexen Objektes für den Vergleich herangezogen werden sollen, wird false zurückgeliefert. • Vergleich von String-Werten atomarer Objekte: Für den Vergleich von Zeichenketten stellt Lorel zusätzliche Operatoren wie z.B. grep (Zeichenketten-Übereinstimmung) oder soundex (phonetische Übereinstimmung) zur Verfügung. 615 9HUZHQGXQJ#YRQ#HLQIDFKHQ#3IDGDXVGU•FNHQ Die Verwendung von Pfadangaben zur Selektion einer Menge von Objekten entspricht dem Durchlaufen des gerichteten OEM-Graphen von einem benannten Einstiegspunkt bis zum Zielobjekt. Der Pfadausdruck setzt sich aus der Sequenz aller zwischen den beiden Objekten liegenden Kantenbezeichnungen zusammen. Dabei ist darauf zu achten, das ein Lorel-Pfadausdruck einen, keinen oder auch mehrere Datenpfade referenzieren kann, z.B. Pfadausdruck: Hausverwaltung.Haus.Wohnung.Besitzer Datenpfad1: Hausverwaltung,&1,Haus,&12,Wohnung,&13,Besitzer,&44 Datenpfad2: Hausverwaltung,&1,Haus,&12,Wohnung,&15,Besitzer,&31 Einfache Pfadausdrücke sind nicht mehr als syntaktische Bequemlichkeiten, sie werden bei der Ausführung durch das Lore-System auf OQL-ähnliche Anfragen zurückgeführt. Je nachdem in welchem Zusammenhang die Pfadangabe verwendet wird, müssen bei der Umsetzung spezifische Regeln beachtete werden: • FROM-Anweisung - Für jede Kantenbezeichnung der verwendeten Pfadangabe wird eine Variable eingeführt. Bei Lorel-Anfragen ohne FROM-Klausel wird diese aus der SELECT-Anweisung generiert. • SELECT-Anweisung - Falls der vollständige Pfad bereits in der FROM-Anweisung benutzt wurde, wird die entsprechende Variable wiederverwendet. Ansonsten muss der (Rest-) Pfad anhand einer verschachtelten SELECT-Anweisung umgesetzt werden: select Hausverwaltung.Haus.Adresse.Ort Lorel-Anfrage from Hausverwaltung.Haus.Wohnung.Mieter M where M.Name = "Knut Frick" select (select O from H.Adresse A, A.Ort O) OQL-Anfrage mit from Hausverwaltung.Haus H, verschachtelter H.Wohnung W, Select-Anweisung W.Mieter M where M.Name = "Knut Frick" 9 Auf die genaue Struktur der Ergebnis-Mengen in Lorel wird in Kap. 3.4 eingegangen 7 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 • WHERE-Anweisung - Auch hier werden zunächst die entsprechenden Variablen aus der FROMAnweisung wiederverwendet. Falls der benötigte Pfad noch nicht vollständig referenziert wurde, werden in der WHERE-Klausel neue Variablen eingeführt, die über Existenzquantoren gebunden sind: select Hausverwaltung.Haus Lorel-Anfrage from Hausverwaltung.Haus where Hausverwaltung.Haus.Adresse.PLZ = 81541 select H OQL-Anfrage mit from Hausverwaltung.Haus H Existenzquantoren where exists A in H.Adresse: exists P in A.PLZ : P = 81541 Die Umformung der WHERE-Anweisung wird umso komplexer, je mehr Pfadangaben darin vorkommen, die noch nicht in der FROM-Klausel verwendet wurden. Vor allem die Verknüpfung mehrerer Bedingungen durch logische Operatoren kann zu ungewollten Einschränkungen des Ergebnisses führen, weil der Exists-Operator bei ungünstiger Anordnung das Vorkommen aller Attribute für die betrachteten Objekte beinhaltet. select Hausverwaltung.Haus Lorel-Anfrage from Hausverwaltung.Haus where Hausverwaltung.Haus.Adresse.PLZ = 81541 or (Hausverwaltung.Haus.Adresse.Ort = "München" and Hausverwaltung.Haus.Adresse.Strasse = "Hagener Str.") select H Die Auswertung der from Hausverwaltung.Haus H Bedingung in der where exists A in H.Adresse: WHERE-Anweisung exists P in A.PLZ : liefert false zurück, exists O in A.Ort : falls das Adressenexists S in A.Strasse : Objekt nicht alle (P = 81541 or Attribute (PLZ, Ort (O = "München" and S = "Hagener Str.")) und Strasse) enthält Um diese Fehlinterpretation zu umgehen, sollte die durch den exists-Operator gebunden Variable der WHERE-Anweisung möglichst durch Klammerung mit der Auswertung der Bedingung zusammengefaßt werden: select H OQL-Anfrage mit from Hausverwaltung.Haus H geklammerten where exists A in H.Adresse: Existenz-Operatoren ((exists P in A.PLZ : P = 81541) or ((exists O in A.Ort : O = "München") and (exists S in A.Strasse : S = "Hagener Str."))) Eine zweite Möglichkeit ist die Bildung einer Vereinigungsmenge mit dem Objekt oemnil des Datentypes OEMnil, das als Objekt zwar eine Existenz hat, aber für jede Bedingung mit false ausgewertet wird: select H OQL-Anfrage unter from Hausverwaltung.Haus H Verwendung von where exists A in (H.Adresse union set (oemnil)): oemnil exists P in (A.PLZ union set (oemnil)): exists O in (A.Ort union set (oemnil)): exists S in (A.Strasse union set (oemnil)): (P = 81541 or (O = "München" and S = "Hagener Str.")) 616 9HUZHQGXQJ#YRQ#DOOJHPHLQHQ#3IDGDXVGU•FNHQ Einfache Pfadausdrücke sind die grundlegenden Bausteine der Lorel-Anfragen, die durch den zusätzlichen Einsatz von regulären Ausdrücken und Wildcards deutlich an Flexibilität gewinnen. Reguläre Ausdrücke (engl. „general path expression“ oder gpe) dienen zur Definition von Mustern für die Teilpfade, während die Stellvertreter (engl. „wildcards") eine Maskierung einzelner Kantenbeschriftungen (Labels) erlauben. Anhand dieser Mechanismen wird die Behandlung von Daten in unbekannten Strukturen erst möglich. Im Gegensatz zu den einfachen Pfadangaben können die allgemeinen Pfadausdrücke nicht durch OQL-Anfragen repräsentiert werden. 8 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 Die folgende Tabelle listet die in Lorel verwendeten regulären Ausdrücke auf: Reguläre Ausdrücke für Pfade (Teilpfad|Teilpfad) z.B.: .Adresse.(Strasse|Straße) Disjunktion der Teilpfade, d.h. nach „Adresse“ muss im Pfad eine Kante „Strasse“ oder eine Kante „Straße“ folgen (Teilpfad)? z.B.: .Haus(.Adresse)?.PLZ Optionaler Teilpfad, d.h. der Pfad nach „Haus“ kann eine oder keine Kante mit der Beschriftung „Adresse“ beinhalten (Teilpfad)+ z.B.: .Haus(.Nachbarhaus)+ Wiederholter Teilpfad, d.h. die Kante „Nachbarhaus“ ist mindestens einmal im Pfad vorhanden oder kann beliebig häufig wiederholt werden (Teilpfad)* z.B.: .Haus(.Nachbarhaus)* Wiederholter Teilpfad, wobei die Kante „Nachbarhaus“ auch nullmal im Pfad vorkommen kann Platzhalter für Kanten % z.B.: Besitzer.%name Null oder beliebig viele Zeichen, d.h. es wird sowohl das Objekt „Besitzer.Vorname“ als auch „Besitzer.Nachname“ referenziert # z.B.: Hausverwaltung.# Beliebig lange Pfadausdrücke, d.h. nach dem Einstiegspunkt „Hausverwaltung“ können im Pfad null oder beliebig viele Kanten folgen. # steht als Abkürzung für „(.%)*“ Vorsicht ist vor allem bei der Formulierung sehr unpräziser Pfadangaben unter Verwendung der Zeichen „*“ und „+“ geboten. Diese Ausdrücke können mit einer unendliche Menge an Datenpfaden übereinstimmen, falls in dem zugrundliegenden OEM-Graphen Zyklen vorhanden sind, z.B. referenziert der Pfad „Hausverwaltung.Haus(.Nachbarhaus)*“ folgende Datenpfade: Hausverwaltung,&1,Haus,&2 Hausverwaltung,&1,Haus,&2,Nachbarhaus,&12 Hausverwaltung,&1,Haus,&2,Nachbarhaus,&12,Nachbarhaus,&2 Hausverwaltung,&1,Haus,&2,Nachbarhaus,&12,Nachbarhaus,&2,Nachbarhaus,&12 .... In Lorel wird das Problem dadurch unterbunden, dass jedes Objekt höchstens einmal innerhalb eines regulären Pfadausdruckes, der mit „*“ oder „+“ abschließt, vorkommen darf. Lorel erzeugt also zu dem 10 obigen Beispiel lediglich die ersten drei Datenpfade . Eine weitere Besonderheit stellt Lorel mit dem Konzept der Pfadvariablen zur Verfügung. Diese werden unter Verwendung des Symbols „@“ an einen regulären Ausdruck innerhalb der Pfadangabe gebunden und können so Informationen über die Struktur der in Lore abgelegten Daten geben. Als Werte wird den Pfadvariablen eine Menge von Datenpfaden oder Kantenbeschriftungen zugewiesen, die anschließend mit der Funktion path-of() in Strings umgeformt werden können, z.B.: Anfrage Ergebnismenge select distinct path-of(B) from Hausverwaltung.#@B X where X grep "Str." a) Pfade Haus.Straße Haus.Adresse.Strasse Haus.Nachbarhaus.Straße Haus.Nachbarhaus.Adresse.Strasse select distinct path-of(B) from Hausverwaltung.#.%@B X where X grep "Str." b) Labels Straße Strasse 10 Der dritte Datenpfad wird noch aufgelöst, weil das erste Vorkommen des Objekts &2 nicht an den regulären Ausdruck (.Nachbarhaus)* gebunden ist 9 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 Darüber hinaus können in allgemeinen Pfadausdrücken auch Objektvariablen an beliebigen Stellen innerhalb der Pfads und nicht nur am Ende eines Pfades eingeführt werden. Lorel sieht für die Kennzeichung dieser Objektvariablen die geschweiften Klammern vor, z. B. ist select W from Hausverwaltung.Haus{H}.Wohnung W where H.(Adresse)?.Ort = "München" identisch mit select W from Hausverwaltung.Haus H, H.Wohnung W where H.(Adresse)?.Ort = "München" 617 5HVXOWDWH#YRQ#/RUHO0$QIUDJHQ Das Ergebnis einer Anfrage in Lorel ist eine Multimenge von OEM-Objekten. Bei der Verwendung des Schlüsselwortes DISTINCT in der Select-Anweisung werden vorhandene Objekt-Dubletten mittels eines Abgleich der oid ermittelt und eliminiert. Vor der Rückgabe an das Lore-System wird die Objektmenge mittels der Funktion to_oem in ein neu erstelltes OEM-Objekt mit der Bezeichnung Answer zusammengeführt. Dabei können durch die Funktion je nach Art der Rückgabe der SELECT-Anweisung (Wert, Wertemenge, Objekt, Objektmenge) neue Objekte und Kanten im OEM-Graphen generiert werden. Beispiele: Anfrage Ergebnis als OEM-Objekt select W Answer &111 from Hausverwaltung.Haus.Wohnung W Wohnung &6 Wohnung &13 Wohnung &15 select W.Mieter, W.Besitzer Answer &112 from Hausverwaltung.Haus.Wohnung W Wohnung &113 Mieter &44 Wohnung &114 Besitzer &44 Mieter &21 Wohnung &115 Besitzer &31 Das Answer-Objekt kann umbenannt werden und steht damit zur Weiterverwendung in späteren Anfragen zur Verfügung. 7 /RUHO#DOV#8SGDWH06SUDFKH Im Vergleich zu OQL implementiert Lorel eine Reihe von zusätzlichen Befehlen zur Datenmanipulation, z.B. zur Erstellung atomarer und komplexer Objekte, zur Zuweisung von Namen zu Objekten und zur Änderung der Werte einzelner und einer Menge von Objekten. 10 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 714 2EMHNWHUVWHOOXQJ Innerhalb von Lorel können unter Verwendung der Funktion new_oem sowohl atomare als auch komplexe Objekte neu erstellt werden. Im Funktionsaufruf werden Datentyp (z.B.: integer, string, complex) und die Werte übertragen, z.B.: new_oem(int,5) erstellt ein atomares OEM-Objekt vom Typ integer mit dem Wert 5 new_oem erstellt zunächst ein komplexes OEM(complex, Objekt und anschließend zwei atomare struct(Name:{new_oem(string,"Hohl")}, Subobjekte, die über die Kanten Name Konto:{new_oem(int,12233445)})) und Konto mit dem komplexen Objekt verbunden werden Im Gegensatz zur Objekterstellung hat Lorel keinen expliziten Befehl zum Löschen eines Objektes vorgesehen. Stattdessen wird ein Objekt automatisch durch den „Garbage Collector“ gelöscht, nachdem in der Datenbank keine Referenz mehr auf das Objekt existiert und es somit unerreichbar geworden ist. 715 1DPHQV]XZHLVXQJHQ Im Object Exchange Model wurde das Namenskonzept der ODMG übernommen, das eindeutige Namen als Alias für Objekte und als Einstiegspunkte für eine Datenbank vorsieht. In Lorel können Namenszuweisungen im Anschluß an eine Objektselektion erfolgen. Da aber Namen immer nur auf genau ein OEM-Objekt verweisen dürfen, muss die Rückgabe mittels der Funktion to_oem in ein komplexes Objekt umgewandelt, falls mehr als eins zurückgeliefert wird. Beispiele: name meineWohnung := element11 (select Hausverwaltung.Haus.Wohnung where Hausverwaltung.Haus.Wohnung.#.%name grep Overkamp) name meineQM := element (select Hausverwaltung.Haus.Wohnung.qm where Hausverwaltung.Haus.Wohnung.#.%name grep Overkamp) Darüber hinaus ist es auch möglich, Objekten bereits bei der Erstellung mit einem Namen zu belegen: name neueAdresse := new_oem (complex, struct(Ort:{new_oem(string,"Göttingen")}, PLZ:{new_oem(integer,37073)}, Strasse:(new_oem(string,"Münchner Allee 13")})) Über die folgende Syntax können Namen gelöscht werden: name meineWohnung := null 716 2EMHNWXSGDWHV Das Aktualisieren der Werte von benannten atomaren und komplexen OEM-Objekten erfolgt duch den Update-Befehl, z.B. update meineWohnung.Miete := "900 •% entfernt zunächst alle Kanten mit der Bezeichnung Miete vom komplexen Objekt meineWohnung und verbindet dieses anschließend durch eine neue Kante mit einem atomaren Objekt mit dem Werts „900 •³ update meineWohnung.qm += 64 fügt dem komplexen OEM-Objekt über eine neue Kante qm eine zusätzliche Referenz auf ein Objekt mit dem Wert 64 hinzu update meineQM -= 10 dekrementiert den integer Wert des atomaren Objektes meineQM um zehn 11 element ist ein Schlüsselwort in OQL, dass das Element einer einelementigen Menge zurückliefert 11 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 Zusätzlich zur Änderung einzelner OEM-Objekte, die eindeutig über einen Namen referenziert werden, ermöglicht der Update-Befehl auch die Manipulation der Werte einer Menge von Objekten durch eine einzige Anweisung. Dazu wird folgende Update-Syntax verwendet: update H.PLZ += P from Hausverwaltung.Haus{H}.Adresse.(PLZ|Postleitzahl) P where P <= 80000 Diese Lorel-Anfrage weist allen Haus-Objekten, die der Where-Anweisung genügen, die zugehörige Postleitzahl als direktes Unterobjekt zu. 717 %XON#/RDGLQJ Lorel stellt eine weitere Funktion zum Laden von atomaren und komplexen Objekten aus einer Datei zur Verfügung: load <dateiname> Bei dem sogenannten „Bulk Loading“ werden zunächst die Angaben aus der Textdatei ausgelesen und anschließend die dort beschriebenen atomaren und komplexen Objekte erstellt. Die neuen Objekte können sowohl als eigene Datenbank oder auch als Subobjekte zu eindeutig benannten Objekten einer anderen Datenbank eingespielt werden. 8 /RUHO#,PSOHPHQWLHUXQJ#LP#/RUH#6\VWHP 12 Lorel wurde speziell für die Formulierung von Abfragen an das Lore Datenbank Management System von Grund auf neu entwickelt. In diesem Kapitel soll die Implementierung der Anfragesprache im Lore DBMS kurz erläutert werden. Lore bietet den Anwendern verschiedene Nutzeroberflächen (z.B. ein textbasiertes Eingabefenster für die Entwickler oder eine graphische Benutzeroberfläche für den Endnutzer) um Anfragen an das Datenbanksystem zu formulieren. Bevor der Objekt-Manager die eigentlichen Selektionen auf den abgespeicherten Daten ausgeführen kann, muss die Anfrage in einer Reihe von Schritten aufbereitet werden: 1. Im Query Parser wird die textuelle Anfrage in die einzelnen Elemente zergliedert und in einer Baumstruktur abgelegt. 13 2. Im Preprocessor wird die Lorel-Anfrage in eine OQL-ähnliche Syntax umgeformt . 3. Unter Verwendung des Query Plan Generator wird ein logischer Plan zur Abarbeitung der Anfrage erstellt. Obwohl Lore ein objektorientiertes Datenmodell zugrunde liegt, wird die Anfrage weiterhin in eine Sequenz von relationalen Datenbankoperationen (z.B. SCAN, JOIN, SELECT, PROJECT) transformiert. Diese Operationen weichen aber in ihrer Realisierung z.T. deutlich von den traditionellen Funktionalitäten ab, z.B. werden die regulären Pfadausdrücke erst durch eine oder mehrere Iterationen des SCAN-Vorgangs interpretiert. 4. Anschließend erfolgt die Optimierung des logischen Plans anhand einiger fester Regeln. Darüber hinaus wird überprüft, inwieweit Indexe bei der Abarbeitung der Anfrage herangezogen werden können. 5. Aus dem optimierten logischen Anfrage-Plan wird in eine physischen Zugriffsplan generiert. 6. Abschließend wird die optimierten Anfrage auf dem Datenbestand ausgeführt. Schließlich sei noch kurz auf das Konzept der "Data Guides" innerhalb von Lore hingewiesen. Diese Struktur-Ansichten werden von Lore automatisch zu einer gegebenen OEM-Datenbank erstellt und dynamisch gepflegt. Die Data Guides sind wiederum OEM-Graphen, aus denen aber im Vergleich zur Gesamt-Datenbank jene identischen Pfadangaben entfernt wurden, die wiederholt auftreten. Data Guides stellen daher die Struktur der zugrundeliegenden Datenbank deutlich übersichtlicher dar. Lore beinhaltet eine graphische Oberfläche für Struktur-Ansicht, die es dem Endnutzer ermöglicht, darüber einfache Suchanfragen an die Datenbank zu stellen. Darüber hinaus werden diese Informationen aber auch im Rahmen der Anfrage Optimierung innerhalb des Lore DBMS verwendet. 12 13 Die Lore-Architektur ist in (McHugh et al, 1997) beschrieben z.B. durch das Auflösen der einfachen Pfadausdrücke, vgl. Kap. 3.2 12 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 9 6FKOX‰EHPHUNXQJ Lorel ist eine sehr leistungsfähige und flexible Anfragesprache, die auf der Basis von verbreiteten Datenbank-Standards (z.B. ODMG, OQL und XML) alle Anforderungen erfüllt, die für die Verwaltung von semistrukturierten Daten erforderlich sind: • Durch umfangreiche Regeln zur Datenumsetzung (Type Coercion) befähigt Lorel den Anwender, Abfragen auf semistrukturierten Daten absetzen zu können, ohne daß genaue Kenntnisse über die Struktur der komplexen Objekte oder über die präzisen Datentypen der atomaren Objekte notwendig sind. • Das Konzept der regulären Ausdrücke in Pfadangaben und der Stellvertreter („wildcards") in Labeln erlaubt die Formulierung von mächtigen Suchmustern auf der Datenstruktur, anhand derer die Abfrage von implizit und irregulär strukturierten Daten erst möglich wird. • Über die Verwendung von Pfadvariablen innerhalb der allgemeinen Pfadangaben wurden den Anwendern ein funktionales Hilfsmittel zur Analyse der unbekanten Datenstruktur zur Verfügung gestellt. Allerdings beinhaltet die hohe Flexibilität bei der Formulierung und Umsetzung von Lorel-Anfragen eine Reihe von Problemen, von denen die Performance-Einbußen aufgrund der umfangreichen DatentypUmsetzungen (Type Coercion) vermutlich vom technischen Standpunkt noch am einfachsten zu lösen 14 sind . In meinen Augen ist der Lorel-Grundsatz im Zusammenhang mit der Verwendung von regulären Ausdrücken in Pfadangaben (“Doing the intuitive thing) zwar sehr pragmatisch angelegt, aber doch nicht völlig unkritisch zu beurteilen. Immerhin kann eine Suchanfrage durch den unbedachten Einsatz sehr mächtiger regulärer Ausdrück wie "*", "+" oder "#" so unpräzise werden, daß sie Ergebnisse zurückliefert, die gerade nicht vom Anwender erwartet werden. Zum Beispiel liefert die folgende Suchanfrage auf der OEM-Datenbank aus Kap. 2.1 select H from Hausverwaltung.Haus H where H.#.(postleitzahl|plz) != 81541 das Objekt mit der oid &12 zurück, obwohl das Haus dem Postleitzahlenbereich 81541 zugeordnet ist. Umso ungenauer Suchanfragen werden, umso größer wird der Anteil an unzutreffenden Treffern in der Ergebnismenge. In diesem Zusammenhang finde ich vor allem die Entwicklung von graphischen 15 Benutzeroberflächen zur Selektion semistrukturierter Daten anhand dynamisch erstellter Data Guides im Ansatz sehr überzeugend. Diese Sichten auf die Struktur erlauben - solange sie übersichtlich bleiben mit Sicherheit eine optimale Datenselektion durch den Anwender. Als weiteres Problemfeld ist vermutlich noch die hohe Komplexität der Lorel-Syntax zu nennen. Auch in dieser Beziehung müssen die angebotenen graphischen Nutzeroberflächen sehr mächtig sein, um dem Endnutzer nicht lediglich einen eingeschränkten Funktionsumfang von Lorel zur Verfügung zu stellen. 14 15 vgl. http://www.eecs.wsu.edu/~cdyreson/teaching/advancedDatabase/011/discussions/fivereport.htm vgl. (McHugh et al, .1997, S. 62f) 13 ,QJD#2YHUNDPS=#/RUHO#±#HLQH#$QIUDJHVSUDFKH#I•U#VHPLVWUXNWXULHUWH#'DWHQ/#6HPLQDU#Ä;0/#XQG#'DWHQEDQNHQ³/#66#5335 : /LWHUDWXUYHU]HLFKQLV S. Abiteboul, D. Quass, J. McHugh, J. Widom und J.L. Wiener. The Lorel Query Language for Semistructured Data. In: International Journal on Digital Libraries 1 (1), 68-88, 1997. http://dbpubs.stanford.edu:8090/pub/1996-36 Gesellschaft für Informatik. Informatik-Lexikon. http://giserver.gi-ev.de/informatik/lexikon R. Goldman, S. Chawathe, A. Crespo, J. McHugh. A Standard Textual Interchange Format for the Object Exchange Model (OEM). Technical Report, October, 1996. ftp://db.stanford.edu/pub/papers/oemsyntax.ps http://www-db.stanford.edu/lore/pubs/oemsyntax.pdf R. Goldman, J. McHugh, J. Widom. From semistructured data to XML: Migrating the Lore data model and query language. Markup Languages 2 (2), 153-163, 2000. U. Greiner. Semistrukturierte Daten. 1999. http://doesen8.informatik.uni-leipzig.de/de/seminararbeiten/semSS99/arbeit3/inhalt.html J. McHugh, S. Abiteboul, R. Goldman, D. Quass, and J. Widom. Lore: A Database Management System for Semistructured Data. In: SIGMOD Record, 26(3):54-66, September 1997. ftp://db.stanford.edu/pub/papers/lore97.ps http://www-db.stanford.edu/lore/pubs/lore97.pdf 14 Lore Ein Datenbanksystem für semistrukturierte Daten Seminar XML und Datenbanken Wolfgang Müßler Lehrgebiet Praktische Informatik IV Prof. Dr. Ralf Hartmut Güting FernUniversität Hagen Lore - ein DBMS für semistrukturierte Daten 1 2 3 4 5 6 Seite 2 von 17 Übersicht ............................................................................................................................ 3 Repräsentation semistrukturierter Daten............................................................................ 4 2.1 Das OEM-Datenmodell von Lore (Object Exchange Model).................................... 4 2.2 Das XML-Datenmodell von Lore .............................................................................. 5 Systemarchitektur............................................................................................................... 7 Überblick.................................................................................................................... 7 3.1 3.2 Top-Down-Ansatz der Abfrageverarbeitung ............................................................. 8 3.2.1 Abfrageoperatoren (Query operators) ................................................................ 9 3.3 Bottom-Up Ansatz der Abfrageverarbeitung ............................................................. 9 3.3.1 Lindex (Label Index).......................................................................................... 9 3.3.2 Vindex (Value Index)......................................................................................... 9 3.3.3 Abfrageplan mit Indexierung ........................................................................... 10 DataGuides ....................................................................................................................... 11 4.1 Definition und Eigenschaften von DataGuides ........................................................ 11 4.2 Unterstützung des Benutzers durch DataGuides ...................................................... 12 4.2.1 Unterstützung bei der Erfassung von Struktureigenschaften ........................... 13 4.2.2 Unterstützung bei der Formulierung von Abfragen ......................................... 14 4.3 Unterstützung des Systems durch DataGuides bei der Auswertung von Abfragen. 14 Zusammenfassende Bewertung von Lore ........................................................................ 16 Literatur............................................................................................................................ 17 Lore - ein DBMS für semistrukturierte Daten Seite 3 von 17 1 Übersicht Traditionelle Datenbanksysteme sind an ein explizit spezifiziertes Datenbankschema gebunden. Dadurch entstehen möglicherweise folgende Schwierigkeiten: 1. Die Daten selbst sind irregulär und lassen sich nicht mit einem starren Schema beschreiben. 2. Die Daten sind zwar regulär, aber im Voraus nicht bekannt, so daß das Schema ständig aktualisiert werden muß. Lore ("Leightweight Object Repository") ist ein Datenbanksystem, das mit semistrukturierten Daten arbeitet. Semistrukturierte Daten genügen einer gewissen Struktur (siehe unten), müssen aber nicht zuvor durch ein explizites Schema beschrieben werden. Das Fehlen eines expliziten Schemas führt zu anderen Problemen, die mit der Entwicklung von Lore erkannt und auch teilweise gelöst wurden: 1. Ein einfaches Datenmodell soll die semistrukturierten Daten beschreiben: zunächst wurde Lore mit dem OEM ("Object Exchange Model") implementiert, einem sehr einfachen und klaren Datenmodell, das die Daten durch einen gerichteten, attributierten Graphen beschreibt. Aufgrund der zunehmenden Popularität von XML wurde später das OEM-Datenmodell auf ein etwas komplexeres XML-Datenmodell migriert. Erklärtes Ziel von Lore war nämlich, auch externe semistrukturierte Daten integrieren zu können und derartige Daten liegen heute in der Regel in einem XMLFormat vor. 2. Eine Sprache zur Abfrage und Manipulation der Daten mußte entwickelt werden, Lorel ("Lore-Language"). 3. Traditionelle Bestandteile von Datenbanksystemen, wie Abfrageoptimierung oder die Verwendung von Indizes wurden auch bei Lore effizienzsteigernd implementiert; allerdings kann ein Index schwerlich vom Administrator verwaltet werden, da dieser zunächst die Struktur der Daten nicht kennt. 4. Der Benutzer muß zur Formulierung von Abfragen eine gewisse Struktur der Daten erkennen können, die durch sogenannte "Data-Guides" beschrieben wird. Data-Guides sind eine dynamische prototypartige Abbildung der semistrukturierten Daten und übernehmen die Rolle des statischen Datenbankschemas auch für systeminterne Statistiken z.B. zur Abfrageoptimierung. Im Rahmen meines Vortrags werde ich zuerst auf die Datenmodelle, anschließend auf die Systemarchitektur mit Betonung der Abfrageverarbeitung und zum Schluß auf DataGuides eingehen. Weitere interessante Komponenten von Lore, wie der externe Datenmanager, würden leider den Rahmen meines Vortrages sprengen. Lore - ein DBMS für semistrukturierte Daten Seite 4 von 17 2 Repräsentation semistrukturierter Daten 2.1 Das OEM-Datenmodell von Lore (Object Exchange Model) Die Daten im OEM können als gerichteter, attributierter Graph repräsentiert werden: • Knoten sind Objekte, jeder Knoten hat einen eindeutigen Objektidentifikator (z.B. &1) • Atomare Objekte sind Knoten mit einem atomaren Wert (z.B. Typ integer, real, string, gif, java, audio etc.) ohne ausgehende Kante. • Komplexe Objekte sind Knoten ohne atomaren Wert mit ausgehenden Kanten, die zu Subobjekten zeigen. • Kanten sind obligatorisch attributiert; das Attribut entspricht der Rolle, die ein Subobjekt für ein Objekt hat (z.B. ist Objekt &4 ein Kunstfehler für Objekt &6, während es für Objekt &2 eine Therapie darstellt). • Namen sind Einsprungpunkte für Abfragen. Im Beispielsgraphen gibt es nur einen Namen: "Krankheiten" ist ein Name für Objekt &1. Alle Objekte, die im Graphen nicht über ein benanntes Objekt erreicht werden können, sind für Abfragen nicht zugänglich und deshalb als "bedeutungslos" zu löschen. In OEM lassen sich nicht nur baumartige, sondern auch zyklische Strukturen formulieren; daraus resultieren verschiedene Probleme bei der dynamischen Berechnung von Abfragen und Data-Guides. Für OEM existiert eine Abfragesprache (OQL), auf der Lorel wesentlich aufbaut. Tatsächlich wandelt der Präprozessor in Lorel formulierte Abfragen vor der weiteren Verarbeitung in eine OQL-artige Syntax um. Lore - ein DBMS für semistrukturierte Daten Seite 5 von 17 2.2 Das XML-Datenmodell von Lore Das XML-Datenmodell von Lore ist komplexer als das OEM. Im wesentlichen ist das Folge des Ziels, auch externe Daten im XML-Format mit Lore verarbeiten zu können. Erstens kann dieselbe Information als Attribut oder Subelement eines XML-Elements ausgedrückt werden. Zweitens sind XML-Dokumente zunächst einmal Text und werden als XML-Elemente in einer Ordnung aufgefaßt; ein DOM-Parser erzeugt aus dem Dokument einen Baum, dessen Informationseinheiten Elementnamen und Text sind. Um zyklische Strukturen auf XML abbilden zu können, muß zusätzlich ein validierendes Dokument vorhanden sein, das bestimmte Attributwerte (Text) als Verweise kennzeichnet (Typ IDREF, IDREFS). Das gleiche gilt für Texte, die Werte vom Typ string, integer usw. repräsentieren sollen; eine derartige Semantik läßt sich durch ein dem XML-Dokument zugeordnetes XML-Schema beschreiben. Lore betrachtet die XML-Daten in zwei unterschiedlichen Modi: im semantischen Modus werden Referenzen aufgelöst und die referenzierten Objekte zu Subelementen; im literalen Modus werden Referenzinformationen wie andere Attribute betrachtet und der Graph des Dokuments ist ein Baum. <Krankheiten> <Krankheit Name=„Mandelentzündung“> <Therapie ID=„t1“> <Präparat>Penicillin</Präparat> <Tage>10<Tage> </Therapie> </Krankheit> <Krankheit Kunstfehler=„t1“> <Name>Grippe</Name> <Symptom>Schnupfen</Symptom> </Krankheit> </Krankheiten> Das XML-Datenmodell läßt sich formell so beschreiben: • ein XML-Element ist ein Paar (eid, value), wobei eid ein eindeutiger Elementidentifikator ist, • value ist entweder ein atomarer String oder ein komplexer Wert, der aus vier Komponenten besteht: 1. einem tag vom Typ string 2. einer geordneten Liste von Attributpaaren (Attributname, Attributwert) Lore - ein DBMS für semistrukturierte Daten Seite 6 von 17 3. einer geordneten Liste von referenzierten Subelementen der Form (label, eid), wobei label ein String ist 4. einer geordneten Liste normaler Subelemente der Form (label, eid), wobei label ein String ist. Ein XML-Dokument wird folgendermaßen auf das XML-Datenmodell abgebildet: • tags und Attributpaare werden direkt aufeinander abgebildet • im semantischen Modus werden Attributwerte vom Typ IDREF oder IDREFS auf referenzierte Subelemente (label, eid) abgebildet, wobei der Attributname auf label und der eid des referenzierten Objektes auf eid abgebildet wird • Subelemente des Dokumentes werden direkt auf normale Subelemente (label, eid) des Datenmodells abgebildet: label ist das tag des Subelements oder bei atomaren Elementen der Wert "Text" In unserem Beispiel hat Objekt &2 den Namen "Mandelentzündung" und Objekt &6 den Namen "Grippe". Dies kann über Attribute oder Subelemente ausgedrückt werden. Bei der Formulierung von Abfragen kann wahlweise über einen "path expression qualifier" unterschieden werden, ob die Abfrage sich nur auf Subelemente, nur auf Attribute oder auf beides bezieht: Bezug nur Subelemente nur Attribute beides Symbol > @ Beispiel Krankheiten.Krankheit.>Name Krankheiten.Krankheit.@Name Krankheiten.Krankheit.Name Ergebnis &7 "Mandelentzündung" {&7, "Mandelentzündung"} Lore - ein DBMS für semistrukturierte Daten Seite 7 von 17 3 Systemarchitektur 3.1 Überblick Lore ist in drei Schichten aufgebaut: verschiedene Benutzerinterfaces greifen über eine schlanke API auf den Abfrageprozessor zu. Dieser verarbeitet Abfragen sequentiell in mehreren Schritten und greift auf die darunterliegende Datenverarbeitungsschicht zu, die Operatoren zur Navigation/Verarbeitung von Abfragen und einige Dienstprogramme, wie den Data-Guide oder den externen Datenmanager anbietet. Eine vom Benutzer über das API in Lore eingespeiste Abfrage wird zunächst vom Parser geparst; der Parserbaum wird im Präprozessor in eine OQL-ähnlichen Abfragebaum transformiert. Anschließend wird ein Abfrageplan berechnet und ggf. vor Ausführung noch im Query Optimizer optimiert (z.B. durch peripherwärts-Verschiebung von Selektionen). Der entgültige Abfrageplan (Query-Plan) wird dann durch Aufruf von Operatoren auf der Datenverarbeitungsschicht ausgeführt. Lore verarbeitet Abfragen auf zwei verschiedene Arten: Top-Down mit Iteratoren und Objektzuweisungen zu Objektslots und Bottom-Up mit Indizes. Auf beide Modi wird im folgenden detailliert eingegangen. Wir betrachten dazu eine Abfrage zur unten dargestellten Datenbasis: select O from DBGroup.Member M, M.Office O where exists A in M.Age: A>30 Lore - ein DBMS für semistrukturierte Daten Seite 8 von 17 3.2 Top-Down-Ansatz der Abfrageverarbeitung Bei diesem Ansatz beginnt die Abfrageverarbeitung am Wurzelknoten des Abfragebaums. Jeder Knoten fordert von den Söhnen erschöpfend Objekttupel an und reicht jeweils ein Objekttupel an den Vaterknoten weiter. Jeder Knoten fungiert somit als Iterator. Die Menge der vom Wurzelknoten zurückgegebenen Tupel ist die Ergebnismenge der Abfrage. Die Objekte werden tupelweise in den "Slots" des Tupels in Form von Objekt-IDs gespeichert. Lore - ein DBMS für semistrukturierte Daten Seite 9 von 17 3.2.1 Abfrageoperatoren (Query operators) Exemplarisch soll hier die Funktionsweise der Operatoren von obigem Beispiel erklärt werden. Die Rückgabe erfolgt dabei über die Slots des globalen Objekttupels der Abfrage. • Scan(Startslot, "Pfadausdruck", Zielslot) iteriert über aller Objekte, die vom Objekt im Startslot über den angegebenen Pfad erreicht werden können und platziert diese im Zielslot • Join iteriert über alle Objekte beider Teilbäume • Select (Slot, Operator, Vergleichswert) iteriert nur über die Objekte, für die der Vergleich mit dem Vergleichswert "wahr" ist. • Project (Slotmenge) ist der Projektionsoperator • Aggr (Exists, Startslot, Zielslot) implementiert im Beispiel den Existenzquantor und iteriert nicht über alle Objekte, sondern gibt "wahr" im Zielslot zurück, falls ein Objekt vom peripheren Teilbaum zurückgegeben wurde, sonst "falsch". 3.3 Bottom-Up Ansatz der Abfrageverarbeitung Lore implementiert zwei Arten von Indices: Kantenindices (Lindex) und Wertindices (Vindex). 3.3.1 Lindex (Label Index) Über einen Lindex lassen sich zu einem Objektidentifikator die inzidenten Kanten finden oder mit einem Objektidentifikator und einem Label alle inzidenten Kanten mit einem dem Label entsprechenden Attribut. Er unterstützt die Suche nach allen Eltern eines Knoten oder nach denjenigen Eltern, die über eine bestimmte Rolle mit einem Objekt verknüpft sind. Lindexes sind über lineares Hashing implementiert. 3.3.2 Vindex (Value Index) Über einen Vindex lassen sich Punktanfragen und Bereichsanfragen von Daten der Typen string, real und integer beschleunigen. Ein Vindex findet zu einem Label, einem Operator und einem Vergleichswert alle atomaren Objekte, die eine inzidente Kante besitzen, die mit dem Label attributiert sind und die Bedingung (Wert <Operator> Vergleichswert) erfüllen. Vindexes sind als B+ Bäume implementiert. Falls die Vergleichswerte unterschiedliche Datentypen haben (integer, real oder string), so findet eine automatische Typumwandlung (object coercion) statt, nämlich von integer zu real und von string zu real. Entsprechend gibt es einen String-Vindex (mit stringbasierten Werten wie URL, string usw.), einen Real-Vindex (mit Daten vom Typ integer und real) und einen String-zu-Real-Vindex (mit allen Strings, die sich in integer- oder real-Werte umwandeln lassen). Wird dann beispielsweise nach allen atomaren Werten mit Label "Age" gesucht, deren Wert größer als der String "30" ist, so kann mit Stringvergleich im String-Vindex gesucht werden ("uralt">"30") und - da "30" sich in den real-Wert 30 umwandeln läßt, auch im String-zuReal-Vindex (z.B. 45>30). Sucht man nach allen atomaren Werten mit Label "Age", deren Wert größer als 30 ist, so kann mit Wertevergleich im Real-Vindex und im String-zu-Real-Vindex gesucht werden. Lore - ein DBMS für semistrukturierte Daten Seite 10 von 17 3.3.3 Abfrageplan mit Indexierung Wir betrachten erneut die Abfrage: select O from DBGroup.Member M, M.Office O where exists A in M.Age: A>30 Der Vindex-Operator findet alle Age-Objekte mit einem Wert kleiner als 30, der linke Lindex-Operator alle mit einer "Age"-Kante verbundenen Väter. Jeder Vater wird nur einmal berücksichtigt, auch wenn er mehrere "Age"-Subobjekte hat (der Operator "Once" fungiert hier als Existenzquantor). Der rechte Lindex-Operator findet alle Väter des Objekts im Slot OA1, die über eine "Member"-Kante mit diesem verbunden sind; davon werden diejenigen berücksichtigt, die einen Namen "DBGroup" haben (Operator Named_Obj). Join und Scan arbeiten analog dem Top-Down-Ansatz. Lore - ein DBMS für semistrukturierte Daten Seite 11 von 17 4 DataGuides Im Gegensatz zu relationalen und objektorientierten Datenbanksystemen, die ihre Daten an ein explizit spezifiziertes Schema binden, bezieht sich Lore auf semistrukturierte Daten, die zu irregulär oder zu veränderlich sind, um gut auf ein festes Schema abgebildet zu werden. Bei Lore sollen deshalb dynamische DataGuides einige der Funktionen der Schemata traditioneller Datenbanksysteme übernehmen: Unterstützung des Benutzers bei der Formulierung von Abfragen und Beschleunigung des Zugriffs auf Daten. 4.1 Definition und Eigenschaften von DataGuides Ein DataGuide soll eine kurze, präzise und „praktische“ Zusammenfassung der semistrukturierten Daten sein: 1. Jeder (auch mehrfach) in der Datenbasis s vorkommende „Kantenpfad“ (label path) soll genau einmal im zugehörigen DataGuide d vorkommen. 2. In d sollen nur Kantenpfade vorkommen, die auch in s vorkommen. 3. DataGuides sollen selbst mit dem Datenmodell der Datenbasis modelliert werden Hierbei ist ein Kantenpfad ein Pfad, der nur die Attribute der Kanten berücksichtigt, währen die Identität der Knoten unberücksichtigt bleibt. Zwei Kantenpfade sind gleich, wenn sie dieselbe Attributfolge ihrer Kanten aufweisen. Die Konstruktion eines DataGuides bezüglich einer Datenbasis entspricht der Konstruktion eines deterministischen endlichen Automaten (DEA) zu einem nichtdeterministischen endlichen Automaten (NEA). Dieser Konstruktionsvorgang ist hinsichtlich seiner zeitlichen Komplexität (und Speicherkomplexität) gut untersucht: ist der NEA ein Baum, so läßt sich der zugehörige DEA in linearer Zeit konstruieren; ist der NEA ein zyklischer Graph, so kann die Konstruktion des DEA im worst-case auch exponentielle Zeit (und Speicherplatz) erfordern. Aus der Automatentheorie ist außerdem bekannt, daß zu jedem NEA viele unterschiedliche DEAs konstruiert werden können; wegen der Äquivalenz gilt das auch für DataGuides nach obiger Definition: b und c sind verschiedene DataGuides zu a. Lore - ein DBMS für semistrukturierte Daten Seite 12 von 17 Aus einem NEA mit einer Knotenmenge V kann man einfach einen DEA mit der Knotenmenge 2V konstruieren (also der Menge aller Mengen über V, der Potenzmenge von V), indem man eine Tiefensuche von einem Wurzelknoten von V aus durchführt und jeweils die über gleiche Kantenpfade erreichbaren Knotenmengen zu Knoten des DEA macht. Die Menge der Objekte aus s, die über mehrere gleiche Kantenpfade von s erreicht werden, entspricht dann genau der Objektmenge eines Knotens von d, die über den gleichen Kantenpfad in d erreicht wird. Diese Objektmengen, die Knoten von d zugeordnet sind, werden "target sets" genannt. Ein DataGuide, der diese Eigenschaft hat, wird strenger DataGuide (strong DataGuide) genannt und kann über den gerade beschriebenen Algorithmus konstruiert werden. Experimentelle Untersuchungen haben gezeigt, daß die Konstruktion eines DataGuide für viele Datenbasen in akzeptabler Zeit möglich war; außerdem wurden inkrementelle Verfahren angegeben, mit denen sich der Aufwand für die Konstruktion (Einfügen oder Löschen von Elementen) auf einzelne Schritte verteilen läßt. Allerdings war die Laufzeit für die „Internet Movie database“ (www.imdb.com) mit 60.000 Knoten und 95.000 Kanten so lang, daß der Test abgebrochen werden mußte. Als Lösung wurden „approximate DataGuides“ mit kürzerer Konstruktionszeit untersucht oder die Beschränkung der Tiefensuche auf eine bestimmte Tiefe vorgeschlagen. 4.2 Unterstützung des Benutzers durch DataGuides Ein erklärtes Ziel der DataGuides war es, den Benutzer bei der Formulierung von Abfragen zu unterstützen. Einerseits erkennt der Benutzer durch den DataGuide die strukturelle Eigenschaften der Daten (z.B. existente Pfade in der Datenbasis), andererseits wird die Formulierung von Abfragen - ähnlich Query by Example - graphisch unterstützt. Lore - ein DBMS für semistrukturierte Daten Seite 13 von 17 4.2.1 Unterstützung bei der Erfassung von Struktureigenschaften Obige Abbildung zeigt eine Java-Schnittstelle, die einen DataGuide in Form eines Baumes präsentiert (strenge DataGuides sind stets Bäume): Ausgehend von der Wurzel DBGroup kann der Benutzer Teilbäume (markiert durch Dreiecke) expandieren, bis er Blätter des Baumes erreicht (markiert durch Karos). Dieser Teil der Schnittstelle repräsentiert also die Pfadstruktur des Baumes, aber nicht die Inhalte der Knoten (also der "target sets"). Diese werden exemplarisch angezeigt, wenn der Benutzer ein Karo anklickt. Lore zeigt dann in einem Pfadinformationsfenster den Pfad, die Größe des target sets (im Beispiel 33 über diesen Pfad erreichbare Objekte) und eine willkürlich gewählte Teilmenge der Objekte im target set (diese werden von Lore bereits bei der Berechnung des DataGuides als "Annotationen" mit dem DataGuide gespeichert und nicht durch erneutes Durchsuchen der Datenbasis berechnet). Außerdem kann man das komplette target set anzeigen und auch noch durch Bedingungen einschränken. Lore - ein DBMS für semistrukturierte Daten Seite 14 von 17 4.2.2 Unterstützung bei der Formulierung von Abfragen Abfragen können textuell in Lorel formuliert werden (der DataGuide stellt dazu die in der Datenbasis existierenden Pfade dar) oder eine Teilmenge der mit Lorel möglichen Abfragen kann direkt im "Query by Example"-Stil durch Angabe von Bedingungen der where-Klausel an den Blättern des DataGuides erzeugt werden. 4.3 Unterstützung des Systems durch DataGuides bei der Auswertung von Abfragen Strenge DataGuides können von Lore als Pfadindex verwendet werden. Beispiel: Select DB_Group.Group_Member.Original_Home findet alle Herkunftsorte der Group_Member der DB_Group. Lore - ein DBMS für semistrukturierte Daten Seite 15 von 17 Mit DataGuide muß einfach das bereits berechnete target set des label path DB_Group.Group_Member.Original_Home ausgegeben werden (dafür sind lediglich 3 sequentielle Zugriffe nötig). Ohne DataGuide müssen alle Group_Member daraufhin überprüft werden, ob sie ein Subelement in der Rolle eines Original_Home haben. Select DB_Group.Group_Member.Publication.Year Where DB_Group.Group_Member.Publication.Year < 1990 Angenommen, das target set des Pfades DB_Group.Group_Member.Publication enthält 20.000 Objekte, von denen 5000 je ein Subobjekt in der Year-Rolle besitzen, von denen wiederum 1.000 der Bedingung genügen. Weiterhin gebe es noch 5.000 andere Objekte in einer Year-Rolle, deren Väter aber keine Publication sind, von denen 2.000 der Bedingung genügen. Die Zahl der Group_Member sei 1.000. Mit DataGuide wird der Durchschnitt des target sets von DB_Group.Group_Member.Publication.Year Y mit dem Vindex V (Year, <, 1975) gebildet. Y enthält 5.000 Elemente, V 3.000 Elemente. Der Durchschnitt kann durch Iteration über die 3.000 Elemente von V berechnet werden (zu jedem Objekt der Datenbasis kann über einen "objectHash" in O(1) Zeit die Menge der target sets berechnet werden, die das Objekt enthalten). Ohne DataGuide muß über alle 1.000 Group-Member mit 20.000 Publikationen iteriert werden und geprüft werden, ob diese ein Subobjekt in der Year-Rolle haben, das die Bedingung erfüllt (im Beispiel wird also über 26.000 Objekte iteriert). Lore - ein DBMS für semistrukturierte Daten Seite 16 von 17 5 Zusammenfassende Bewertung von Lore Lore wurde zur Verarbeitung semistrukturierter Daten entwickelt. Die Einbindung vorhandener, nicht speziell für Lore erzeugter externer Daten im XML-Format gelang. DataGuides unterstützen den Benutzer in verschiedener Weise optimal zur Formulierung von Abfragen. Die Berechnung von DataGuides erfordert jedoch im worst case exponentielle Zeit; bei einer großen bekannten Datenbasis terminierte die Berechnung auch nach Minuten nicht. Mehrere Lösungsansätze wurden dazu experimentell untersucht (inkrementelle Verfahren, approximate DataGuides); diese weisen aber andere Nachteile auf. Durch die Verwendung von Indices konnte auch bei semistrukturierten Daten die Verarbeitung von Abfragen in günstigen Fällen deutlich beschleunigt werden. Das Lore-Projekt wurde „erfolgreich abgeschlossen“; ich schließe mich dieser Bewertung an. Lore - ein DBMS für semistrukturierte Daten Seite 17 von 17 6 Literatur 1. McHugh J, Abiteboul S, Goldman R, Quass D, Widom J (1997): Lore: A Database management System for Semistructured Data. http://www-db.stanford.edu/lore 2. Goldman R, McHugh J, Widom J (1999): From Semistructured Data to XML: Migrating the Lore Data Model and Query Language. http://www-db.stanford.edu/lore 3. Goldman R, Widom J (1997): DataGuides: Enabling query formulation and optimization in semistrucutred databases. http://www-db.stanford.edu/lore 4. Goldman R, Widom J (1999): Approximate DataGuides. http://wwwdb.stanford.edu/lore Seminar: XML und Datenbanken Thema: XQL, XPath Referentin: Annette Gutjahr Semester: Sommersemester 2002 FernUniversität Hagen Annette Gutjahr Lehrgebiet Praktische Informatik IV Prof. Dr. Ralf Hartmut Güting, Dipl.-Inf. Dirk Ansorge Matr. Nr. 4365666 Sonnenbergstr. 32/1 75395 Ostelsheim E-Mail annette.gutjahr@web.de Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath 1 Einführung...................................................................................................................... 3 1.1 Szenarien für XML-Anfragen ........................................................................................ 3 1.2 Allgemeine Anforderungen an eine XML-Anfragesprache........................................... 4 1.3 Datenbankanfragen als Messlatte................................................................................... 4 1.4 Ein XML-Dokument (Beispiel) ..................................................................................... 5 1.5 Worin bestehen die Unterschiede zwischen relationalen Datenbanken und XMLDokumenten? ............................................................................................................................. 6 2 2.1 2.2 2.3 2.3.1 2.3.2 2.3.3 2.4 XQL (W3C Proposal, September 1998) ........................................................................ 7 Einführung und Motivation............................................................................................ 7 Beispiel........................................................................................................................... 7 Syntax und Semantik...................................................................................................... 8 Terminologie .............................................................................................................. 8 XML Patterns (Kernfunktionalität)............................................................................ 8 XQL-Erweiterungen................................................................................................... 9 Diskussion .................................................................................................................... 10 3 3.1 3.2 3.3 3.4 3.4.1 3.5 3.6 XPath Version 1.0 ........................................................................................................ 11 Einführung und Motivation.......................................................................................... 11 Das Datenmodell von XPath ........................................................................................ 12 Beispiel......................................................................................................................... 12 Syntax und Semantik.................................................................................................... 13 Ausdrücke................................................................................................................. 13 Diskussion .................................................................................................................... 14 Weiterentwicklung von XPath: .................................................................................... 15 4 Quellen, weitere Informationsmöglichkeiten ............................................................... 15 Seite 2 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath 1 Einführung „XML is a powerful, elegant technique for thinking about, exchanging, and presenting data in a platform-independent manner.“ – XML auf einen Satz gebracht. [3, S. 15] Bei XML-Dokumenten geht es also in erster Linie um das Arbeiten mit Daten. Sehr bald erkannte man, dass es dabei nützlich ist, über eine Anfragesprache zu verfügen, so dass man gezielt auf Teile von XML-Dokumenten zugreifen und deren Inhalt weiterverarbeiten kann. Man übergibt also einem Parser die gewünschten Kriterien und erhält als Ergebnis eine Menge von Dokumentteilen, die diesen Kriterien genügen. Damit werden große XML-Dokumente quasi zu einer Datenbank. Außerdem sind solche Anfragen wichtig für Transformation von XML-Dokumenten in andere XML-Dokumente oder in andere Datenbanken oder in beliebige andere, eigene Anwendungen. 1.1 Szenarien für XML-Anfragen Der Bedarf an Anfragesprachen für XML-Dokumente wurde auch von dem Standardisierungsgremium World Wide Web Consortium (W3C) bald erkannt. Inzwischen wurde dort eine eigene XML Query Working Group eingerichtet, die verschiedene Szenarien für XML-Anfragen entwickelt hat [4]. XML-Anfragesprachen müssen sich nun daran messen lassen. Es geht hierbei je nach Ausgangsstruktur, auf der gearbeitet werden soll, um • Anfragen an dokument- oder datenbasierte XML-Anwendungen. Dokumentbasierte Anwendungen entsprechen der typischen Arbeit eines Editors: ein strukturiertes Dokument mit Text und Bildern, Fonts und Formatierungen. Datenorientierte Anwendungen sind üblich z.B. bei E-Commerce, wobei XML nur das Mittel für den Informationsaustausch zwischen verschiedenen Systemen ist. Die Informationen sind dabei i.d.R. nicht formatiert und auch nicht für menschliche Leser bestimmt. Anwendungsbeispiele: o von Menschen zu lesende Dokumente (z.B. Handbücher) aus denen einzelne Dokumente gesucht werden sollen, ein Inhaltsverzeichnis generiert werden soll, nach Informationen aus der Dokumentstruktur gesucht werden soll oder anhand derer neue Dokumente generiert werden sollen. o datenbasierte Dokumente (z.B. aus XML-Repräsentationen von Daten aus Datenbanken oder anderen Datenquellen) aus denen Daten herausgefiltert werden, oder in andere XML-Repräsentationen gewandelt werden oder Daten aus verschiedenen Datenquellen sollen in ein neues Dokument integriert werden. o „Mixed-model documents“: hier handelt es sich sowohl um dokument-orientierte als auch um datenorientierte Anfragen für Dokumente mit von anderen Quellen eingebundenen Daten, wie z.B. Kataloge, Patienten- und Personalakten etc. o Verwaltungsdaten: Anfragen in Konfigurationsdateien, Benutzerprofile oder Logprotokolle, die in XML geführt werden. • Anfragen auf XML-Datenströme (Streams), um Daten analog zu UNIX-Filtern für Streams zu verarbeiten. Es geht dabei darum, Daten aus XML-Strömen zu filtern und weiterzuleiten oder Daten auf XML-Ströme zu schreiben, z.B. für Log-Aufzeichnungen von E-Mail-Messages oder Netzwerk-Paketen, Aktienmarktdaten, Meldungen von Nachrichtentickern, EDI, Wetterdaten. • Anfragen auf DOM-Strukturen (DOM = Document Object Model), um Knotenmengen zu erhalten, die bestimmten Kriterien genügen. • Anfragen auf Dokument-Sammlungen, die von native XML Repositories oder Web Servern gemanagt werden. Seite 3 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath • Anfragen in Kataloge, die Dokumentserver, Dokumenttypen, XML-Schemas oder Dokumente beschreiben. Solche Kataloge sollten für die Suche auf mehreren Servern kombiniert werden können. Für ein Dokumenten-Retrieval-System sollte der Benutzer z.B. die Möglichkeit haben, Server-Kataloge (in XML) entsprechend der von den Servern gelieferten Informationen, nach Zugriffskosten oder nach Zugriffsberechtigung auszuwählen. Anschließend könnte das Retrieval-System die Art der Dokumente auf dem jeweiligen Server Anfragen und dem Benutzer ermöglichen, in diesen Dokumenten zu suchen. Je nach Einsatzgebiet der Anfragesprache kann man verschiedene syntaktische Umgebungen unterscheiden: z.B. eingebettet in eine URL, eine XML-Seite, oder eine JSP (Java Server Pages) oder ASP-Seite (Active Server Pages); als String in einem Programm, das in einer allgemeinen Programmiersprache geschrieben wurde; als Argument auf der Befehlszeile oder auf Standard-Input; oder unterstützt von einem Protokoll. 1.2 Allgemeine Anforderungen an eine XML-Anfragesprache In der Diskussion innerhalb der W3C-Arbeitsgruppen war von Anfang an klar, dass die zu definierende Anfragesprache baldmöglichst produktiv einsetzbar sein sollte, unklar war, inwieweit man auf vorhandenen Strukturen (d.h. auf XSL) aufbauen sollte. Auch musste erst einmal definiert werden, welche Funktionen von einer Anfragesprache abgedeckt werden sollten. Dabei kam anfangs (d.h. während des Workshops QL1 `98) die Frage auf, ob eine Anfragesprache allen Anforderungen genügen könne, oder ob man mehrere Anfragesprachen bräuchte. Inzwischen ergeben sich aufgrund der obigen Szenarien die folgenden Anforderungen an eine XML-Anfragesprache: • Sie sollte der Forderung von XML nach Einfachheit entsprechen, so daß sie schnell gelehrt bzw. erlernt werden kann, für den Programmierer lesbar ist und in verschiedenen Umgebungen eingesetzt werden kann. • Sie sollte ausreichend mächtig sein und Vorteile z.B. von (nicht notwendigerweise vorhandenen) Schemas ausnutzen • Sie sollte XML als Input erhalten und XML als Output liefern (die Frage des OutputFormats blieb anfangs in der Diskussion offen). • Sie sollte skalierbar sein, so dass mit einem oder mit mehreren XML-Dokumenten parallel gearbeitet werden kann. 1.3 Datenbankanfragen als Messlatte XML-Dokumente haben hinsichtlich des Speicherns von Daten vieles mit Datenbanken gemeinsam. Deshalb ist für die Anforderungen an die Funktionalität einer XML-Anfragesprache ein Vergleich mit den Möglichkeiten von Datenbank-Anfragesprachen hilfreich. Ein bekanntes Beispiel für alle, die irgendwann mit relationalen Datenbanken gearbeitet haben: SQL (Structured Query Language). Relationale Datenbank: kurse-Tabelle kursnummer kurstitel termin teilnehmerzahl 99 XML und Datenbanken SS2002 11 referate-Tabelle teilnehmerID kursnummer referatthema 9999999 99 Überblick XML 1 QL ´98 war der Workshop für Query Languages, der 1998 vom W3C organisiert wurde Seite 4 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath ... 4365666 99 XQL, XPath ... SQL bietet verschiedene Möglichkeiten, die Informationen aus den Tabellen zu filtern und zu sortieren: • Filtern der Informationen aus einer Datenbank nach bestimmten Kriterien: o zeilenweise SELECT * FROM kurse WHERE kurstitel = "XML und Datenbanken" o Spaltenweise SELECT kurstitel, termin FROM kurse • Zusammenfassen von Informationen: Mehrere Einzelinformationen aus mehreren Datensätzen zu einer neuen Information aggregieren, z.B. Durchschnittsbildung SELECT AVG(teilnehmerzahl) FROM kurse • Sortieren von Informationen SELECT kurse ORDER BY teilnehmerzahl • Verschmelzen von Tabellen o Inner Join, Equijoin Oft benötigt man Informationen aus mehr als einer Tabelle, um ein sinnvolles Ergebnis zu liefern SELECT kurse.kurstitel, referate.referatthema FROM kurse INNER JOIN kategorie ON kurse.kursnummer = referate.kursnummer WHERE referate.kursnummer= “99” o Verschmelzen von Tabellen (Outer Join) Benötigt man Informationen von mehreren Quellen, so möchte man oft die Informationen einer Tabelle ausgeben, selbst wenn die entsprechende Information in keiner anderen Tabelle vorliegt, z.B. um alle Kurse mit den dazugehörigen Referaten auszugeben. Das Ergebnis soll aber auch die Kurse mit ausgeben, für die keine Referate gehalten werden. • Manipulation des Inhalts: Der Inhalt einer Datenbank kann in SQL selbst verändert werden, durch Einfügen, Verändern oder Löschen von Datensätzen. Für diese Anforderungen gibt es aber andere Möglichkeiten in XML, z.B. DOM, sie müssen nicht von einer Anfragesprache abgedeckt werden. • Informationen aus mehr als einer Quelle: Manchmal benötigt man Informationen, die aus mehreren Datenbanken zusammengefasst werden, z.B. eine Kursübersicht der Kurse des Informatikfachbereichs und des Mathematik-Fachbereichs. • Prozedurales Arbeiten: Die Möglichkeit, vordefinierte Prozeduren/Makros für bestimmte Arbeitsschritte zu verwenden. Aber XML-Dokumente besitzen im Vergleich zu relationalen Datenbanken einige Besonderheiten. Wo liegen nun die Unterschiede zwischen Datenbanken und XML-Dokumenten? Dazu betrachten wir folgendes Beispiel: 1.4 Ein XML-Dokument (Beispiel) Als aktuelles Beispiel für ein XML-Dokument nehmen wir eine Liste zur Beschreibung dieses Kurses: <?xml version='1.0'?> <!-—Diese Datei charakterisiert das Seminar: XML und Datenbanken --> <kurs typ='seminar'> <titel>XML und Datenbanken</titel> Seite 5 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath <lehrgebiet>Praktische Informatik IV</lehrgebiet> <betreuer> <grad>Prof. Dr.</grad> <vorname>Hartmut</vorname> <nachname>Güting</nachname> </betreuer> <betreuer> <grad>Dipl.Inf.</grad> <vorname>Dirk</vorname> <nachname>Ansorge</nachname> </betreuer> <literatur>Kurstext</literatur> <termin>SS2002</termin> <block thema='Überblick'> <referat> <referatthema>Überblick XML</referatthema> <literatur>http://www.w3.org/TR/REC-xml</literatur> <literatur>http://www.w3.org/TR/xsl</literatur> <referent> <vorname>Edmund</vorname> <nachname>Buchbinder</nachname> </referent> <Beurteilung>sehr gut</Beurteilung> </referat> </block> <block thema='Semistrukturierte Systeme'> <referat> <referatthema>Lorel</referatthema> <referent>nn</referent> </referat> <referat> <referatthema>Lore</referatthema> <referent>nn</referent> </referat> </block> <block thema='Anfragesprachen für XML'> <referat> <referatthema>XPath, XQL</referatthema> <referent>Annette Gutjahr</referent> </referat> ... </block> </kurs> 1.5 Worin bestehen die Unterschiede zwischen relationalen Datenbanken und XML-Dokumenten? Auf den ersten Blick kann man den Inhalt des oben aufgeführten XML-Dokumentes man genausogut direkt in einer Datenbank abspeichern. Aber es gibt einige, teilweise gravierende, Unterschiede zwischen XML-Dokumenten und Datenbanken. • SQL-Zeilen haben eindeutige Bezeichner (primary key) – eindeutige Bezeichner sind in XML möglich, aber nicht notwendig, da die Elemente in XML nach ihrer Reihenfolge sortiert sind • SQL-Zeilen implizieren keine Reihenfolge, z.B. eine chronologische Reihenfolge der Referate während des Seminars. • SQL-Strukturen liefern keine hierarchische Kapselung, z.B. gibt es keine Möglichkeit, die Referatthemen innerhalb der kurse-Tabelle beim Datensatz für den jeweiligen Kurs zu kapseln. Man benötigt eine eigene Tabelle mit Verweisen, die zurück auf den Seite 6 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath zugehörigen Kurs der anderen Tabelle verweisen. So erhält man 1 zu 1- und 1 zu nBeziehungen, die aber auf jedes beliebige Element der Datenbank verweisen können. • XML unterscheidet syntaktisch zwischen Attributen und nur-Text-Inhalten von Elementen. Semantisch sind jedoch beide identisch. Es sollte schlichtweg egal sein, ob man in obigem Beispiel den Kurstitel als Text-Element oder als Attribut schreibt. Eine XML-Anfrage sollte beide Möglichkeiten behandeln können. • XML erlaubt Elemente mit verschiedenen Inhalts-Modellen (mixed content model) – Elemente können sowohl Textinformation als auch Unter-Elemente enthalten, z.B. bei einem Buch erscheint beliebiger Text, in den einige Markup-Elemente eingestreut sind, z.B. für Hervorhebungen, Fußnoten, etc. Anfragesprachen für XML müssen mit diesen Besonderheiten umgehen können und die damit verbundenen Möglichkeiten möglichst vorteilhaft nutzen. 2 XQL (W3C Proposal, September 1998) 2.1 Einführung und Motivation Bereits 1998 begannen mehrere Arbeitsgruppen an Vorschlägen für XML-Anfragesprachen für das W3C zu arbeiten. 13 sog. Position Papers gingen für den QL´98 Workshop beim W3C ein. Einer der Vorschläge war die Sprache XML-QL (vgl. XML-QL-Referat). Hier richteten sich die Autoren nach den Anfragemöglichkeiten in hierarchischen und relationalen Datenbanken: Es wird eine Auswahl an Daten getroffen und die Ausgabeform dieser Daten festgelegt. XML-QL ist sehr flexibel, aber es hat einige Nachteile: Die Reihenfolge der Daten aus dem Ursprungsdokument geht verloren – ein Problem für XML-Text-Dokumente (z.B. ein Buch, bei dem die Reihenfolge der Paragraphen verloren geht). Außerdem geht die Strukturinformation des ursprünglichen Dokumentes verloren, es sei denn, man schreibt diese noch einmal komplett in die Anfrage hinein. Etwa gleichzeitig mit dem Vorschlag für XML-QL ging ein zweiter Vorschlag bei der XSL Working Group ein, der stärker strukturorientiert war: XQL (XML Query Language (XQL), September 1998). Die Struktur und die Reihenfolge des Originaldokuments bleibt so weit wie möglich erhalten, während der Inhalt gemäß der Anfrage reduziert wird. Dieser Vorschlag fand u.a. durch "Microsofts evangelistische Bemühungen" (nach [6]) große Aufmerksamkeit. 2.2 Beispiel Eine Anfrage, um eine Liste der Referatthemen zu erhalten, sieht in XQL so aus: //referatthema Die Anfrage liefert dann folgendes Ergebnis: <xql:result> <referatthema>Überblick XML</referatthema> <referatthema>Lorel</referatthema> … </xql:result> Hier wird die Reihenfolge des ursprünglichen Dokuments beibehalten. In diesem Beispiel ist noch ein <xql:result>-Container mit ausgegeben. Ein XQL-Prozessor kann auch einfach eine sortierte Liste der <referatthema>-Elemente zurückliefern. Auch hierarchische Informationen werden bei XQL erhalten. Wenn wir beispielsweise nur die Referate des Blocks mit dem Titel „Semistrukturierte Systeme“ erhalten möchten, brauchen wir die folgende Anfrage: block[@thema=“Semistrukturierte Systeme”]/referat. Als Ergebnis erhalten wir dann: <xql:result> <referat> Seite 7 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath <referatthema>Lorel</referatthema> <referent>nn</referent> </referat> <referat> <referatthema>Lore</referatthema> <referent>nn</referent> </referat> </xql:result> 2.3 Syntax und Semantik XQL ist als Erweiterung der XSL Pattern Syntax angelegt. Es baut auf die Möglichkeiten von XSL auf, Knotenklassen zu finden und erweitert die Syntax um Boolean-Logik, Filter, Indizierung von Knotenmengen u.a.. Dadurch ermöglicht XQL über XSL hinaus die Suche nach speziellen Elementen und nach Knoten mit bestimmten Eigenschaften. 2.3.1 Terminologie Die XQL Pattern Syntax ist deklarativ, nicht prozedural angelegt: Man beschreibt was, d.h. welche Art von Knoten, gesucht werden soll, nicht aber wie etwas gesucht wird. • Werte: Knoten (node), Boolean, Zahl (number), String, set of values (nicht geschachtelt) • Knoten: Dokument (document entity), Anweisung (pi), Kommentar, Element, Elementattribut, (markup-begrenzter) Textbereich; • Ergebnis: Die Menge, die von einem XQL-Ausdruck als Ergebnis geliefert wird, behält die Dokumentreihenfolge, die Hierarchie und die Identität – soweit diese definiert sind – bei: Elemente werden also in der richtigen Reihenfolge ohne Wiederholungen geliefert; Attribute werden unsortiert, aber ohne Wiederholungen geliefert. Das Binärformat für das Ergebnis einer Anfrage ist nicht spezifiziert, d.h. eine Anfrage könnte einen Knoten, eine Knotenliste, ein XML-Dokument, einen Array oder eine andere Struktur zurückliefern. 2.3.2 XML Patterns (Kernfunktionalität) Die Syntax zur Navigation durch die Elemente eines XML-Baumes ähnelt der Notation für das Navigieren in Dateiverzeichnissen. • Collections: Mehrere Elemente eines bestimmten Namens werden durch den Namen zusammengefasst: kurs • Kinder und Nachfolger "/" (child operator) und "//"(rekursiver Abstieg): links: Menge, aus der die Elemente ausgewählt werden sollen; rechts: eine Menge, die bestimmt, welche Elemente auszuwählen sind kurs/betreuer, kurs//referatthema, kurs/literatur, kurs//literatur, kurs//referat/literatur • auf die Kind-Elemente des aktuellen Kontexts kann durch "*" verwiesen werden, ohne einen Namen zu nennen kurs/*, kurs/*/nachname, */*, *[@typ] • • Such-Kontext: XQL erlaubt die Auswahl des Wurzel-Kontexts ("/")oder des aktuellen Kontexts (Default oder explizit "./"). "./"-Prefix nur nötig für ".//", d.h. für den rekursiven Abstieg relativ zum aktuellen Kontext. ./betreuer (äquivalent zu betreuer), /kurs, //nachname Attribute Attribute ("@" vorangestellt) und Subelemente werden gleichbehandelt (Attribute können keine Subelemente enthalten, deshalb keine Pfad-Operatoren auf Attribute anwenden) @typ, block/@thema Seite 8 Annette Gutjahr • Seminar: XML und Datenbanken: XQL, XPath Filter Einschränkungen und Verzweigungen können auf alle Collections angewandt werden: "[subquery]". Alle Elemente werden auf die subquery geprüft und falls sie zu FALSE ausgewertet werden, werden sie nicht in die Ergebnismenge aufgenommen. Wird eine Collection in den Filter gestellt, wird FALSE generiert, wenn diese leer ist, sonst TRUE. Leere Filter sind nicht erlaubt. Aber es können beliebig viele Filter auf jeder beliebigen Ausdrucksstufe aneinandergereiht werden. kurs/betreuer[grad], kurs[@typ='seminar'], kurs[termin='SS2002']/title, kurs[betreuer][literatur] • • Gruppieren: durch Klammerung (für Klarheit, bzw. wo nötig) Boolean Expressions: Syntax: lvalue $op$ rvalue für Subqueries: z.B. um alle Knoten eines Wertes oder Wertebereiches zu finden. • Boolean AND und OR: $and$, $or$ kurs[betreuer $and$ termin], referat [(referent $or$ literatur) $and$ referatthema] • Boolean NOT: $not$ referat[referatthema $and$ $not$ referent] • Äquivalenz: "=" bzw. $eq$; "!=" bzw. $ne$ ' oder " als String-Begrenzung möglich betreuer[nachname = 'Güting'], betreuer[nachname $eq$ 'Güting], kurs[@typ != 'seminar'], kurs[@typ $ne$ 'seminar'] • Methoden: fortgeschrittene Manipulation von Mengen (Collections) Syntax {method}(arglist) – Bei Methodennamen wird Groß-Kleinschreibung unterschieden. Methoden beziehen sich auf den Referenz-Knoten. referent[text() = 'Bob'], referent[vorname!text() = 'Bob'] Bang-Operator: gleichbedeutend mit dem zweiwertigen Child-Operator (/), der einen Pfad festlegt. Einziger Unterschied: ! benötigt auf der rechten Seite einen XQL- Funktions- oder Methodenaufruf. o text() – Text in einem Element, konkateniert den Text aller Nachfolger des Elements, ohne Tag-Namen oder Attributwerte, Kommentare etc. o value() – Wert eines Elementes; falls keine Typinformation, liefert es das gleiche wie text() o nodeType() – Zahl, um den Knotentypen anzuzeigen: Element = 1; Attribut = 2; Text = 3; PI = 7; Kommentar = 8; Dokument = 9 o nodeName() – Tag-Name des Knotens, inkl. Namespace-Prefix (String) o index() – Index des Knotens innerhalb des Parents (beginnend bei 0): referent[index() $lt$ 3] o Shortcuts: value() gilt implizit, falls es nicht dasteht o Indizierung: betreuer[0], referent[vorname] [2] o end() – letztes Element einer Collection – relativ zum Parent referat[end()] 2.3.3 XQL-Erweiterungen Die obige Funktionalität beschreibt den Mindestsatz, der zwischen XQL-Clients benötigt wird. Die XQL-Erweiterungen beschreiben zusätzlich implementierbare Funktionalität. • Namespaces: waren zum Zeitpunkt der Definition von XQL selbst noch nicht genau definiert. Fest stand deshalb nur die Regelung, daß, falls kein Namespace für die Anfrage definiert ist, das Prefix verglichen wird. book, my:book, my:book[my:author], my:*, *:book • baseName(), namespace(), prefix() Menge von Attributen suchen: @*, @*:style, @my:* Seite 9 Annette Gutjahr • Seminar: XML und Datenbanken: XQL, XPath Vergleiche: case sensitive: $lt$, $le$, $gt$, $ge$, bzw. Shortcuts: <, <=, >, >= case insensitive: $ieq$, $ine$, $ilt$, $ile$, $igt$, $ige$ author[last-name = 'bob' $and$ price $gt$ 50], author[publications!count() $gt$ 10] • falls Datentyp-Information vorhanden ist, wird ggf. der linke auf den rechten Wert gecastet. Derzeit nur Datumsformat: books[pub_date < date('1995-01-01'] Vereinigung und Schnittmenge $union$ bzw. |, $intersect$ first-name $union$ last-name, bookstore/(book|magazine) • Any- und All-Semantik: $any$, $all$ vor dem Ausdruck: author[last-name = 'Bob'], author[$any$ last-name = 'Bob'], author[$all$ last-name != 'Bob'] • Collection-Methoden textNode(), comment(), pi(), element(['name']), attribute(['name']), node() p/textNode()[1], //comment()[1] • • • • Aggregationsmethoden count() – Anzahl der Knoten einer Menge nodeTypeString() – Art des Knotens als String ancestor(query): nächster Vorfahre der Anfrage; ancestor(book) Subscript-Operator [] für eine Bereich von Elementen author[0, 2 $to$ 4, -1] 2.4 Diskussion XQL hat anderen Vorschlägen gegenüber, die beim Workshop QL ´98 eingereicht wurden, einige Vorteile: • Durch die Kürze und seine Lesbarkeit kann XQL auch eingesetzt werden, wo XSL selbst unangebracht wäre, z.B. um Anfragen in Attributen oder als einfache Strings in Programmiersprachen unterzubringen. • Um das Ziel der Skalierbarkeit zu erreichen, und dennoch möglichst einfach zu bleiben, erweitert XQL lediglich die Muster von XSL, nicht die gesamte XSLSprache. • Der wichtigste Unterschied gegenüber anderen, eher datenbankorientierten Vorschlägen ist die Tatsache, daß XQL-Ergebnisse die Struktur und die Reihenfolge des Originaldokuments so weit wie möglich erhalten, während der Inhalt gemäß der Anfrage reduziert wird. Bei dem Vorschlag von XQL gibt es allerdings auch einige grundsätzliche Probleme, die bereits während des Workshops diskutiert wurden: • Dazu gehört die Frage, wie weit eine Anfragesprache überhaupt gehen solle, und ob XQL überhaupt eine komplette Anfragesprache sei, da man über die Pfadangaben von XQL die Elemente zwar findet, aber nicht sagen kann, was damit geschehen soll. Viele Funktionen, die eine Datenbankanfragsprache bietet, können deshalb von XQL nicht abgedeckt werden, wie z.B. die Manipulation des Inhalts. • Auch das Vorgehen, XSLs Musterbeschreibungssprache (XSL pattern language) als Grundlage zu nehmen, wurde gegensätzlich diskutiert, da seine Möglichkeiten der Selektion und der Mustersuche ungenügend seien. XSL wurde nur für den Zugriff und das Arbeiten mit jeweils einem Dokument geschaffen; man kann also keine Informationen aus mehreren Quelldokumenten kombinieren.. Außerdem gibt es einige konkrete Probleme: • XQL kann keine Informationen unterscheiden. Da XQL mit den Knoten arbeitet und nicht mit der eigentlichen Information, gibt es keine Möglichkeit, festzustellen, ob zwei Knoten den gleichen Inhalt haben. Es gibt also keine Möglichkeit, eine Liste aller Referenten von Seminaren zu erhalten, die Doppelnennungen ausschließt. DoppelSeite 10 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath nennungen treten immer dann auf, wenn Studenten in mehreren Seminaren Referate halten. • XQL kann keine Beziehungen umsortieren (pivot relationships) – eine Technik, die bei der Arbeit mit relationalen Datenbanken üblich ist: Wir haben beispielsweise eine Liste von Referaten mit deren Referenten. Aber wir möchten eine Liste mit Referenten und deren Referatsthemen. Da XQL die Hierarchie der Knoten beibehält, ist eine solche Anfrage mit XQL, wie es ursprünglich gedacht war, unmöglich. • XQL ist kein Standard. Es ist lediglich ein Vorschlag, der beim W3C als Diskussionsgrundlage für einen Workshop (1998) eingereicht wurde. Aber er dient als Grundlage für Implementationen, die nicht bis zur Freigabe eines endgültigen Anfrage-Standards warten können/wollen. XQL wurde u.a. von der GMD (GMDIPSI), von Microsoft (Internet Explorer 5.0, von der Software AG (Tamino) in ihren Systemen implementiert. Während XQL einen intuitiven Umgang mit hierarchisch strukturierten Daten in einem XMLDokument ermöglicht, kann es die Daten nicht so flexibel wie z.B. XML-QL manipulieren. Eine ideale Anfragesprache sollte also beide Ansätze vereinen: die Flexiblität von XML-QL und den hierarchischen Einstieg von XQL. 3 XPath Version 1.0 3.1 Einführung und Motivation XPath ist der direkte Nachfolger des oben beschriebenen XQL-Vorschlags. XPath2 hat beim W3C den Status einer "Recommendation". Diese "Empfehlungen" (Recommendations) des W3C bilden inzwischen eine Art Quasi-Standard. XPath ist eine Nicht-XML-Sprache, die dazu dient, mittels einer Pfadnotation auf einzelne Knoten eines XML-Dokumentes zuzugreifen, während Reihenfolge und Struktur des Originaldokumentes erhalten bleiben. Man kann in XPath Ausdrücke schreiben, die auf den ersten titel eines kurses verweisen, oder auf das zweite Kind-Element des zweiten referenten usw.. XPath identifiziert die Knoten nach Position, relativer Position, Typ, Inhalt und einigen anderen Kriterien. XSLT wird dann eingesetzt, um die Ergebnisse dieser Anfragen zu bearbeiten und die Daten beliebig darzustellen: um neue Elemente einzufügen und Elemente neu zu sortieren (ähnlich den Möglichkeiten von XML-QL). XPath Ausdrücke können auch Zahlen, Strings oder Booleans repräsentieren. Dadurch können XSLT Stylesheets einfache Berechnungen für Nummerierungen, Tabellen und Gleichungen auführen. String-Manipulationen in XPath ermöglichen XSLT z.B. den Namen eines Buchkapitels in einer Überschrift in Grossbuchstaben und bei einem Verweis innerhalb des Textes in Kleinbuchstaben darzustellen. XPointer-Erweiterungen zu XPath ermöglichen nicht ganze Knoten, sondern bestimmte Stellen und Bereiche eines Dokumentes anzusprechen, Informationen durch String-Vergleiche zu lokalisieren und Adressen in URI-Referenzen als Bereichs-Bezeicher zu verwenden. Man versuchte, in XPath 1.0 die Syntax und Semantik zusammenzufassen, die für gemeinsame Funktionalität von XSL Transformations3 und XPointer4 benötigt wurde: Damit stellt die Kombination von XPath, XSLT und XPointer ein mächtiges Werkzeug dar, das den hierarchischen Einstieg in Dokumente wie XQL verwendet, aber auch flexible Möglichkeiten für die Manipulation der Daten bietet. Im weiteren konzentrieren wir uns nur auf XPath. 2 XML Path Language (XPath) Version 1.0, W3C Recommendation November 1999 XSL Transformations (XSLT) Version 1.0, W3C Recommendation November 1999 4 XPointer Language (XPointer) Version 1.0, W3C Candidate Recommendation September 2001 3 Seite 11 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath 3.2 Das Datenmodell von XPath Ein XML-Dokument ist für XPath im Gegensatz zu XQL nun explizit ein Baum mit Knoten, von denen einige wiederum andere Knoten enthalten können. Dabei wird die Metainformationen von XML ausgenutzt, um ein Dokument hierarchisch in verschiedene Knoten zu gliedern. Über alle Knoten eines Dokumentes ist eine Ordnung definiert (document order), die sich nach der Reihenfolge des Knotenanfänge (d.h. der zugehörigen name tags) innerhalb des Dokumentes richtet. Vor den Kindern eines Knotens werden Namespace-Knoten und danach Attributknoten einsortiert. Auch die Kinder eines Knotens sind wiederum sortiert. XPath navigiert nun mit einer Pfadnotation durch diese Baumstruktur und berechnet für die einzelnen Knotentypen ein String-Wert. Manche Knotentypen besitzen zusätzlich einen Namen. Da XPath die XML namespaces (bei der Formulierung des XQL-Proposals waren diese noch nicht definiert) unterstützt, bildet der Name eines Knotens ein Paar, bestehend aus einem lokalen Teil und einem - möglicherweise null-wertigem - namespace URI. Die Baumstruktur eines XML-Dokumentes kennt sieben verschiedene Knotentypen5 (vgl. Beispieldokument). • Dokument (document entity) bzw. Wurzelknoten (root node) Kinder des Wurzelknotens sind der Elementknoten für das Dokument, Instruktionen, Kommentare zu den Instruktionen und Kommentare im Prolog und nach dem Ende des Dokumenttextes. • Instruktionen (processing instruction nodes) Für jede Anweisung gibt es einen Knoten (bis auf die Anweisungen, die in der DTD erscheinen). • Kommentare (comments): <!-- ... --> Für jeden Kommentar gibt es einen Knoten (außer den Kommentaren in der DTD). • Elemente (element nodes): kurs Die Kinder von Elementen sind Elementknoten, Kommentare, Instruktionen und Texte. Für Elemente gibt es die Möglichkeit eindeutiger Bezeichner. • Attribute (attribut nodes): typ mit Wert seminar Zu einem Element gehört eine Menge von Attributen. Default-Attribute werden wie direkt gesetzte Attribute behandelt. Das Element ist der Vater der zugehörigen Attribute, diese werden jedoch nicht als Kinder des Elements betrachtet. Elemente teilen sich auch keine Attributknoten, d.h. Attribute verschiedener Elemente sind immer verschiedene Attributknoten. Beim Test auf Gleichheit durch '=' wird auf Wertegleichheit, nicht auf Identität getestet. • Text (text nodes; markup-begrenzter Textbereich): XML und Datenbanken In einem Textknoten werden immer möglichst viele Zeichen zusammengefaßt. • Namensraum-Knoten (namespace nodes): Jedes Element hat dazugehörige Namespace Nodes - einen für jedes namespace-Prefix, das (u.U. implizit) gültig ist. Und wieder gilt: das Element ist der Parent für die Namespace Nodes, diese werden jedoch nicht als Kinder dieses Elementes geführt. 3.3 Beispiel XPath erhielt seinen Namen von der Pfadnotation, die es für die Navigation durch die Hierarchie eines XML-Dokumentes verwendet, und die einer URL-Notation entspricht. Die Syntax ist nicht XML-konform, so dass XPath u.a. auch in URIs und in XML-Attributen benutzt werden kann. 5 XPath kennt keine CDATA-Bereiche, Bezüge auf Entitäten (entity references) und DTDs, da XPath auf XMLDokumenten arbeitet, nachdem diese Informationen bereits in das Dokument integriert wurden. Seite 12 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath /, betreuer, child::betreuer, child::*, child::text(), child::node(), attribute::typ, attribute::*, descendant::para, ancestor::div, ancestor-or-self::div … 3.4 Syntax und Semantik Das wichtigste Konstrukt in XPath ist ein Ausdruck (expression). Dieser liefert ein Objekt vom Typ node-set, boolean, number (float) oder string. Die Auswertung eines Ausdrucks bezieht sich immer auf einen bestimmten Kontext6. XPath-Ausdrücke werden oft in XML-Attributen benützt. Die hier aufgeführte Grammatik bezieht sich auf den Attribut-Wert nach einer XML 1.0 Normalisierung, d.h. ein < in der Grammatik muß in der XML-Quelle quotiert werden, d.h. als < eingegeben werden. Anführungszeichen können als " oder als ' angegeben werden oder man verwendet " anstelle von ' bzw. umgekehrt. 3.4.1 Ausdrücke § Pfadangaben (location paths) Die wichtigste Art von Ausdrücken. Sie benützen mindestens einen Location Step zur Auswahl einer Knotenmenge aus dem Dokument. Es gibt absolute (beginnend mit '/') und relative Pfadangaben, bestehend aus den Location Steps Achse, Knotentest und Prädikaten. o Achse: definiert die im Baumgeflecht betrachtete Beziehung. Dabei unterscheidet man vorwärts- oder rückwärts-Achsen (forward/reverse axis) beginnend mit Zählposition 1: child | descendant | parent | ancestor | following-sibling | preceding-siblings | following | preceding | attribute | namespace | self | decendant-or-self | ancestor-orself child::titel, attribute::thema, /child::betreuer[position()=2], descendant-or-self::literatur o Knotentest (node test): wählt einen Knotentyp oder einen benannten Knoten oder eine Funktion aus. Für jede Achse gibt es einen Haupt-Knotentyp (attribute-Achse: Attribut; namespace-Achse: Namespace; andere Achsen: Element). child::text(), child::node(), attribute::*, child::comment(), child::processing-instruction(pi), o Prädikate, die beliebige Ausdrücke zum Verfeinern der Auswahl benutzen. Sie filtern eine Knotenmenge in bezug auf eine Achse und liefern eine neue Menge. //betreuer[grad = "Dipl.Inf."] XPath unterstützt neben = auch relationale Operatoren, wie <, >, <=, >= boolean Operatoren and und or, sowie einen Mindestrepertoire an und !=, Kernfunktionalität zur Arbeit mit Zahlen, Strings etc., die in Prädikaten verwendet werden können. Kommen XPath-Ausdrücke in XML-Dokumenten vor, müssen < und <=-Operatoren gem. XML 1.0-Regeln quotiert werden (z.B. durch < und <=). <xsl:if test="@value < 10">...</xsl:if> o Abkürzungen: block, text(), @thema, @*, block[1], block[last()], kurs//literatur, ../@thema, .., .//betreuer Ø child:: kann als Default-Achse weggelassen werden. betreuer/nachname = child::betreuer/child::nachname 6 Ein Kontext besteht aus einem Knoten (context node), zwei Integer-Werten > 0 (context position und context size), einer Menge von Variablenbindungen, einer Funktionsbibliothek (XSLT und XPointer erweitern die nachfolgend aufgeführte Funktionsbibliothek von XPath um eigene Funktionen) und einer Menge gültiger namespace declarations (Prefixes werden auf namespace URIs gemappt). Seite 13 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath Ø attribute:: wird abgekürzt zu @ kurs[@typ="seminar"] = child::kurs[attribute::typ="seminar"] Ø // ist die Abkürzung für /decendent-or-self::node()/ aber: //betreuer[1] != /descendant-or-self::betreuer[1] Ø . kurz für self::node() Ø .. kurz für parent::node() ../titel = parent::node()/child::titel Ø wildcards: * für Element-Knoten, node( ) für alle Knoten, @* für Attributknoten Ø | für Vereinigung von Knotenmengen //betreuer | //referent Pfadangaben sind nicht die einzige Art von XPath-Ausdrücken. XPath-Ausdrücke können auch Zahlen, Boolean-Werte und Strings als Ergebnis liefern. Gültige XPath-Ausdrücks sind z.B. auch 3.141529, 2+2, 'Rosalind Franklin', true( ), 32.5 < 76.2E-21, position()=last( ) § § § § Numbers: entspricht floating-point number (incl. NaN, +/- Unendlich, +/- 0) +: Addition; -: Subtraktion (Whitespace vor Minus, um vom Bindestrich bei Wörtern zu unterscheiden), *: Multiplikation, div: Division, mod: Rest (truncating division, wie % in Java) (5 mod 2=1, 5 mod -2 = 1, -5 mod 2 = -1, -5 mod -2 = -1) Strings: Sequenz von 0 oder mehr Zeichen (Achtung bei precomposed und decomposed Formen von Zeichen (z.B. bei Akzent) -> vorher normalisieren zu kanonischer Form) Booleans: and und or: nicht-strikte Auswertung. Priorität: or; and; =, !=; <=, <, >=, >; (links-assoziativ, d.h. 3>2>1 = (3>2)>1 Funktionsaufrufe: XPath-Funktionen liefern einen der folgenden Typen als Ergebnis zurück: Boolean, Zahl, Knotenmenge oder String. Über den Namen wird die Funktion aus der zum Kontext gehörenden Funktionsbibliothek ausgewählt und anschließend die einzelnen Argumente ausgewertet, nachdem sie, falls erforderlich, zum jeweiligen Typ konvertiert wurden. Beispiele sind round( 3.14), starts-with(nachname, 'T'), concat("a", "b", "c") o Knotenmengen-Funktionen: Diese Funktionen arbeiten mit Knotenmengen, die eine geordnete Sammlung von XPath-Knoten enthalten. Es sind Funktionen zur Größe und Position des aktuellen Kontexts, Auswahl benannter Elemente, Namensabfrage u.a. Beispiele sind position( ), last( ), count( ), id( ). o String Funktionen Funktionen zum Konvertieren von Objekten in Strings, Konkatenation von Strings, Auswahl von Substrings, Bestimmen der Stringlänge und Umformung von Strings u.a. string( ), starts-with('Richard', 'Ric' ), contains('Richard', 'ard'), substring-before('12/05/1968', '/'), string-length(//name[position( )=1]) o Boolean Funktionen Funktionen zur Konvertierung von Objekten in Booleans, Umkehrung des Boolean Wertes, Abfrage auf true oder false u.a.. true( ), false( ), not( ), boolean( ) § o Numerische Funktionen Funktionen zur Konvertierung von Objekten in Zahlen, Summenberechnung, Rundung u.a.. number( ), round( ), floor( ), ceiling( ), sum( ) Lexikalische Struktur: Zerlegen von Ausdrücken in Tokens liefert das jeweils längste Token 3.5 Diskussion Während XPath in Kombination mit XSLT den Entwicklern eine Menge an Möglichkeiten zur Steuerung von Anfragen und der Darstellung der Daten einräumt, hat das W3C erkannt, dass diese beiden Techniken keine endgültige Lösung sein können: Seite 14 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath • XPath 1.0 orientiert sich immer noch am Prinzip der Einfachheit, so werden z.B. nur die vier Datentypen node-set, boolean, number und string unterstützt. Andererseits verursacht genau dies Probleme, wenn es um das Arbeiten mit Werten mit zugehöriger Typinformation wie z.B. Datumsangaben geht. (Die nächste XPath-Version verfügt deshalb über wesentlich mehr Datentypen.) • Einige Anfragen (wie z.B. die o.g. Liste von Referenten und deren Referaten) sind mit XPath und XSLT recht schwierig. • Zusätzliche Funktionen, die normale Anfragesysteme bieten (wie z.B. das Hinzufügen oder Aktualisieren von Elementen) sind einfach nicht vorhanden. Sucht man im Internet nach Einträgen zu XPath, kann man – je nach Suchmaschine – z.T. sehr viele Einträge finden. XPath scheint bereits recht oft eingesetzt zu werden, allerdings nicht als eigenständiges System, sondern eingebettet in anderer Parser-Software für XMLDokumente. Ähnlich wie SQL kommt XPath in vielen verschiedenen Situationen zur Anwendung: Da gibt es spezielle Anfrage-Werkzeuge für XML-Dokumente, native XMLDatenbanken (z.B. XIndice vom Apache XML Projekt oder Tamino von der Software AG), oder XPath wird als Teil einer umfangreicheren Sprache wie XSLT oder XQuery eingesetzt, oder als Teil eines Java-Programmes für die Suche auf XML-Dokumenten 3.6 Weiterentwicklung von XPath: Inzwischen hat das W3C eine XML Query Working Group gebildet, mit dem Ziel, flexible Anfragemöglichkeiten zu liefern, um Daten aus realen und virtuellen Dokumenten im Web zu erhalten. Seit Dezember 2001 gibt es ein Working Draft für die XML Path Language (XPath) 2.0. Diese ist das Ergebnis der Arbeiten der XSL und XML Query Working Groups. XPath 2.0 ist eine Sprache, die sowohl auf dem oben beschriebenen XPath 1.0 als auch auf XQuery (siehe eigenes Referat) aufbaut. XPath 2.0 und XQuery 1.0 sind eng verwandt, weitgehend mit gemeinsamer Syntax und Semantik. XPath 2.0 ist nach wie vor dafür gedacht, in eine HostSprache (wie XSLT 2.0 oder XQuery) eingebettet zu sein. Und XQuery Version 1.0 enthält XPath Version 2.0 als Subset. Weitere Informationen zu XPath 2.0 enthalten die folgenden Dokumente: • Das Datenmodell für XPath beschreibt die Information eines XML-Dokuments, die für eine XPath-Prozessor zugänglich ist: XQuery 1.0 and XPath 2.0 Data Model (http://www.w3.org/TR/xpath20/datamodel) • Die statische und dynamische Semantik von XPath ist formal definiert in XQuery 1.0 Formal Semantics (http://www.w3.org/TR/xpath20/XqueryFormalSemantics) • Die von XPath unterstützten Funktionen und Operatoren sind in XQuery 1.0 and XPath 2.0 Functions and Operators definiert (http://www.w3.org/TR/xqueryoperators/) 4 Quellen, weitere Informationsmöglichkeiten [1] J. Clark und S. DeRose. XML Path Language (XPath), Version 1.0. W3C Recommendation 1999, http://www.w3.org/TR/xpath [2] J. Robie, J. Lapp und D. Schach. XML Query Language (XQL). W3C Recommendation, 1998, http://www.w3.org/TandS/QL/QL98/pp/xql.html [3] R. Anderson, M. Birbeck, et. al.. Professional XML.April 2000 [4] D. Chamberlin, D. Frankhauser, M. Marchiori, J. Robie: XML Query Requirements W3C Working Draft, 2001, http://www.w3.org/TR/xmlquery-req [5] E. R. Harold, W. S. Means: XML in a Nutshell - A Desktop Quick Reference, January 2001, http://www.oreilly.com/catalog/xmlnut/chapter/ch09.html Seite 15 Annette Gutjahr Seminar: XML und Datenbanken: XQL, XPath [6] ML.com: Considering XSL Extensions, XQL and Other Proposals: http://www.xml.com/lpt/a/1999/03/quest/index3.html: X [7] E. R. Harold, Processing XML with Java, 2001, http://www.cafeconleche.org/books/xmljava/chapters/ch16.html [8] J. Robie: XQL FAQ, März 1999, http://www.ibiblio.org/xql/ Seite 16 Seminar 1912 – XML und Datenbanken Einsetzen von YATL zur Optimierung von XML-Abfragen über heterogene Datenquellen Verfasser: Andreas Buschka Datum: 17.06.2002 Basisliteratur: „On Wrapping Query Languages and Efficient XML Integration“, Christophides, Cluet, Siméon „Your Mediators Need Data Conversion!“, Cluet, Delobel, Siméon, Smaga Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 1 von 15 Inhaltsverzeichnis Teil 1: YAT..........................................................................................................................................3 Einleitung.........................................................................................................................................3 Aufbau von YAT.........................................................................................................................4 Komponenten..............................................................................................................................4 YAT Modell................................................................................................................................6 Instanziierung..............................................................................................................................7 Typisierung in YATL..................................................................................................................7 Architektur und Implementation......................................................................................................7 Teil 2: Techniken zur effizienten XML-Integration ............................................................................8 Einführung.......................................................................................................................................8 Probleme bei der Optimierung von XML-Abfragen...................................................................8 Lösungsvorschläge......................................................................................................................8 YAT Abfragen............................................................................................................................8 Umsetzung von Abfragen in Ausführungspläne.......................................................................10 Einbinden von Abfragefähigkeiten der Quellen............................................................................10 Exportieren der Abfragefähigkeiten zum Mediator..................................................................10 Ausnutzen der Abfragefähigkeiten zur Optimierung................................................................11 Verarbeitung von XML und Veränderung der BIND-Klauseln...............................................12 Neuschreiben auf Basis der Abfragefähigkeiten der Quellen...................................................13 Diskussion..........................................................................................................................................14 Literaturliste.......................................................................................................................................15 Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 2 von 15 Teil 1: YAT Einleitung Will man Datenbankanwendungen schreiben, die Daten aus vielen verschiedenen Datenquellen miteinander abgleichen, so steht man vor dem Problem, dass Daten von einem Format in ein anderes übersetzt werden müssen, um in Abfragen verwendet werden zu können. Die bisherige Art, „auf die Schnelle mal eben“ einen Übersetzer zu schreiben, führt zu schlecht dokumentierter und kaum wiederverwendbarer Software. YAT ist ein System zum Erstellen von Konvertierern. Es stellt eine Sprache (YATL, „Yet another tree language“) zur Verfügung, die die Spezifikation von Daten auf hohem Abstraktionsniveau erlaubt, und ermöglicht durch einen Mediator, die konvertierten Daten zusammenzuführen. Der Import und Export von generierten Strukturen wird durch so genannte Wrapper durchgeführt. RDBMS Im W port rap -/E pe xp r ort DatensatzBaumstruktur XML Dokument rt -/Expo Import r e Wrapp Baumstruktur des XMLDokuments Manipulation der Baumstruktur durch ein YAT-Programm Neue Baumstruktur mit Knotennamen als HTML Tags HTML Import-/Export Wrapper HTML Dokument Abbildung 1: YAT verändert den Aufbau von Strukturen aus mehreren Quellen Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 3 von 15 Aufbau von YAT Komponenten Middleware Modell YAT benutzt Wrapper und Mediatoren, um die Konvertierung von Daten durchzuführen. Ein Wrapper übersetzt Daten einer bestimmten Datenquelle, z.B. einer XML-Datei oder einer Tabelle in einer relationalen oder objektorientierten Datenbank in eine interne Repräsentation, die von Konvertierprogrammen genutzt wird. Dies kann z.B. die ODMG-Repräsentation sein, in dem ein Objekt drei Bestandteile hat: • • • Identität: Jedes Objekt hat eine systemweit eindeutige Objektidentität, die sich während seiner Lebenszeit nicht verändert. Typ: Der Objekttyp, auch Klasse genannt, legt die Struktur und das Verhalten des Objekts fest. Individuelle Objekte werden durch die Instanziierung eines Objekttyps erzeugt und heißen Instanzen. Die Menge aller Objekte (Instanzen) eines Typs wird als (Typ-) Extension (eng. extent) bezeichnet. Wert bzw. Zustand: Ein Objekt hat zu jedem Zeitpunkt seiner Lebenszeit einen bestimmten Zustand, auch Wert genannt, der sich aus der momentanen Ausprägung seiner Attribute ergibt. Basierend auf dieser Repräsentation führen die YAT-Muster (die eigentlichen Übersetzungsprogramme) die eigentliche „Mediator-“ (Vermittler-)Rolle aus: Die in einen gemeinsamen Speicher geladenen Objekte werden durch das YAT-Programm manipuliert. Anschließend werden die neu erzeugten Objekten an einen Output-Wrapper gegeben, der die gewünschten Ausgabeformen, wie z.B. eine relationale Tabelle oder ein HTML-Dokument erzeugt. Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 4 von 15 Deklarative Sprache „Auto“-Objekt, eine Instanz eines „Auto“Musters, das vom „Fahrzeug“-Muster abgeleitet wurde. Es stammt z.B. aus einem OODBMS „Hersteller“-Objekt, z.B. aus einem XMLDokument Hersteller Auto Standort strBesitzer strHersteller Paris Andreas Citroen Name Citroen „HTMLFahrzeug“Regel Rumpf: Fahrzeug (-> strHersteller -> Hersteller, -> strBesitzer -> Besitzer) Hersteller (-> Name -> Hname, -> Standort -> Standort) PLZ is PostleitzahlVon(Standort) Hersteller = „Citroen“, Hersteller = Hname Kopf: HTMLFahrzeug( -> html -> head -> title -> Hersteller, -> body -> h1 -> Besitzer -> „Herkunft“ -> PLZ -> Standort) HtmlFahrzeug Objekt HTML HEAD BODY TITLE H1 „Herkunft“ 78890 Paris Andreas Citroen AX Abbildung 2: Ein beispielhaftes YAT-Programm Die Sprache von YAT ist Regel-basiert, d.h. Ein YAT-Programm enthält einen Satz von Regeln, die zu einer Veränderung von Daten führen, wenn die Regel auf ein Eingabeobjekt passt. Die Veränderung besteht vor allem in der Restrukturierung der Eingabe, also in der Erzeugung von neuen Objekten in der gewünschten Zielform. Diese muss übrigens nicht dem ODMG-Modell Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 5 von 15 entsprechen, sondern kann auch z.B. HTML sein. YAT ist eine regelbasierte Sprache, bei der jede Regel aus Kopf und Rumpf besteht. Der Rumpf enthält Muster und Prädikate, auf die ein Objekt passen muss, um bearbeitet zu werden. Externe Funktionen (so genannte „Skolem-Funktionen“) können notwendige Zusatzwerte, z.B. die Ermittlung der Postleitzahl zu einem Ort, berechnen. Der Kopf der Regel enthält Informationen, wie die gefundenen Daten neu strukturiert werden müssen. Im Verlauf des Konvertierungsprozesses werden als erstes über die Wrapper die zu verarbeitenden Objekte beschafft. Danach werden die Eingabemuster mit den erwarteten Typen der YAT-Muster verglichen. Falls mehrere Muster passen, wird das speziellste Muster ausgewählt und die Verarbeitung gestartet, ansonsten geschieht nichts. Jedes YAT-Modell kann in ein spezielleres Modell eingebaut werden. Das bedeutet zum Beispiel, dass das vorliegende Programm eine Basis bieten könnte, um ein Programm zu schreiben, das aus einer anderen Datenquelle spezielle Informationen zu Fahrzeugen des Herstellers Citroen beschafft. Die Basisdaten werden dann mit der vorhandenen Regel HtmlFahrzeug ausgegeben, nur die Anzeige der erweiterten Daten müsste implementiert werden. YAT-Programme können auf diese Weise kombiniert (parallel ausgeführt) oder zusammengesetzt (sequentiell ausgeführt) werden. YAT Modell Ein YAT-Modell ist eine Sammlung von Mustern, die die ankommenden Daten und die Ergebnisse der Konvertierung beschreiben. Variablen werden in Großbuchstaben dargestellt. Es existieren Datenvariablen Mustervariablen. Datenvariablen können grundsätzlich alle Datenkonstanten Variablennamen enthalten. und und Unter Datenkonstanten versteht man entweder die Symbole der Konstanten (z.B. Klasse, Name) oder unteilbare Daten (z.B. „VW Golf“) Der Wertebereich einer Mustervariablen ist die Gesamtheit aller Instanzen der Muster. So enthält der Wertebereich des allgemeinsten Musters „YAT“ sowohl das speziellere „Fahrzeug“ wie auch das noch speziellere „Auto“. Ein Muster stellt eine Struktur dar. Es wird durch seinen Namen identifiziert und enthält eine Menge von geordneten Bäumen. Die Knoten der Bäume sind Datenvariablen oder Konstanten, die Blätter dürfen zusätzlich auch Mustervariablen oder Referenzen auf Mustervariablen sein. Jede Verbindung enthält eine Angabe darüber, wie häufig sie bestehen kann. In YAT wird der Stern (*) benutzt, um 0 oder mehr Verknüpfungen anzuzeigen. Fehlt er, so existiert genau eine Verbindung. Ein besonderer Baum, von dessen Wurzel nur ein Ast abgeht und diese Verbindung unmarkiert ist (d.h. Es existiert genau eine Verbindung) wird „ground pattern“ genannt und kann nur von sich selbst instanziiert werden. Es wird benutzt, um reale Daten darzustellen, z.B. in semistrukturierten Datenmodellen. Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 6 von 15 Abbildung 3: Ein vollständiges YAT-Modell für Kunstwerke Instanziierung Jedes Muster des instanziierenden Modells muss eine Instanz eines übergeordneten Musters sein (bis herauf zum YAT-Basismuster) und eine Variable kann entweder durch eine Konstante aus ihrem Wertebereich, oder durch eine andere Variable, deren Wertebereich kleiner oder gleich ist, instanziiert werden. Durch diese Regeln wird der Wertebereich, je öfter die Vererbung stattfindet, immer kleiner und spezieller. Im vorliegenden Beispiel ist „Auto“ eine Instanz des übergeordneten Musters „Fahrzeug“. YAT kann sich daher darauf verlassen, dass die Knoten „strHersteller“ und „strBesitzer“ vorhanden sind. Die Regel HtmlFahrzeug kann damit auch mit Objekten des Typs „Auto“ arbeiten. Typisierung in YATL Ein YAT-Programm nimmt ein Muster entgegen und gibt ein neues Muster heraus. Indem man sich die verschiedenen Regeln anschaut, lässt sich eine Signatur zusammenstellen, deren Information benutzt werden kann, um z.B. die Kombinierbarkeit von YAT-Programmen zu prüfen. Eine Exception-Regel kann in ein YAT-Programm eingebaut werden, um ungültige oder unerwartete Eingabeobjekte zu erkennen. Architektur und Implementation Der Prototyp des YATL Systems besteht aus einem Modul, um YAT-Programme zu bearbeiten, einem Modul zur Typprüfung und Typvererbung und einem YATL-Interpreter. Zusätzlich können Wrapper angebunden werden, die Objekte aus verschiedenen Datenquellen bereitstellen oder zusätzliche Skolem-Funktionen berechnen können. Für YAT steht eine grafische Oberfläche in Java zur Verfügung, mit der Muster (die eigentlichen YAT-Programme) angelegt werden können. Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 7 von 15 Teil 2: Techniken zur effizienten XML-Integration Einführung XML wird zunehmend beliebter, wenn es darum geht, Anwendungen zur Datenintegration zu schreiben. Die Gründe dafür sind unter anderem in der einfachen Umwandlung externer Datenquellen in XML und zurück zu sehen. Leider sind XML-basierte Systeme noch in der Effizienz gegenüber traditioneller Integrationssoftware unterlegen, da häufig große Datenmengen bewegt werden müssen, bevor letztendlich eine Abfrage erfolgen kann. Wenn es gelingen würde, die Eigenschaften und Fähigkeiten der Datenquellen auszunutzen, könnten Abfragen effizienter ablaufen. In diesem Abschnitt werden häufige Probleme bei der Optimierung von Abfragen über heterogene XML-Datenquellen beschrieben, und eine Lösung auf Basis von YAT wird vorgestellt. Probleme bei der Optimierung von XML-Abfragen Einbinden von Typinformationen Die Verwendung von Typinformationen erleichtert die Optimierung von Abfragen erheblich. Leider sind Typinformationen für XML Dokumente noch nicht ausreichend verfügbar; DTDs bieten nur eine schwache Typisierung gegenüber der Typenvielfalt moderner DBMS. XML-Schema oder DCD versuchen, diese Situation zu verbessern, aber ein einheitlicher Standard steht zur Zeit nicht zur Verfügung. Einbinden von Abfragefähigkeiten der Quellen Datenquellen im Internet exportieren selten komplette Datenbestände, sondern geben auf einzelne Objekte über Abfragesprachen Auskunft. Wenn ein Computer die Abfragesprache „verstehen“ könnte, könnte er deren Eigenschaften zur Optimierung nutzen, um z.B. Einschränkungen der Objekte direkt bei den Quellen ausführen zu lassen und damit die Masse an Daten, die bewegt werden müssen, zu reduzieren. XML Abfragen effizient auswerten Es steht keine Algebra zur Verfügung, die die Eigenschaften der XML berücksichtigt. Außerdem müssen Typinformationen ausgewertet und sehr heterogene Fähigkeiten der Abfragesprachen ausgenutzt werden. Lösungsvorschläge Um die besprochenen Probleme zu lösen, wird als erstes eine Algebra für XML eingeführt. Anschließend wird ein XML-Format zur Beschreibung der Fähigkeiten von Datenquellen beschrieben. Basierend darauf werden Techniken zur Abfragebearbeitung besprochen und die XML-Integration unter Anwendung von YAT demonstriert. YAT Abfragen Die Algebra wird auf der bereits besprochenen YATL aufbauen. Diese Sprache unterstützt Operatoren, die in relationalen Datenbanken vorkommen, z.B. JOIN, SELECT, PROJECT, UNION und INTERSECTION sowie Operationen aus Abfragesprachen für objektorientierte Datenbanken wie MAP, GROUP, SORT und D-JOIN (dependency join). Zusätzlich werden noch zwei neue Operatoren eingeführt, die für die Bearbeitung von XML-Daten besonders wichtig sind: BIND und TREE. Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 8 von 15 BIND BIND hat die Aufgabe, aus Eingabeobjekten die gewünschten Informationen zu kopieren und eine Struktur aufzubauen, die „Tab“ genannt wird. In einem Tab sind die Werte der Datenkonstanten unteilbar (1. Normalform). Der BIND-Operation kann ein Filter mitgegeben werden, der die zu selektierenden Attribute festlegt. Es ist auch möglich, mit den nicht ausgewählten Attributen einen Unterbaum aufbauen zu lassen, um so z.B. mit semistrukturierten Daten umgehen zu können. Gegeben sei beispielsweise eine XML-Datei mit künstlerischen Werken der folgenden Form: <work> </work> <artist>Claude Monet</artist> <title>Nympeas</title> <style>Impressionist</style> <size>21x61</size> <cplace>Giverny</cplace> ... (weitere Datensätze) Dann liefert ein Aufruf von BIND ( $title: $t, $artist: $a, more: $fields) einen Objektbaum der folgenden Art: a Claude Monet t Nympheas fields style size cplace Impressio- 21 x 61 Giverny nist Abbildung 4: Die durch BIND erzeugte Tab-Struktur Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 9 von 15 TREE TREE bildet in der Regel den Abschluss einer Abfrage. Die Operation gibt eine Sammlung von Bäumen zurück, die einem gegebenen Muster entsprechen. Dabei können die Daten neu gruppiert werden, um z.B. alle Kunstwerke eines Autors unter einem Baum zu sammeln. Umsetzung von Abfragen in Ausführungspläne Die YAT-Regeln wurden bisher grafisch notiert, ohne dass die Namen der Operationen wie BIND, TREE, SELECT etc. verwendet wurden. Diese Umsetzung erledigt der Abfrageprozessor nach folgendem Schema: 1. Die Abfrage operiert auf allen Objekten, die durch die Wrapper importiert werden. 2. Jede Regel aus dem Rumpf passt auf einen oder mehrere Objekttypen. In dem Beispiel aus Abbildung 2 sind dies „Fahrzeug“-Objekte (oder instanziierte) und „Hersteller“-Objekte. Diese Anforderungen werden in BIND-Operationen umgesetzt. 3. Die Verbindungen zwischen den Objekten werden mit einer JOIN-Operation hergestellt. Im Beispiel wäre dies die Verbindung Hersteller = HName. 4. Andere Einschränkungen werden in SELECT-Operationen umgewandelt. 5. Der Kopf der Regel, der die neu erzeugten Objekte und deren Gruppierung (in unserem Beispiel: Die HtmlFahrzeug Objekte) herstellt, wird in eine TREE-Operation übersetzt. Einbinden von Abfragefähigkeiten der Quellen Nachdem nun eine Algebra für XML zur Verfügung steht, die der tiefen Verschachtelung und der Eigenschaft von XML-Dokumenten, semistrukturiert sein zu können, gerecht wird, wird nun das Verfahren betrachtet, mit dem der Abfrageoptimierer sich über die Fähigkeiten der Datenquellen informieren kann. Dies ist wichtig, weil die Information über die Fähigkeiten die Möglichkeit eröffnen, Teile der Abfrage zu den Datenquellen hin zu verschieben, und damit die Menge der zu übertragenden Daten wesentlich zu reduzieren. Beispielsweise kann eine Datenquelle die Möglichkeit haben, die übertragenen Daten nach Teilen des Namens einzuschränken. Würde der Abfrageoptimierer davon nichts wissen, müsste er, um die SELECT-Operation bearbeiten zu können, alle Daten der Quelle laden. Weiß er aber, dass die Einschränkung nach Teilen des Namens schon bei der Quelle durchgeführt werden kann, so lässt sich die Anzahl der übertragenen Entitäten reduzieren. Die Spezifikation der Abfragefähigkeiten muss in einer Weise erfolgen, die sowohl mächtigen Abfragesprachen wie SQL, aber auch einfachen Interfaces wie WAIS („Wide Area Information Server“) gerecht werden. Auf die beschränkten Fähigkeiten von WAIS wird im folgenden noch eingegangen. Exportieren der Abfragefähigkeiten zum Mediator Der Export der Abfragefähigkeiten von den Wrappern zum Mediator läuft in zwei Schritten ab. Als erstes wird eine Signatur erstellt, und danach wird der Mediator über die Semantiken der Operationen informiert. Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 10 von 15 Signaturen Eine Signatur enthält den Namen einer Methode zusammen mit ihren Ein- und Ausgabeparametern. Beispielsweise kann ein System eine Möglichkeit bieten, den aktuellen Preis eines Kunstwerks zu ermitteln: <operation name=“external“> <operation name=“current_price“> <input> <value model=“Work_Schema“ pattern=“Work“/> </input> <output> <leaf label=Float /> </output> </operation> </operation> Diese Operation erhält als Eingabeparameter ein Kunstwerk und gibt den aktuellen Wert als Gleitkommazahl (Float) zurück. Semantiken Durch die Angabe der Signaturen ist noch nicht viel erreicht. Der Mediator kennt jetzt zwar die Signaturen der Operationen, weiß aber nicht, wie er diese Methoden zur Optimierung der Abfragen nutzen kann. Dies muss durch Angabe von Semantiken erreicht werden. Eine WAIS-Datenquelle hat beispielsweise die Fähigkeit, den Namen eines Kunstwerks nach einem Teilstring zu durchsuchen. Die dazugehörige Operation sei in der Signatur unter dem Namen „contains“ definiert. Nun wird ausgedrückt, dass die beiden Operationen • „Führe eine Teilstringsuche im WAIS Datenbestand aus“ und • „Lade alle Namen der Kunstwerke und suche innerhalb des Mediators“ gleichwertig sind: Select($x=$y, Select(contains($w, $y), Bind(works, works*work($w), [F($x)]))) = Select($x=$y, Bind(works, works*work[F($x)])) F($x) ist hier ein beliebiger Filter über die Variable x. Ausnutzen der Abfragefähigkeiten zur Optimierung Nun stehen eine Algebra für XML und eine Form, die die Fähigkeiten der Datenquellen beschreibt, zur Verfügung. Dies soll nun ausgenutzt werden, um Abfragen zu Optimieren. Das Ziel ist dabei, die Abfragen sowohl lokal zu optimieren, indem die Ausführungspläne verändert werden, als auch die Abfragen soweit wie möglich zu den Datenquellen zu verschieben, um die Menge an übertragenen Daten zu reduzieren. Da die vorgestellte XML-Algebra eine Erweiterung einer objektorientierten Algebra ist, können die dafür bekannten Optimierungen sofort angewendet werden. Deshalb werden nur Optimierungstechniken für die neuen BIND und TREE Operationen behandelt. Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 11 von 15 Verarbeitung von XML und Veränderung der BIND-Klauseln Die BIND Operation ist eine „teure“ Operation. Das Ziel ist daher, die BIND-Operationen so zu verändern, dass die behandelten Bäume möglichst flach bleiben. Bei einfachen BIND-Operationen ist die Wahrscheinlichkeit, dass sie sich zu den Datenquellen verschieben lassen, höher. Bei der folgenden BIND-Operation (linke Seite) werden ausgegrabene Artefakte gebunden. Außerdem werden Informationen über Ihre Besitzer geholt. Dies kostet viel Zeit. In einem ersten Schritt wird diese Operation in zwei BINDs aufgeteilt, einen für die Artefakte und einen anderen für jeden Besitzer. Danach werden beide Objektmengen über DJOIN verknüpft (mittlere Seite). Eine derartige Veränderung ist bei jedem BIND möglich. DJOIN kann optimiert werden, indem der rechte BIND so verändert wird, dass er nicht mehr viele Objekte vom Typ Person erzeugt, sondern eine Sammlung, die Objekte vom Typ Person enthält. Der Vorteil ist, dass nun ein JOIN zwischen zwei Klassen gleichen Typs durchgeführt werden kann (rechte Seite). JOIN-Operationen sind grundsätzlich schneller als DJOIN-Operationen. Abbildung 5: Optimierung einer komplizierten BIND-Operation Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 12 von 15 Neuschreiben auf Basis der Abfragefähigkeiten der Quellen Die folgende Abfrage befasst sich damit, alle Kunstwerke von Impressionisten zu finden, die für weniger als 200000 Franc verkauft wurden. Ausgangsbasis ist eine gemeinsame Struktur „artworks“, deren Felder aus zwei Datenquellen gewonnen wurden: • title, artist, year, price, und owners stammen aus einer objektorientierten Datenbank, die OQL (die objektorientierte Variante von SQL) versteht • style, size und „more“ stammen aus der WAIS Datenbank, deren Signatur und Semantik bereits vorgestellt wurden. Abbildung 6: Ausführungsplan für das "artworks" Muster Problematisch ist nun, dass zuerst alle „artworks“ geholt werden müssen, obwohl nur diejenigen benötigt werden, die für weniger als 200.000 Francs verkauft werden. Um diese Abfrage effizienter ausführen zu können, können folgende Eigenschaften der Datenquellen genutzt werden: • WAIS kann die Suche auf alle Werke einschränken, die impressionistisch sind (Operation contains) • Die artifacts-Datenbank versteht OQL und kann die Einschränkung auf 200.000 als maximalen Preis ausführen. Die optimierte Abfrage sieht nun so aus: Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 13 von 15 Abbildung 7: Optimierung der artworks-Abfrage Man sieht nun, dass einfachere BINDs sich besser zur Optimierung nutzen lassen. Diskussion Das vorgestellte System aus der Abfragesprache YATL und dem System, dass die Fähigkeiten der Datenquellen beschreibt, ermöglicht es, XML-Daten durch Vererbung sinnvoll zu typisieren und XML-Abfragen über mehrere Datenquellen zu optimieren. Der Vorteil der YATL liegt darin, das Abfragen nicht nur auf Objekten operieren können, die einen bestimmten Typ haben, sondern auch mit Subtypen arbeiten können. Der Ansatz, YATL Programme durch eine grafische Oberfläche „zusammenklicken“ zu können, ist intuitiv. Nachteilig ist sicherlich, dass für jede Datenquelle ein besonderer Wrapper geschrieben werden muss. Er wäre hilfreich, wenn z.B. ein Werkzeug existierten würde, dass aus einer XML Schema Definition einen Wrapper herstellt, ohne dass extra programmiert werden muss. Einige Funktionen, die z.B. aus SQL gut bekannt sind, wie z.B. die COUNT() Funktion, müssen durch Skolem Funktionen neu geschrieben werden. Die Ansätze zur Optimierung von XML Abfragen gehen in die richtige Richtung. Sie reduzieren vor allem die Datenmenge, die zwischen den Datenquellen und dem Mediator bewegt werden muss, und sie schont dort Hauptspeicherverbrauch und CPU, da der Mediator von der zeitaufwendigen Bearbeitung vor allem von SELECT-Operationen, entlastet wird. Nachteilig ist, dass trotzdem weiterhin bestimmte Operationen, wie z.B. JOINs über mehrere Quellen, sehr aufwendig sind, weil die Objekte der rechten Seite entweder immer noch übertragen werden müssen, oder für die rechte Seite des JOINs einzelne Abfragen geschickt werden müssen. Es wäre sinnvoll, wenn auch diese Art der Abfragen sinnvoll optimiert werden könnte. Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 14 von 15 Literaturliste [1] „On Wrapping Query Languages and Efficient XML Integration“, Christophides, Cluet, Siméon [2] „Your Mediators Need Data Conversion!“, Cluet, Delobel, Siméon, Smaga Abbildungsverzeichnis Abbildung 1: YAT verändert den Aufbau von Strukturen aus mehreren Quellen Abbildung 2: Ein beispielhaftes YAT-Programm 5 Abbildung 3: Ein vollständiges YAT-Modell für Kunstwerke 7 Abbildung 4: Die durch BIND erzeugte Tab-Struktur 9 Abbildung 5: Optimierung einer komplizierten BIND-Operation 12 Abbildung 6: Ausführungsplan für das "artworks" Muster 13 Abbildung 7: Optimierung der artworks-Abfrage 14 Seminar 1912 – Thema: YATL – Autor: Andreas Buschka – Seite 15 von 15 3 ! " !" # % & ) * $ " '( + " ,% -. / 0 ) % ) 0 # & $ " '( : ; ") 0 ) 7 5 ) " 0 < " )) ? $<=% / ,% ,% -. " : > ) 2 " 7 "0 2 <$0 & 7 7 2 " @ A 0 7 5 ) % " B " 7 0A " " 9! < ; < C 6 ' ' )) < ": D? 7 7 77 ( ( E9! ? ! 9 F 0) ! : 9) F " 5 5 5 ) ) 9 " ; 7 7 5 - 9 G ,% - 2 : ) % " )) 7 !) : 6 ' 5 9 5 ,% -. 5 . ) * 12 2 )) " 34 4 5 6 *57 898 ,% -. / 0 ) % 9!! )" 9!! )" 9!! )" 9!! )" 9!! )" * " * " 7* D2 5* % " )) = = = = = = = = = = = 2 2 2 2 2 2 2 2 2 2 2 ) ) ) ) ) ) ) ) ) ) ) * * 7* 5* * 6* '* (* * . . . . . . . . . *. *. @ @ @ @ @ @ @ @ @ ,% -. A 6 6 ' ( ) " D ;! ;! @D @ " '( 7 5 6 2 ) ) ) 0A $ : 2 2 H" <$$0 I J ,% : )) = # & K E ": ,% -# "" 0 ! ) ) A !) ,% -# 2 ) ,% -# ) 9 " ; K E 9 " ! ! 7 5 L! L! L! L! ) * 12 *= *= 7* = " 34 2 )" 2 )" 2 )" 4 5 6 D D D " ! ) ! H )) M M *57 H ! H 8=8 ,% -. # & % $ " '( ") 0 ) < : ! " " " " O O " " ) % :" )) #"! " 9 ? ,% ) ! ? ,% & F " " B % > " $<=% / ,% F " ;! E <=% :) - D) ! 7 0 0 F " "" " " : )) ! " !: ) I ! 5 D ) * 12 " )) ) < : 2 ) F E/ J 2 : E "0 % "") F )) " B ) 7 0 F " < " < 2) : F )) < " : " ; ! ) ! ! )) " ! - )) J; " ! 4 " ! : )) ) 2 -# * 0 T = ! ; " P ") J ) ) < )) : 2 2 ) ,% -. -0 " : ) 22 "N " ) ! F " " F " 4: " 2) A P #! : > ) 4F ) / 4F ) . )) "" 0 ! ;! )) = ! " " 5 = " " = ; ! )) " ! ! "4: " ) A !) <#< / ) D< E/ " ) > ) % " )) ? ) > ) < )! F " ,% -< ; ,% -< 4 ) ! " 4,% -< : ; 4 : % P !) D0 " E ) D J; F " 4 " " 4F ) ,% -< ! F " ) ,% )@ :) F I0< Q 2 ) ,% -. F ,% -. 9! 2) " ) < ; ) : " 7 )! ! A2) : < " " < F 0 9 R ,% -. ) 2 ! 4: ,% - !) I ) ) % " ))J " $ ) # ! )) I: ) J " O ) " " ); ) F )! I: ) D& ))E- )" J " ) ! ) ! ) 2 2 " 4 I" F ;: ! ) ,% -< " )! " $ F ) # " " " ) / " 4 ) ") : 4" : ) " : < $<=% $ I" F 2 " # )) " ) P " # 9 : " F ) F " 4 " ) ! = - : : F " : F " > 4 2 : B F , " , / 4F ) " = A ! D E O 7S ) ! " ; " 9 :2 : U T'U 2*NNFFF F7 " 34 NS 4 5 6 N *57 8 N '8 ,% -. # & % $ " '( 5 ,% -. " : < 2 @ ) " A F ) F " / ) ? ; : ,% -? 0 > ) ": " 9 P ! F ? " ;: #9 -9 ) D ! E @ ,% -< "9 ;: F " ; )@ W 2 -% ,% -< A % ! " N ) " #9 ) - "R ) 4 22 4 - " 2) A ,% -< I " ) 9 " ; I9 < > ; " $ 4 ? * V. ) ) & F <$0 ) ! # 4 ) " <#<J J " )) ? B : ) " 9!! )" )F 2 " 9 ) )@ " " 2 0 - Q I 40J R 0 R 9 ! -O 0) ! " ,% -. " & 4" = : J '( ! !! IG <J " 2 ): " " X S<9#9- ) ! ) ,% -< 2 R 40) " R 40) ) - =) ! I % -0) I#9 -& 4 " " $ ! : - )) =) ! ! " F " 9 2 " 9 * Q 6 ! J 2 F ! ) ) 2 < < O # A < ! < ! ''! B :) ) " :F " 6 ) ) : A G< F ) * 12 T :F U ; ! ) % & * % " ))* R ! > @2 R )) " G2 ! = : ! " " 34 4 5 6 *57 8 N '8 ,% -. R < ! ) : $ G " 0 ) =) ) " 0) ) F "! = : " ) " " # & % ! % ! )" " -N ) - $ " '( ) ) ! ; - 2 " -! F " ! ; " 9 )@ "9 ! " < ,% 2 4 ! )" . @ ) ))4" " D ))! E ) ) " ,% -. " A ) G " ;: " IR 2 ) !) " ,% = J ; " F " IJ ! ! T U T U T U IJ I Q 6 I'J I J J )T U : U IJ 2 < " 0) ) %> ) 9 ; 7 " @-G2 " . F " & B 9 ) " I J < # A ! I 7J < : F " + " -< 4F % ) & , " ! P F < ! 4 ) :F : ) )) ! " ); ) ) : <$0 " " " < $<=% -R : 2 0 0) F ); ) ) $ ; : ,% R :2 ! ) : - ./ !:F - ./ ! " " 0) " " #@2 ! " ( 2 )* 1Y9## #! 1Y9## # ! )) ; E < % ) * 12 " R $ " < " < X$0.? $0<3 ! <$0 X$0.? $0<3 > ! R ,% -. K : " ! ( < I J ! ''! ' IJ O < = I(J T U T I6J T U I5J T U I7J ) T U U T7 ) )T U F T ! A U 2 : " ;: " ))4" ) " #9 . 9 12 < ) " " D - F " : F ! ,% ) 2 2 ) 3 4 " <#< ! F " 9 P " "1 F 3F " & I<#<J4 ) :- !:F < )) " 0 <" G<" ; " 4" & ) : ! " 34 " 4 5 6 # # *57 ! !! 0 ; " ! 2 ) F T U 8 7N ' 8 ,% -. 0 # & % : ) & 1 4F ,% - 31! " 31 2 I "" . ))" ) * $ " '( J) 3 ,% -< )) ! ! ! ! Q 6 J ! 2 ) : F ! A ) ) 2 < < O # A < ! < ! ''! ) * 12 ) I " 34 4 5 6 0 1& ! *57 ! 2 - ../ " 8 5N ' 8 ,% -. # & % $ " '( ! " " @ A ,% -. @ " ? W " 9! ) 9 ! 4" ; )) : ,% " 9 ) - . -NG. -9! F : 2 ))J" < I2 " 2 ) $ * 4 = ; - ! " O 0$0 & SG& #$?S# S < ! !) : " " . ))" : ! " F " < F " > 3 F " 0 F " ) !) ) 4" ; # :) D# )) W " DR E 2 " ) 9! 0 ) -R) ) F ) ) "S " ;!) F F ))" ; . -! R) ) . 9) 9 F ! < " ! " " O ,% -. -0 1,% 3 :) ) " 2 0) -O 9 0) ! 3Z 1N )) . ) IT " 9 < " " ,% -. 1N3 ! ! )) ) ;: " @ ; : F " "; 9 " F I ) 7 7J @ " 0! " ) ! 9! ) ) * 12 -#9 F 4 : " ) ! ) ) : ) !) 1N) )QZ " > A3 3 1N" 2) ! 3 : ; " " UJ F 0 ) 2 ) = D5 = 2 )" " " 2 ) " ! E: ; ))) E 5 F * ,% -. -9! > 2 Y& ; ) 1N3 : 2 " 34 4 5 6 4 ) "@ O " ) 4" 7 4" ) " 9 ,% -0 ) P " 0) " ; ;! : ! " ! : 0) 9 ! - 7 = : D,% -S < B 0 2 : ) 4F ! : 0A 7 ) 3 Z " F 0 ) ! S I#9 J* 1Z 3 < ! ! : ,% -< Z )) A 3Z! : IXS<9#9J* 1" 2) IG <J* 1 " F " " G " R F " ! IX S<9#9J* 1) ! " F " F " 9 ) ) 9 " ,% - -O R F " " " % # 4 F ) ) $! !S : "N " F ) !) IA 4 4A J ;! " E! ) " R ) S : D# E < ! ! )) " 4 ) I2 )J " &,% -#9 N? ! : " 4" O :)F " < T ,% -< ! )) *57 F 4" F " F " U "T U " ; ,% - " " : ": ! ; " - )! " ,% " 9!- 8 N '8 ,% -. ) " F " 31! F 1 # & % = 2 ) F " ! < 31 3 " $ X S<9#9 & " !) %% & ! %'( ) ;! Z) " Z <$0 F " * )+ ! " R 2 ) T 9! O 1[A ) 1,% <QH 1 1) ! 3 3 1) 1 1! 1N3 1N3 H " " 7 " ! A 3Z)1N3 3 1N3 31 3Z 1N31N3 QH 1 " N" F ) "N N ! A )H ! 3< 1N! 3 3 A3 2 < ! 3# A1N! 3 1) 3 A 3Z)1N3 3Z 31N3 1) 1! 2 )- 1! 1N 1N,% 3 ! U H[3 "M H3 3 A3 2 < 1! 1N 1 2*NNFFF " '( ,- T ,% -. U 1 1 $ 1N) 3 A3 1N) 3 A3 1N3 4 !&! ) )) : ! " " ) 4" 0) )) 1) ,% -. ! - 0) " A 3 F; " " ) ! 5 $! % )" " " " 2 :F O ; " !) 2 ; ) < ! IT UJ!:F " D )) ) 2) : 4" 9 ! ;! 7 ! ! E< 2 ) " ,% R 6 " ! ) ) = !) ! " IT 7 UJ4" 0 9 2 ; *" . / * " 9! ) % ) 22 ,% " ) : T ) T 7 UR 2 UY ) 2 F ") - " 9! " ! *0 $0 2 ) > !! )) 4 %% " 22 ) " " 1 !) #2 % = ! F : ( ) KF ) * 1[A ) 1,% <QH 1 1) ! 3 3 1) A 3Z)1N3 1 ! 3 1N3 1N3 0 0% 0&#M9 Z 1N3 H 2*NNFFF " N" F ) "N 1 QH < 1! 1! N ! A )H 1N 1N,% 3 - )T 9! O R 2 T ,% -. U 1 1 / - < 9 ! # ! U H[3 "M H3 3 A3 2 ! 3< 1N! 3# A1N! 3 1N) 3 3 A3 3 A 3Z)1N3 1) 3 2 4 *54 54 56 475475475 6 " ") * 4 56 475 8 1N3 4 !&! + ) * 12 " 34 4 5 6 *57 /5 $! #! $ 8 6N ' 8 ,% -. % " ); )F 5 !) : ! " R) ) : < :F B / / /678 ": :) A < O 0$0-SG& #$?S# " 9 F !) Z ! : " 9) :F %> ) D 4 " ! ) ;! : " ) ; . ! ) " 4 0) @-=) )) " ! " )) 9! "" ) E : 4 " ) "" < &! " R 2 @- . ) 5 " ! " 0) )) ! 9 $ ; )! < :F )) ) C " : 0) ;2 4 ) # " O " !! %% * #2 % 9 $! ;2 F DK E- - T ,% -. U T 9! F 1[A ) QH H[3 1,% <QH "M H3 1! 3 1 3< !1N 1 3? 1N! 3 1! 3 1 3< 1N 3 1 3 2 < ! 1N! 3 1! 3 1 3# A1N 3 1 3 2 < ! 1N! 3 1N,% 3 ! 3 <QZ!3 3Z 1N3 1 1N3 1N3 H : !) * $0 1 1! 2*NNFFF 1! " N" F ) "N N ! A )H 3 1 3 2 " '( ) 2 " $ < )) F " 22 4K " % " 4 ! " F " F "" C )) F "" = :F O 0$0-SG& #$?S# " F " 5 = " # & % 3Z 1N3 4 4 * * 4% )5 :6 5 ; 56 475 475 475 < ! 772 2 2 =)) = ""7 )2 %) ") * " 4 *56 475 8 7 7 * ! U 3 1N 1N 3 1N 3 3 )= ; %< 1N3 4 !&! 0 & F "" = : F4 0 < : 5 < < > ) * 12 )) ) R " ; " C " ,% -. -0 " 4 # G2 )) " F ) ! " 34 2) . " # !!$ ! E9 "; * 9 ); T7U 2 ) )F "T : )" " 0 : @2 9 F )) < " %> ) : " D $ " B " 3 4 3 ,% -. >)) B 9 ? 2 #! C )) "4 ! " I ! !) )- )) *> ,% -< *" ? " SG�&#M9 : U F ,% -. -0 2 " "; ! : ; 4F " ! A2) : F ; 22 W " ;! " )! < - *" " " ) 9 . ! - @-=)> - 4 5 6 *57 8 'N ' 8 ,% -. " 4: = " ) -G2 9 4 4 J4 " D * % E -K T 9! F 1 1 ! 772 2 2 =)) = ""7 )2 %) 3 1 \ F 7 7 * )= ; %< 3Z)1N3 1 1 " 1 1 1N3 1N3 < 1 ! ) 3 3 3Z 1N3 3Z 1N3 ! 772 2 2 =)) = ""7 )2 %) 7* " ! U 1[A ) QH H[3 1,% <QH "M H3 1 3 1 3? 1N 3 1 " 3# $ "1N " 3 1 " 3< @ < 1N " 3 1N 3 1 3 1 3 2 < ! 1N 3 1 " 3# $ "1N " 3 1 " 3 :% 1N " 3 1N 3 1N,% 3 ! 3 QZ 3 A 3Z)1N3 1) " '( *%* - T ,% -. U 1N3 1N3 < $ !) $ 1 # & % 7 % = ; %< 3Z 1N3 ] 1N3 4 !&! 9 0 > ) " # ) " R " ! F " 4" O 0$0- !) : 2 # $! $ " 1! (!: " 6 ! :; ) ) " 1 ? " 9! D 0 ! : : ! : F " " 3-0) E " "! 4F < ": = " 9 ) F < ! ) 0) " ? B !) ! " ) 9! ) " 4F ) G " " ( 9!! )" ! : ) D ) : ) 4 " )) I ) J )@ " ,% - < " : 4" " F ,% - " 4" 2 E %% 0) :: F " 4 " $ ! : 9 ;! " K ) " ' ; : ,% -. : :) F " $ ) F " " D ) ! EF " : $ #9 4 " : <G% -0! 9 * " 4" " " : ) 7 ' ( F < #9 ) !) < B )F 0 :! F " 6 : " < < F : ) 0 : : " N )) )" F " F "" ) ) * 12 " T U4T 7 U C )) T U " T 7 U4 " 4F ) " : " ,% -. -0 IT UJ " A ! 4F 2) " " ": 34 " T 5 U" " P " !) *57 ; ,% -. 2) @ ;! 2 : : 4 ! "F " : I J " ,% -< " D2 : 4 5 6 )) !) F ) 9 9) B " < ! " ;: " > )) ) 2 F - ) #9 4 ) ) EI ) 9 )) 7J ! 2 " D : ) EF " > ,% -. -0 = 2 )" - 8 (N ' 8 ,% -. % $0 !! 1 ? *! *) #2 % ( ) * T ,% -. U $ 1[A ) 1,% <QH 1 1) ! 3 3 1) A 3Z)1N3 1 ! 3 1N3 1N3 0 0% 0&#M9 Z 1N3 H 2*NNFFF " N" F ) "N 1 QH < 1! 1 N ! A )H 1N 1N,% 3 " '( )T 9! O 1 1 # & ! U H[3 "M H3 3 A3 2 ! 3< 1N! 3# A1N 3 1N) 3 A3 3 3 A 3Z)1N3 1) \ F 1 31! TZ U31 3Z 1N31N31N3 Z 3 2 8 3 2 8 6 : ") * " 4 6 5 ") * " 4@ 56 475 56 475 ] 1N3 4 !&! ; 4" ) ) 9! " :2 !) DZ E ) * 12 > ) " 34 # ! - !! " . @-=) ;! " < 0 ! " " ,G$) 4 5 6 *57 7 0! =)> " ) !' ) F " F " 4" ! :; ) " "2 )F " " A - 8 N '8 ,% -. " ! # & % ! & < 4" 9 $ ! ) " '( : ) B " BF " " " " " O 0$0-SG& #$?S# !) ) : " $2 == " ); )F F " *) " G$<0$0<-=^ )) > * . " : F " !) - T ,% -. U T 9! O 1 1 1[A ) 1,% <QH 1 1) ! 3 3 1) A 3Z)1N3 1 ! 3 1N3 1N3 0 0% 0&#M9 Z 1N3 H 2*NNFFF " N" F ) "N > 6% ) 1 QH < ! A )H ! U H[3 "M H3 3 A3 2 ! 3< 1N! 3# A1N 3 1! 1 N 4 1N 1N,% 3 1N) 3 A3 3 3 ; 56%475 4% \ F 1 31! TZ U31 3Z 1N31N31N3 Z \ F ] \ F ] ZQ 1! Z3 1 3Z 1N3 3Z 1N3 ] 1N3 4 !&! * 7 D? E9! 7 ? ! 0) < " )@ 4" P ) < ) ) : 4K" F ) " <G% -0! "* 1 3 ! F ! " )2 "; ) B : <0 S0&< & " ) * 12 ) " : 4" " " 34 / 4 5 6 " " K "1 0) ! 9) 9 F ! ,% -. " % > ) " D&E-BF " O 0$0-SG& #$?S# = ) " #9 ) P F " 4K " ! ) D E < ! ' !! ! : . ) 9 #! ) ! )* F " 4F ) K" ) ;! 4 !) 2 D -K EI ) " 0) & ! ! " ): F " " 9 R - " : > 0 F < ) 5 JF :F > - ) ! : : F " > ) *57 & ! " 4F " ! #9 3 ; : " ! K" )) ! ! )" )! 0) " < " - ) " ; F " ) F > 8 N '8 ,% -. $*) *( ) ) . / 1 $ T 9! O 1 1Z 3 1[A ) 1,% <QH 1 1) ! 3 1) A 3Z)1N3 1 ! 3 1N3 1N3 0 0% 0&#M9 Z 1N3 H 2*NNFFF " N" F ) "N 6 3 *+* 8 " "-!@ Z) N A )H4 1N 1N,% 3 ! U H[3 "M H3 ) ) A3 3 2 < 1 @23 1! 1 1N 1 % @ * % 3 1) A 3Z)1N3 1 @236 475 \ F 46 51! TZ U31 Z \ F ] \ F ] ! QH " '( - T ,% -. U 1 # & % ! 1N) 1N @23 3< 1N! 3 3# A1N 3 ) ) 3 ) ) 3 1) A 3,% "< ! 1 @23 1N @23 1! 3# A1N! 3 ) ) 3 A3 1N) A3 3Z 1N31N31N3 ZQ 1! Z3 1 3Z 1N3 3Z 1N3 ] 1N3 4 !&! , 7 9 " F F <' 5!' 7 9) ; " ; ;! ? F !) ! " "# ) % " " < ,% -. "" ) ! = 2 ) F " " )) 4" #9 2 ) " ) F " 4 " " 2 ) 9! " F " " 9 ! : ; " :! F " 0 " ": -# 0&-0 0- F " ! " ; :4 %> ) " !) 2 " :F 9 D " " " O 0$0#9 ,% - " @) F - E " )) - )) ) . @-=)> 2 )) ) . @-=)> : - 7 ) ) 7 0 F " :! 2 )) ) 9! ! ) * 12 " ! 4 F "" 34 " " 22 ) 4 5 6 : 9 *57 " ! " K " & ! ) ! " . @-=)> ) F " > < ) 8 N '8 ,% -. $2 = A= 1 . B * . ) ) +2 @) T 9! O 1 1Z 3 $ 1[A ) 1,% <QH 1 1) ! 3 1) A 3Z)1N3 1 ! 3 1N3 1N3 0 0% 0&#M9 Z 1N3 H 2*NNFFF " N" F ) "N Z \ 4 ] " "-!@ Z) ! ZQ 1! Z3 1 ! ) ) A3 3 2 1N) A3 ! ) : ! ) Y O IA% - J G 6 - ' 1N F 3 1! 3< 1N! 3 1 3# A1N 3 ) ) 3 ) ) 3 1) A 3,% "< ! 1N) 1 @23 1N @23 1 F 3< ! ! ) : ) Y G ( 66 1N F 3 1! 3# A1N! 3 ) ) 3 1N 1 1N 1N,% 3 U H[3 "M H3 A )H4 ) ) 3 1) A 3Z)1N3 1 @23Z 1N3 3 2 46 54! * .@ * % 56!475475 6 ") * " 4 2 *5 ** ) % C * .@ * % D6!475 8 \ F 1Z 31! TZ U31 3Z 1N31N31N3 Z \ F ] \ F ] QH < ! 1 @23 1N @23 1 F 3< N " '( - T ,% -. U 1 # & % A3 3Z 1N3 3Z 1N3 ] 1N3 4 !&! = 77 F ,% -. ! ! : #9 : " 2) A ) " ) %> ) 9 F 4 " 1 A2 A2 3 A2 ` 31 A2 R) - A2 a 0 ) * 12 " )) A2 ) ) : ) - " " : ; ! - ) & " 5& ! !) 4" ) " : G2 4 5 4 > Z` " " O " ) O " ! ) ! ` R ! " !! 34 2 ) ! : 4 5 6 " A2 -#9 #9 " 3 D;!) " 4 " F " ) = : ; ,% - ) A2 -#9 G2 = " " ; ) " ; 3 4 ) IJ 5 " ; ! 1 A2 O " * < F 9 7 = " _! ::F : 9 ) &! 9 ) 2 " ) G2 0 <' ! " 4F E ) " 2 ) #9 " - T5U *57 8 N '8 ,% -. . )) )) I! 2 ) F ) @ = )) < $2 0< J = A= +*> *" ))! " $ " ) F T 9! O 1 1`3 1[A ) 1,% <QH 1 1) ! 3 1) A 3Z)1N3 1 ! 3 1N3 1N3 0 0% 0&#M9 Z 1N3 H 2*NNFFF " N" F ) "N " "-!@ Z) ) ) 1) A 3Z)1N3 1 @23Z 1N3 \ F 1` 2 : Z 1 F ! ! ! : ) ) YZ21N3 ] \ F 1N 1N,% 3 \ F ] \ F ] ) A3 U 3 2 1N) A3 ! ) ! ) Y O IA% - J G 6 - ' 1N F 3 1! 3< 1N! 3 1 3# A1N 3 ) ) 3 ) ) 3 1) A 3,% "< ! 1N) 1 @23 1N @23 1 F 3< ! ! ) : ) Y G ( 66 1N F 3 1! 3# A1N! 3 ) ) 3 3Z21N3 TZ U31 ) : 1N 1 ) ! H[3 "M H3 A )H 3 3< 1` ! Z QH < ! 1 @23 1N @23 1 F 3< N " '( - T ,% -. U 1 # & % A3 3Z 1N31N3 ZQ 1! Z3 1 3Z 1N3 3Z 1N3 ] 1N3 4 !&! > < " < F "" ! : 0) ) : ! " " " 2 A2 < : )) " 2 2 ? A2 F " ) ! #! ! 0! F " ! ; <$ ! 4 = : " " )) )4" )) ! : ! ;) 9! " %> ) : 0 ; !) ! F 4 #9 " " 5 5 < D ) B ; -K 9 - E ! ! . " )) < )) :F ! ,% -< " 4" . ) : 9 ! " ! ,% -. ! : $ # $! < ) ) * 12 " 4 ) F " F " & ; ) 22 < - 34 4 5 6 # 2 ) ; " )) ! F ) @ "AB +@ "< @ 4! 2 ) F @ "AB " " )) ) *57 " ; ) ) @ )" < 4" " ; 9 @ ! )" ) ;! <$0 -O - " ! ;! < 9 C " ") )) " " 9 : ) 8 7N ' 8 ,% -. # & % " $ : " 9 " ) ! O : " F " ) 9 ! < 2) " #9 " ! 6 ) !! ? * % * * %% #2 % 9 T 9! \ F ! 31! <QZ!31 ! 772 2 2 =)) = ""7 )2 %) 7 1! 3Z 1N31N31N3 7 * )= ; %< <Q IZ J3 3Z 1N3 1 \ F 1 ! 31Z ! QZ!31) 1N31N3 < ! 772 2 2 =)) = ""7 )2 %) 7 7 * )= ; %<+ Z \ 4 ] 1Z <Q IZ 4Z J QH ) A 3Z 1N3 H3Z 1N3 ] 1N3 ] \ F 1 ! 31! <QZ!31 ! 772 2 2 =)) = ""7 )2 %) 7 < <$0 ,% - - T ,% -. U < 1! 3Z 1N31N31N3 7 * ) = ; %< <Q IZ J3 3Z 1N3 1 \ F " '( ; $0 1 $ 1 ! 31Z ! QZ!31) 1N31N3 < ! 772 2 2 =)) = ""7 )2 %) 7 7 * ) = ; %<+ Z \ 4 ] 1Z <Q IZ 4Z J QH ! U 1[A ) QH H[3 1,% <QH "M H3 1! <QH " H3 1 3< !1N 3 1 <QH " H QH ) H3 ? 1N 3 1N! 3 1! <QH " H3 1 3< 1N 3 1 <QH " 6H QH ) H3 2 < ! 1N 3 1N! 3 1! <QH " 7H3 1 3# A1N 3 1 <QH " 'H QH ) H3,% "< ! 1N 3 1 <QH " (H QH ) ))H3 2 < ! 1N 3 1N! 3 1! <QH " 5H3 1 3O : 1N 3 1 <QH " H QH ))H3% " " 1N 3 1N! 3 1N,% 3 A 3Z 1N3 ))H3Z 1N3 ] 1N3 ] 4 !&! )C 5 < ) ! ) ' )) : ) P) A ) / "$ " ! ) :) O 7S IT UJ ) /F " 2 22 / #9 2 > ) K: " 0) I ?% 49 " F " X S<9#9) : 4% &4% 9,4 J' SG& #$?S#-% / K @ : < #9 = B 4 R C : 4;! 2 ) " : ! " ) " 4 4 / 9 % ! - 2) O ) ) * 12 (!: 9 ; " ))4 " F "4 " ! ; " ,% -. @) " 0 ! " 9 ! ) ! 6 1 " " 34 4 5 6 ,% -. -0 *57 ! )) F " ; 4 " 2 : )- 8 5N ' 8 ,% -. $B E . % * 2 )" * # T 9! O ! ) " 1 1I 1N3 1N3 H 1 $ 1[A ) QH H[3 1,% <QH "M H3 1 " <QH " H3 1 3# $ "1N 1 F 3 1 ) <QH " H3 1 )) <QH " 6H3 1N F 3 1N " 3 1 " <QH " H3 1 3 :% 1N 1 F 3 1 ) <QH " 'H3 1 )) <QH " (H3 1N F 3 1N " 3 1 " <QH " 7H3 1 3< @ < 1N 3 1 F 3 1 ) <QH " H3 1 )) <QH " H3 1N F 3 1N " 3 1 " <QH " 5H3 1 3W "1N 1 F 3 1 ) <QH " H3 1 )) <QH " H3 1N F 3 1N " 3 1N,% 3 3 )QZ 3 3Z 1N3 _ J3Z 1N3 2*NNFFF " N" F ) "N N " ! ) A )H " <Q IZ J3 1 3Z 1N3 1 F 3 \ F 1 ! 31` QZ 34*2 *56*4751N31N3 H 2*NNFFF " N" F ) "N N ! A )H 1 ) <Q '6*,1N3 IZ 4 J36* ] \ F ! 31` QZ 34*2 *56*4751N31N3 2*NNFFF " N" F ) "N N )) M M ! A )H 1 H 1 ] 1N F 3 )) <Q '6*,1N3 IZ 4 J36* 1N3 4 !&! )) #! ! ! " '( - T ,% -. U 1 1 # & % ' ! U 3 51N ) 1N 3 ))3 3 1N ) 1N 3 ))3 1N ) 1N 3 ))3 3 1N ) 1N 3 ))3 $! G ,% - 2 : ) 0 < 9 F < ! . 0 < 1Y0&# #^ b D 4F ) & 4" F " # A ! " )) 4 <#< " F " 4 " : ) - ) E3 " )@ I J - 2 F ! F " & 2 ) F 1 3 ; ,% -= : 2 < ! ; : 4" 1N = ") 3 " 1 * 3 F ) * 12 " 2 < 2 : : 34 4 5 6 F ! 1N * 3 " *57 8 N '8 ,% -. % " )) # :0 ) F " > 2 " ;) " ) ) ; 4" 0 < " " ,% -. -< F " " )" " )) ) F < " F )) " . 1%% ) 1 A 3< F 3 1N) ;! ! 1) 1N F 3 A3 2 - %% TD :2 " '( <#< ! )" " 4 " 2) !) EU 1) $ !) O #9 " ) F " 4 X S<9#9-S 4" : " : ! ) & ) " = 2 ) : 4" F " > * TD # & % A 31S<9#93< 1NS<9#931 F 31S<9#93 1NS<9#931N) A3 :2 1NS<9#931N F EU 31S<9#93 ) F S< 9# 9 A S< 9# 9 < S<9#9 :2 ''! G !) ! O 0$0!) ) * 12 ! " ! " 34 4 F F "4F ) 4 5 6 9 F " *57 ! ) ) % R ? 2 )@ !) > )) 4" 8 6N ' 8 ,% -. # & % A $ " '( . ,% -. = 0A2 / " F 2 :F < )) " F !) # 2 9 :2 R :2 : 22 K " ) @ : A) P P : G 9!F 4,% -< ) 9 F " : % " )) ! ) " ) : ! 0 ) " ) " )) ! " ) ;)) ) F " : < ( " /" D0 9 F " E) ;! B " " % " : " # " " B ) > ) : ) 2) 7 @2 9) < / )! " 7 )) " : ) < " 2 )) ) 0 F ) :F %> ) F ,% -< >P : )) #-? ( )! 7 2 ) : 4 " / > ) F F " O 7S-< IT : T ? )" / )! " 9 7 7 " 7 ;! 4" " 9 ! ! K" " D "E-0 " 4F ) " D 7 4: ) " ) : B F ) " )" [ O " "= " UJF " " < " 2 4" B (N : ! = ; " " @ ) :F ) " 2 ) ! " 4F % ) " C " " - ) " 9 ! U 2 I# )J @2 2 !) : 4F ) !) " !) " = 2 )" C ! -B " : " ? ) ,% -R 2 : ) : - Y , 4, ) * 12 " 34 4 5 6 *57 8 'N ' 8 ,% -. / 9 % F E 5 ,% -. ,% -. **Q I _. # & $ " '( @J10G 3 **Q c?&S# G&c1 ?&- <3 c IcI1 9$3Ic *c1<#<3J[J̀ c JcIc *c1<#<3J[ . @ c 0&<c . @ **Q 0) 0) **Q # < ! <[9 **Q O S **Q c O 0$0cS S **Q G " " Ic \c. " @=) Ic 4cS " `c 3c = " c ]c J̀ J̀ "=@[c SG& #$?S#c . **Q **Q @ 9 ` c&c< # _ " ` 0 "# # **Q c 1c$ ) 0A2 **Q $ ) 0A2 c̀c_$ $ ) 0A2 cc$ ) 0A2 _ $ ) 0A2 c _c$ ) 0A2 _1 9$3 _1 <3 = " 9 ) 0A2 9 ! `c 3c ) 0A2 **Q 0A2 G2$ ) 0A2 0A2 **Q 1 9$3 _1SG& #9 G2$ ) **Q c 1c_c 1Qc_c 3c_c 3Qc_c Qc_c YQc "=@ < **Q c G$<0$0<-=^c1 9$3a **Q 1 9$3 _1?$ 3 _1 ?&- <3I< " c ac_ **Q c 0 0% 0&#M9 c1 9$3 _c SG�&#M9 c1 9$3 " G " ! **Q 1 <3 c Ic1 9$3 Ic 4c1 9$3J̀ c Jc O $ ) **Q 1 #$ & 3 @=) S @ 0 "# **Q c 1cN 1 <3[c 3c ) ) * 12 . @=) **Q 1 <3 c Qc Ic Hc1 #$ & 3 c Hc _ 1 9$3 J 0 "# . # ) _ 1 9$3 _. **Q c 1c I1 <3_1 9$3J ) 9 _ 34 4 5 6 *57 Ic 4c< J̀J 8 8 ,% -. / 9 5 % . # & $ " '( )) : T U 9 < 4% " :4< 2*NNFFF F7 T U 9 < 4% % " :4< 2 " :4W e 2*NNFFF-"! T5U W% @ 4 U G)" ) ! # " Nd " 49 !! ! N2 2 4 O ") * 5& ! ! ))-) ! N < ! 4 ! ' !' K! ! % @ * & T T T T ) * 12 - % S @4W R M/. 67N #! # 2*NNFFF T(U 9 % f)) 4% 7 2*NNFFF K U < U U F " * / !! 2*NNFFF ! ! * # 2*NN! )! @ :! !? . N ) & ! - $ ) ## N # -A ) ) #! N N " A " & '! ! )) " N 40 '( 2) NK N2 2 4 ) ! * ! N,2 < 2" * ! N " N F J ! " N ! +CCC N " 4W E F ! * ! 2*NNFFF NAC #! 1# ! # )>>>F+CCCL " Nd"! N) N < ;)) * E ' # 7J K ! ## # 2*NNFFF "! F T'U 5 #& N ) +CCC 2*NNFFF"! T6U @4< * G ! H) I NA )-C)-FFF( 2 * E ': J ! !? 2*NNFFF F N @ T 49 @4< * '# ! ! E0 )>FC=F)>>= N#$N&G#0-A )-C) 2*NNFFF T7U ) " N ! "N E ' J ! )NA )N " A ) !? N 6 N ) # N NM 77'7 22 )9FC*F+CCC -A ) 2" 9 < U ! 2 " Nd " 4& R) * $ O Gg$ ))@ # ! !) NA )C)-" N )N " A ) $ 0 " 34 4 5 6 *57 4 9 ) 4 =& 7-( ' - -6 8 8 ,% -. / 9 % = $ " '( 2 )" ! 772 2 2 =)) = ""7 )2 %) 7 7* % T ,% U = G T <#< U 1[A ) QH H[3 1Y<GS#^ 0 ! ) ^ #0% H 2*NNFFF " N" F ) "N N 1 ! ) 3 1 " )QH '(H3 1 3# $ "1N 3 1 3 '1N 3 1 3 6 1N 3 1 3 1N 3 1N " 3 1 " )QH5' H3 1 3 :% 1N 3 1 3 6 1N 3 1 3 1N 3 1 3 1N 3 1" 2) ! )QH ) < 1 ! 3 1N 1! 3 < # A1N! 1N" 2) ! 3 1N " 3 1 " )QH ( H3 1 3< @ < 1N 3 1 3 '1N 3 1" 2) ! )QHR 2 = ))F H3 1 ! 3O F 1N ! 1! 3 < ! < 1N" 2) ! 3 1N " 3 1 " )QH7777777H3 1 3W "1N 3 1" 2) ! )QH ) ) 1 ! 3 1N 1! 3 < < )< 1N" 2) ! 3 1N " 3 1N ! ) 3 P' ) * 12 # & " 34 4 5 6 " ! ) ! ! " "H3 : W 1Y0 0% 0&# ! ) I " `J3 1Y0 0% 0&# " I 4I _ _" 2) ! J̀J3 1Y9## # " ) < X$0.? $0<3 1Y0 0% 0&# IX S<9#9J3 1Y0 0% 0&# IX S<9#9J3 1Y0 0% 0&# IX S<9#9J3 1Y0 0% 0&# " 2) ! I ! 4! J3 1Y9## # " 2) ! ) S<9#9 X$0.? $0<3 1Y0 0% 0&# ! IX S<9#9J3 1Y0 0% 0&# ! IX S<9#9J3 H3 3 3 3 1N! O ! ! *57 3 2- H3 3 !1N! ) 4 !&! 3 1 ' 2 8 8 ,% -. / 9 % ! 772 2 2 =)) = ""7 )2 %) 7 7 * $ " '( )= G T ,% U T <#< U 1[A ) QH H[3 1Y<GS#^ 0 ! ^ #0% H 2*NNFFF " N" F ) "N N ! " "H3 1 ! 3 1 QH 'H ! QH" !H3 1) A 3? 1N) A3 1 ! 3O F 1N ! 3 1 F 3 1N F 3 1N 3 1 QH H! QH AH3 1) A 3,% "< ! 1N) A3 1 ! 3 1N ! 3 12 : ) 3 G ( 66 1N2 : ) 3 1 F 3 1N F 3 1N 3 1 QH 6 H ! QH" AH3 1) A3 2 < ! 1N) A3 1 ! 3 1N ! 3 12 : ) 3 O IA% - J G 6 - ' 1N2 : ) 3 1 F 3 1N F 3 1N 3 1! <QH AH3 1 )3 < 1N )31 3# A1N 3 1N! 3 1! <QH" H3 1 )3 1N )3 1 3< ! 1N 31 3< 1N 3 1N! 3 1! <QH" !H3 1 )3 < 1N )3 1 3< )1N 31 3< !1N 1N! 3 1N ! 3 P' ! + 4 !&! ! 772 2 2 =)) = ""7 )2 %) 1Y0 0% 0&# 1Y0 0% 0&# 2 : 1Y9## # 1Y9## # 1Y0 0% 0&# 2 : 1Y9## # 1Y0 0% 0&# ! 1Y9## # ! 1Y0 0% 0&# ) 1Y0 0% 0&# 1Y0 0% 0&# 2 1Y0 0% 0&# F 1Y0 0% 0&# 1Y0 0% 0&# 1Y0 0% 0&# II _ _! J̀J3 A4 ! 4 ) [4 F J3 ! <$0 X$0.? $0<3 S<9#9 X$0.? $0<3 I) A4 ! 4 ) [4 F J3 S<9#9 X$0.? $0<3 I )[4 [4 J3 " < X$0.? $0<3 A IX S<9#9J3 ! IX S<9#9J3 : ) IX S<9#9J3 IX S<9#9J3 ) IX S<9#9J3 IX S<9#9J3 IX S<9#9J3 3 1$ 7 ! I) 7@ ' 2 %% H H * )= G T ,% U T <#< U 1[A ) QH H[3 1Y<GS#^ 0 ! ^ #0% H 2*NNFFF " N" F ) "N N 1 ! 3 1 QH H! QHF : H3 1) A 3% " " 1 ! 3 ! "1N ! 1 F 3 1N F 3 1N 3 1 QH 6 H ! QH AH3 1) A3 2 < ! 1 ! 3 1N ! 3 12 : ) 35 O " W) 1N2 : ) 3 1 F 3 1N F 3 1N 3 1! <QH AH3 1 )3 < 1N )31 3# A1N 1N! 3 1! <QHF : H3 1 )3< 1N )31 3O : 1N 3 1N! 3 1N ! 3 P' ) * 12 # & " 34 4 5 6 ! ! 1N) 3 A3 1N) A3 ! II _ _! J̀J3 A4 ! 4 ) [4 F J3 ! <$0 X$0.? $0<3 S<9#9 X$0.? $0<3 I) A4 ! 4 ) [4 F J3 S<9#9 X$0.? $0<3 I )[4 [4 J3 " < X$0.? $0<3 A IX S<9#9J3 ! IX S<9#9J3 : ) IX S<9#9J3 IX S<9#9J3 ) IX S<9#9J3 IX S<9#9J3 IX S<9#9J3 8 !8$ ' 2 I) 3 0 4 !&! *57 " "H3 1Y0 0% 0&# 1Y0 0% 0&# 2 : 1Y9## # 1Y9## # 1Y0 0% 0&# 2 : 1Y9## # 1Y0 0% 0&# ! 1Y9## # ! 1Y0 0% 0&# ) 1Y0 0% 0&# 1Y0 0% 0&# 2 1Y0 0% 0&# F 1Y0 0% 0&# 1Y0 0% 0&# 1Y0 0% 0&# 1! 8 8 Seminar 1912 XML und Datenbanken Thema 7: Anfragesprachen für XML - Quilt, XQuery Quilt D. D. Chamberlin, J. Robie und D. Florescu. Quilt: An XML Query Language for Heterogeneous Data Sources. WebDB (Informal Proceedings), 53 - 62, 2000, http://www-rodin.inria.fr/Fmbrepubs_dana.html XQuery S. Boag, D. Chamberlin, M. F. Fernandez, D. Florescu, J. Robie, J. Siméon und M. Stefanescu. XQuery 1.0: An XML Query Language. W3C Working Draft, 2001, http://www.w3.org/TR/xquery/ Martina Welt Acherstr. 9 76337 Waldbronn e-mail: martina_welt@web.de Matrikelnummer: 3727750 Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 2 Inhaltsverzeichnis 1. ÜBERBLICK 3 2. EINFÜHRUNG 5 3. DIE ANFRAGESPRACHE QUILT 6 3.1 Anforderungen und Ziele beim Entwurf 6 3.2 Die Vorgehensweise beim Entwurf 6 3.3 Die Ein-/Ausgabestruktur in Quilt 7 3.4 Ausdrücke in Quilt 7 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.6 3.4.7 3.4.8 3.5 3.5.1 3.5.2 3.5.3 3.6 7 8 9 11 13 13 14 14 Datenbankanfragen 15 Grouping Joins Views 15 15 15 Zusammenfassung und Bewertung 3.6.1 3.6.2 4. Pfad-Ausdrücke Elementkonstruktoren FLWR-Ausdrücke Ausdrücke, die Operatoren und Funktionen beinhalten Bedingte Ausdrücke Funktionen Quantoren Ausdrücke zum Binden von Variablen Zusammenfassung Bewertung DIE ANFRAGESPRACHE XQUERY 16 16 17 18 4.1 Anforderungen und Ziele beim Entwurf 18 4.2 Die Vorgehensweise beim Entwurf 18 4.3 Die Ein-/Ausgabestruktur von XQuery 1.0 19 4.4 Ausdrücke in XQuery 1.0 19 4.4.1 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9 Primäre Ausdrücke Pfad-Ausdrücke Konstruktoren FLWR-Ausdrücke Sortierungsausdrücke Ausdrücke, die Operatoren und Funktionen beinhalten Bedingte Ausdrücke Funktionen Quantoren 20 20 21 22 22 22 23 23 24 4.5 Datenbankanfragen 24 4.6 Query Prolog 24 4.7 Zusammenfassung und Bewertung 24 4.7.1 4.7.2 5. Zusammenfassung Bewertung QUELLENANGABEN 24 25 26 Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 3 1. Überblick Im folgenden Beitrag geht es um die Bearbeitung von XML-Dokumenten mit den Anfragesprachen Quilt und XQuery. Für beide Sprachen werden jeweils nach einer kurzen Einführung die Anforderungen und Ziele vorgestellt, die beim Entwurf gesetzt wurden. Anschließend wird als Schwerpunkt des Beitrags die jeweilige Sprache vorgestellt und ihre Besonderheiten hervorgehoben. Danach folgt eine kurze Zusammenfassung und Bewertung. Den Abschluss bildet ein Vergleich der beiden Anfragesprachen. Die nachfolgende Graphik verdeutlicht die Entstehung der beiden Anfragesprachen und die Zusammenhänge mit anderen Anfragesprachen, die teilweise in vorhergegangenen Beitragen vorgestellt wurden. Die Gemeinsamkeiten der Sprachen werden später bei der Vorstellung von Quilt und XQuery genauer beschrieben. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 4 Die Entstehung von Quilt und XQuery 1.0 XML-QL XQL SQL XPATH 1.0 OQL QUILT Lorel XQuery 1.0 XPath 2.0 (Untermenge) Einfluss Übernahme von Features YATL Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 5 2. Einführung Das World Wide Web ermöglicht die sofortige, weltweite Bereitstellung aller Arten von Informationen. Dafür müssen jedoch zwei Kommunikationsmechanismen vorhanden sein: 1. Eine universelle Darstellungsprache. 2. Eine universelle Anfragesprache. Der erste Mechanismus wird von XML erfüllt. XML arbeitet mit strukturierten und semi-strukturierten Dokumenten, relationalen Datenbanken und Objektbehältern. Der zweite Mechanismus wird beispielsweise durch die Anfragesprache Quilt erfüllt. Dies erreicht man zum einen dadurch, dass Quilt die Stärken kombiniert, die andere Anfragesprachen in unterschiedlichen Bereichen haben. Zum anderen wurde Quilt so konzipiert, dass Informationen aus verschiedenen Datenquellen zu einem Anfrageergebnis mit einer eigenen Struktur zusammengefügt werden können. Ein weiterer Ansatz für den zweiten Mechanismus ist die Anfragesprache XQuery 1.0. Sie baut auf der Anfragesprache Quilt auf und schließt die Sprache XPath 2.0 als Untermenge ein. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 6 3. Die Anfragesprache Quilt 3.1 Anforderungen und Ziele beim Entwurf Die W3C XML Query Working Group ist eine Arbeitsgruppe, die sich damit befasst hat, welche Anforderungen denn nun an eine solche universelle Anfragesprache zu stellen sind. Für eine universelle Anfragesprache hat diese Arbeitsgruppe folgende Anforderungen formuliert: • • • • • Sie muss so flexibel sein wie XML. Sie muss in der Lage sein, eine gegebene Ordnung und Hierarchie zu erhalten. Für Datenbankanfragen muss sie bekannte Datenbankoperationen wie z. B. JOINS und GROUPING zur Verfügung stellen. Sie muss alle in XML vorhandenen Strukturen von Informationen behandeln können. Und sie muss in der Lage, sein die Informationen von einer Struktur in eine andere zu transformieren. Don Chamberlin von IBM, Jonathan Robie von der Software AG und Daniela Florescu von INRIA haben die Aufgabe angenommen, die Anfragesprache Quilt zu entwerfen. Folgende Ziele wurden von der Gruppe festgelegt: • • • Quilt soll eine kleine Sprache sein, die den Anforderungen der W3C XML Query Working Group gerecht wird. Vorerst soll sie entworfen werden und kann dann später basierend auf dem Entwurf implementiert werden. Die Anfragen sollen kurz, aber lesbar sein. Quilt soll flexibel genug sein, um ein breites Spektrum von XML-Informationsquellen bearbeiten zu können. 3.2 Die Vorgehensweise beim Entwurf Beim Entwurf der Anfragesprache Quilt wurden folgende Features verschiedener anderer Sprachen, die ihre Stärken in unterschiedlichen Bereichen haben, übernommen: Anfragesprache XPath 1.0, XQL XML-QL SQL OQL, SQL Feature Syntax zum Navigieren in hierarchischen Dokumenten Binden von Variablen und das Nutzen der gebundenen Variablen, um neue Strukturen zu erstellen Syntax die ein Muster für neu strukturierte Daten bereitstellt (Das SELECT-FROM-WHERE-Muster in SQL) Funktionale Sprache, die aus verschiedenen Arten von Ausdrücken zusammengesetzt ist, die beliebig geschachtelt werden können. (Subqueries) Des weiteren hatten die Anfragesprachen Lorel und YATL einen gewissen Einfluß bei der Entstehung von Quilt. Der Name Quilt spielt dabei auf die Eigenschaft an, wie bei einem Patchwork Features verschiedener anderer Sprachen zusammenzufügen. Daneben verdeutlicht er auch das Ziel, Informationen aus mehreren verschiedenartigen Quellen zusammenzusetzen. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 3.3 Seite 7 Die Ein-/Ausgabestruktur in Quilt Quilt ist in der Lage, eigenständige XML-Dokumente, Fragmente von XML-Dokumenten oder Ansammlungen von XML-Dokumenten als Ein- und Ausgabe zu behandeln. Quilt basiert auf dem XML-Query-Datenmodell, das in [3] beschrieben wird. Dort wird ein Dokument als ein Baum aus Knoten dargestellt. Ein Fragment eines Dokuments oder eine Ansammlung von Dokumenten besitzt keine gemeinsame Wurzel und kann als geordneter Wald von Knoten verschiedener Typen (Elementknoten, Attributknoten, Textknoten) dargestellt werden. 3.4 Ausdrücke in Quilt Quilt definiert folgende Arten von Ausdrücken: • • • • • • • • Pfad-Ausdrücke Elementkonstruktoren FLWR-Ausdrücke Ausdrücke, die Operatoren und Funktionen beinhalten Bedingte Ausdrücke Funktionen Quantoren Ausdrücke zum Binden von Variablen Nachfolgend wird mehr oder weniger detailliert auf die verschiedenen Ausdrücke eingegangen. 3.4.1 Pfad-Ausdrücke Die Pfad-Ausdrücke in Quilt basieren auf einer abgekürzten Syntax von XPath. Wie bei XPath besteht ein Pfad-Ausdruck aus mehreren "Schritten". Jeder Schritt stellt eine Bewegung durch das Dokument in eine bestimmte Richtung dar. In jedem Schritt kann eine Bedingung Knoten ausfiltern. Jeder Schritt hat als Ergebnis eine Menge von Knoten, die als Eingabe für den nächsten Schritt dienen. Nach dem letzten Schritt erhält man als Ergebnis einen geordneten Wald aller Knoten, die den Pfad-Ausdruck erfüllen sowie deren Nachfolger. Ein Pfad-Ausdruck kann entweder mit einem Ausdruck beginnen, der einen bestimmten Knoten spezifiziert, so liefert beispielsweise die Funktion document(string) den Wurzelknoten des im Eingabeparameter spezifizierten Dokuments. Oder der Pfad-Ausdruck kann mit den Zeichen "/" oder "//" beginnen, was einen durch die Umgebung festgelegten Wurzelknoten darstellt. Hier sind einige der Symbole der abgekürzten Syntax: . .. / // @ * [] [n] aktueller Knoten Vorgänger des aktuellen Knotens Wurzelknoten (z. B. /C) oder Kinder des aktuellen Knotens (z. B. document("schloesser.xml")/Kapitel) Nachfolger des aktuellen Knotens (Abschluss von /); // ist eine Abkürzung für /aktueller Knoten oder beliebig geschachtelter Nachfolger davon/ (z. B. document("schloesser.xml")/Kapitel[5]//Abbildung) Attribut des aktuellen Knotens "any" (Knoten mit beliebigem Namen) schließen einen logischen Ausdruck ein, der als Bedingung für einen gegebenen Schritt dient wählt das n-te Element einer Liste aus Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 8 Beispiel: Finde die Abbildung mit der Unterschrift "Heidelberger Schloss" im 5. Kapitel des Dokuments "schloesser.xml": document("schloesser.xml")/Kapitel[5]//Abbildung[Unterschrift = "Heidelberger Schloss"] Zur Auswahl einer Menge von Elementen, deren Ordinalzahlen in einem gewissen Bereich liegen, hat Quilt von XQL das RANGE-Prädikat übernommen. Beispiel: Finde alle Abbildungen in den Kapiteln 2 bis 5 des Dokuments "schloesser.xml": document("schloesser.xml")/Kapitel[RANGE 2 TO 5]//Abbildung Quilt erweitert die Operatoren von XPath um einen Dereferenzierungsoperator, der durch die Zeichen "->" dargestellt wird. Dieser Operator kann in den verschiedenen Schritten eines PfadAusdrucks vorkommen. Folgt ein Dereferenzierungsoperator einem Attribut vom Typ IDREF oder einem Schlüssel, so gibt er das oder die Elemente wieder, die durch das Attribut oder den Schlüssel referenziert werden. Der Dereferenzierungsoperator ist in seiner Wirkung der id-Funktion von XPath recht ähnlich (siehe dazu den Seminarbeitrag zum Thema XPath). Die Schreibweise ist allerdings leichter zu lesen, insbesondere bei Ausdrücken mit mehreren derartigen Operatoren. Beispiel: Finde Unterschriften von Abbildungen, die durch <figref>-Elemente im Kapitel mit dem Titel "BadenWürttemberg" des Dokuments "schloesser.xml" referenziert werden: document("schloesser.xml")/Kapitel[Titel = "Baden-Württemberg"]//figref/@refid->/Unterschrift Wie bei XPath können die bei Quilt verwendeten Bezeichner in Ausdrücken durch Namensraum-Präfixe qualifiziert werden. Quilt stellt dafür eine Syntax zum Deklarieren des Universal Resource Identifiers (URI) zur Verfügung. Beispiel: Finde alle <Museum>-Elemente im abc-Namensraum, die jedes beliebige Subelement des xyz-Namensraums enthalten: NAMESPACE b1 = "www.abc.com/namen" NAMESPACE b2 = "www.xyz.com/namen" document("schloesser.xml")//abc:Museum[xyz:*] 3.4.2 Elementkonstruktoren Ein Elementkonstruktor erzeugt einen Knoten vom Typ Element. Ähnliche Konstruktoren gibt es für andere Knotentypen wie Kommentare oder Abarbeitungsanweisungen ("processing instructions"). Ein Elementkonstruktor besteht aus einem Start- und einem End-Tag, die denselben Namen haben müssen. Dieser Name wird entweder durch eine Konstante oder eine Variable festgelegt. Der Start-Tag kann Werte für ein oder mehrere Attribute festlegen. Zwischen Start- und End-Tag legt eine Liste von Ausdrücken den Inhalt des Elements fest. Obwohl ein Elementkonstruktor ein eigenständiger Ausdruck ist, wird er typischerweise in anderen Ausdrücken verwendet. Beispielsweise in einem FLWR-Ausdruck, in dem eine oder mehrere Variablen gebunden werden, die dann im Elementkonstruktor verwendet werden. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 9 Beispiel: <Mitarbeiter Personalnummer = $pid> <Name> $name </Name> <Gehaltsgruppe> $gg </Gehaltsgruppe> </Mitarbeiter> 3.4.3 FLWR-Ausdrücke Ein FLWR-Ausdruck setzt sich aus FOR-, LET-, WHERE- und RETURN-Anweisungen zusammen, die in einer bestimmten Reihenfolge vorkommen müssen. Die Idee wurde vom SELECTFROM-WHERE-Ausdruck in SQL übernommen. Ein FLWR-Ausdruck wird für Iterationen über Mengen von Elementen verwendet. Ein FLWR-Ausdruck bindet anfangs Werte an eine oder mehrere Variablen. Diese werden anschließend zur Ermittlung des Ergebnisses verwendet. Das Ergebnis eines FLWR-Ausdrucks kann ein Knoten, ein geordneter Wald von Knoten oder ein primitiver Wert sein. Ein FLWR-Ausdruck bindet zunächst mit einem FOR-Satz Werte an eine oder mehrere Variablen. Der FOR-Satz kann von einem oder mehreren LET-Sätzen und zusätzlichen FOR-Sätzen gefolgt werden, die weitere Variablen binden. Der WHERE-Satz enthält Bedingungen, die durch AND, OR und NOT verknüpft sind und oftmals Referenzen auf gebundene Variablen enthalten. Der RETURN-Satz erstellt die Ausgabe des FLWR-Ausdrucks. Jede in einem FOR-Satz eingeführte Variable tritt in Verbindung mit einem Ausdruck auf. Im allgemeinen liefert jeder dieser Ausdrücke eine Knotenliste. Das Ergebnis eines FOR-Satzes ist jedoch eine Tupelliste, bei der jedes Tupel an alle Variablen gebunden ist. Die Tupelliste ist das kartesische Produkt der Knotenlisten, die man als Ergebnis der Ausdrücke des FOR-Satzes erhält. Ist nur ein FOR-Satz mit einer in einem Ausdruck gebundenen Variablen vorhanden, dann ist das kartesische Produkt gleich der Knotenliste des Ausdrucks. Beispiel: FOR-Satz mit nur einer gebundenen Variablen: for $x in (<eins/>, <zwei/>, <drei/>) return <Ausgabe> $x </Ausgabe> In diesem Beispiel wird die Variable $x dreimal gebunden, zuerst an den Wert <eins/>, dann an den Wert <zwei/> und zuletzt an den Wert <drei/>. Für jede Bindung der Variablen wird ein Tupel erzeugt und für jedes erzeugte Tupel wird der RETURN-Satz aufgerufen, so dass die Ausgabe folgendermaßen aussieht: <Ausgabe> <eins/> </Ausgabe> <Ausgabe> <zwei/> </Ausgabe> <Ausgabe> <drei/> </Ausgabe> Beispiel: FOR-Satz mit mehreren gebundenen Variablen: for $i in (1, 2), $j in (3, 4) return <Tupel> <i> $i </i> <j> $j </j> Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 10 </Tupel> Dieses Beispiel zeigt wie die Tupel als Kartesisches Produkt der Knotenlisten gebildet werden, die wiederum als Ergebnisse aus den ausgewerteten Ausdrücken hervorgehen: <Tupel> <i>1</i> <j>3</j> </Tupel> <Tupel> <i>1</i> <j>4</j> </Tupel> <Tupel> <i>2</i> <j>3</j> </Tupel> <Tupel> <i>2</i> <j>4</j> </Tupel> LET-Sätze binden Variablen anders als FOR-Sätze. Ein LET-Satz bindet einfach eine oder mehrere Variablen an des Ergebnis von einem oder mehreren Ausdrücken. Prinzipiell gibt es folgende Unterschiede zwischen FOR- und LET-Sätzen: FOR-Satz Erzeugt aufgrund der Iteration über Knotenlisten viele Bindungen für eine Variable. Jede Variable wird an einen einzelnen Knoten (mit seinen Nachfolgern) gebunden. LET-Satz Erzeugt genau eine Bindung für jede Variable. Jede Variable wird an einen Wald von Knoten gebunden. Beispiel: LET-Satz mit einer gebundenen Variablen: let $x := (<eins/>, <zwei/>, <drei/>) return <Ausgabe> $x </Ausgabe> Die Variable $x wird direkt an den Ausdruck (<eins/>, <zwei/>, <drei/>) gebunden und der RETURN-Satz aufgerufen, so dass die Ausgabe folgendermaßen aussieht: <Ausgabe> <eins/> <zwei/> <drei/> </Ausgabe> Ein FLWR-Ausdruck kann mehrere FOR- und LET-Sätze enthalten und jeder von diesen Sätzen kann Referenzen auf Variablen enthalten, die in früheren Sätzen entstanden sind. Das Ergebnis einer Folge von FOR- und LET-Sätzen ist eine geordnete Liste von Tupeln gebundener Variablen. Die Anzahl dieser Tupel ist gleich dem Produkt der Kardinalität der Knotenlisten, die Ergebnis der Ausdrücke in den FOR-Sätzen sind. Diese Tupel sind wie die gebundenen Variablen geordnet, es sei denn es wurde ein ungeordneter Ausdruck verwendet wie beispielsweise ein Ausdruck der die distinct-Funktion enthält. Jedes der erhaltenen Tupel kann durch einen optionalen WHERE-Satz ausgefiltert werden. Nur für die Tupel, für die der WHERE-Satz wahr ist, wird ein RETURN-Satz erzeugt. Ein WHERESatz kann mehrere Bedingungen enthalten, die durch AND, OR und NOT verknüpft sind und oftmals Referenzen auf gebundene Variablen beinhalten. Variablen, die von einem FOR-Satz gebunden wurden, stellen einzelne Knoten mit ihren Nachfolgern dar und werden deshalb typi- Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 11 scherweise in skalaren Bedingungen wie $x/Farbe = "rot" verwendet. Variablen, die von einem LET-Satz gebunden wurden, liefern hingegen eine Menge von Knoten und können in mengenorientierten Bedingungen wie z. B. avg($x/Preis) > 100 verwendet werden. Die Reihenfolge der Tupel wird beim WHERE-Satz erhalten. Für jedes von einem FOR- oder LET-Satz erzeugte Tupel, das die Bedingungen des WHERESatzes erfüllt, wird auch genau ein RETURN-Satz erzeugt. Die Reihenfolge der Tupel wird im Ausgabedokument festgehalten. Der RETURN-Satz enthält einen Ausdruck, der aus Elementkonstruktoren, Referenzen auf gebundene Variablen und verschachtelten Unterausdrücken besteht. FLWR-Ausdrücke können für strukturelle Änderungen an Dokumenten verwendet werden beispielsweise um eine Hierarchie zu invertieren (Autor-Buch-Liste -> Buch-Autor-Liste). Ein ergänzender SORTBY-Befehl kann die Ergebniselemente sortieren. Hierbei ist die Angabe ASCENDING (aufsteigend) und DESCENDING (absteigend) möglich. Als default-Wert wird ASCENDING angenommen. FLWR-Ausdrücke werden bei Datenbankanfragen für das Zusammenführen von Werten aus mehreren Dokumenten verwendet. Datenbankanfragen werden weiter hinten beschrieben. 3.4.4 Ausdrücke, die Operatoren und Funktionen beinhalten Auch bei Quilt gibt es Infix- und Präfix-Operatoren, Schachtelungen von geklammerten Ausdrücken, die üblichen arithmetischen und logischen Operatoren sowie die Mengenoperatoren UNION (Vereinigungsmenge), INTERSECT (Schnittmenge) und EXCEPT (Differenzmenge). Von XQL hat Quilt die Infix-Operatoren BEFORE und AFTER geerbt. Sie unterstützen die Suche von Informationen nach ihrer Position in der Ordnung des Dokuments. BEFORE arbeitet mit zwei Mengen von Elementen und liefert die Elemente der ersten Menge, die vor mindestens einem Element der zweiten Menge vorkommen. AFTER arbeitet ebenfalls mit zwei Mengen von Elementen und liefert die Elemente der ersten Menge, die nach mindestens einem Element der zweiten Menge vorkommen. Der Vergleich ist in beiden Fällen nur möglich, wenn beide Mengen Untermengen derselben Instanz des Datenmodells sind. BEFORE und AFTER basieren auf der globalen Ordnung des Dokuments, deshalb können sie die Position von Elementen vergleichen, die nicht dieselben Eltern haben. Beispiel: Es wird ein Auszug aus einem Buch erstellt, der aus allen Elementen mit beliebigem Namen (deshalb //*) besteht, die zwischen dem dritten und dem sechsten Abschnitt im siebten Kaptiel erscheinen. Dabei sind die Elemente Nachfolger des Knotens Kapitel[7] und können an beliebiger Stelle unter dem Knoten Kapitel[7] stehen, müssen also nicht direkte Nachfolger (Kinder) sein. Die shallow-Funktion liefert ein Element ohne seine Unterelemente. <Auszug> FOR $k in //Kapitel[7] $e in //* AFTER ($k//Abchnitt) [3] BEFORE ($k//Abchnitt) [6] RETURN shallow ($e) </Auszug> Ein weiterer wichtiger Operator in Quilt ist der FILTER-Operator. FILTER verwendet zwei Operanden, wobei jeder von ihnen ein Ausdruck ist, der in der Regel zu einem geordneten Knotenwald ausgewertet wird. Der erste Ausdruck liefert also einen geordneten Knotenwald. Der zweite Ausdruck filtert die gewünschten Teilstücke aus diesem Knotenwald aus. Ausgefiltert werden Knoten, die in einer beliebigen Ebene des ersten Operanden auftreten und gleichzeitig "top-level"-Knoten des zweiten Operanden sind. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 12 Die nachfolgenden Bilder verdeutlichen die Wirkung des FILTER-Ausdrucks. Das erste Bild ist das Ergebnis des Pfad-Ausdrucks /C. Das zweite Bild ist Ergebnis des FILTER-Ausdrucks /C FILTER //A | //B. Ergebnis von /C: Es werden alle Wurzelknoten C einschließlich Nachfolgern ausgewählt. C B C C B A B A C C A A B B Ergebnis von /C FILTER //A | //B: Aus dem geordneten Knotenwald des Pfad-Ausdrucks /C werden nun die "top-level"-Knoten A und B ausgewählt. Der grau unterlegte Knoten C ist zwar "top-level"-Knoten, entspricht aber nicht dem Filterkriterium des zweiten Operanden und wird somit gestrichen. B A A B B B A A B Es kann passieren, dass der FILTER-Operator eine Knotenhierarchie in mehrere Knotenhierarchien aufteilt. Der hierarchische und sequentielle Zusammenhang der Knoten wird jedoch stets erhalten. Der Filterprozess basiert auf der Knotenidentität, d. h. beide Operanden sind erforderlich, um denselben Knoten zu erhalten und nicht nur zwei Knoten mit demselben Wert. Folglich ist die Ergebnismenge des FILTER-Ausdrucks leer, wenn die beiden Operanden keine gemeinsame Wurzel haben. Der FILTER-Operator eignet sich also sehr gut dafür, bei einem Dokument bestimmte gewünschte Teile zu extrahieren und die ungewünschten Teile zu streichen, wobei die Dokumentstruktur erhalten bleibt. Beispielsweise kann mit Hilfe des FILTER-Operators ein Inhaltsverzeichnis zu einem Buch erstellt werden. Beispiel: Es wird ein Inhaltsverzeichnis zum Dokument "seminararbeit.xml" erzeugt, das mehrere Ebenen geschachtelter Abschnitte beinhaltet. Die Anfrage filtert das Dokument so, dass nur Abschnitt-Element und Überschrift-Element, die sich direkt unter Abschnitt-Elementen befinden, aufgelistet werden. Andere Elemente wie Absätze oder Unterschriften von Bildern werden weggelassen. <Inhaltsverzeichnis> document("seminararbeit.xml") FILTER //Abschnitt | //Abschnitt/Überschrift </Inhaltsverzeichnis> Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 3.4.5 Seite 13 Bedingte Ausdrücke Quilt verfügt über den üblichen bedingten Ausdruck IF-THEN-ELSE. Bedingte Ausdrücke sind dann hilfreich, wenn die Struktur der zurückzugebenden Information von einigen Bedingungen abhängt. Wie alle Ausdrücke in Quilt, können auch bedingte Ausdrücke geschachtelt werden. Beispiel: FOR $b in //Beiträge RETURN <Beitrag> $b/Titel, IF $b/@Typ = "Zeitung" THEN $b/Verfasser ELSE $b/Autor </Beitrag> SORTBY (Titel) 3.4.6 Funktionen Quilt stellt eine Bibliothek mit Funktionen zur Verfügung. Diese enthält alle Funktionen der Funktionenbibliothek des XPath-Kerns, alle Aggregationsfunktionen von SQL (wie avg, sum, count, max und min) sowie zahlreiche andere hilfreiche Funktionen (wie distinct(collection), empty(collection) und name(element)). Zusätzlich zu diesen Funktionen kann der Benutzer von Quilt eigene Funktionen definieren. Eine Funktion kann rekursiv definiert sein, jedoch muss der Benutzer selbst dafür sorgen, dass die Funktion terminiert. Beispiel: Diese rekursive Funktion berechnet die maximale Tiefe des Dokuments "wegenetz.xml": FUNCTION depth ($e ELEMENT) RETURNS integer { -- Ein leeres Element hat die Tiefe 1, -- ansonsten addiere 1 zur max. Tiefe der Nachfolger IF empty($e/*) THEN 1 ELSE max(depth($e/*)) + 1 } depth(document("wegenetz.xml")) Eine Quilt-Anfrage besteht meistens aus einer Menge von Funktionsdefinitionen gefolgt von einem Ausdruck, der diese Funktionen verwendet. Die Sichtbarkeit einer selbstdefinierten Funktion ist eingeschränkt auf die Anfrage, in der sie definiert wurde. Jede Funktionsdefinition muss die Typen ihrer Parameter und Ergebnisse deklarieren. Erwartet eine Funktion ein skalares Argument und bekommt statt dessen eine Menge, so liefert sie eine Menge zurück, bei der jedes Element das Ergebnis der Anwendung der Funktion auf eines der Elemente der Eingabemenge ist. Gegenstand weiterer Untersuchungen sind • zum einen ein Erweiterungsmechanismus, durch den Funktionsdefinitionen mit globaler Sichtbarkeit - geschrieben in unterschiedlichen Programmiersprachen - zur Quilt-Funktionenbibliothek hinzugefügt werden können; • zum anderen ein Mechanismus, der den Benutzer beim Verhindern von Endlosschleifen bei rekursiven Funktionen unterstützt Quantoren. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 3.4.7 Seite 14 Quantoren Für manche Anwendungen sind Ausdrücke nötig, die feststellen, ob ein Element existiert oder ob alle Elemente einer bestimmten Kategorie einer Bedingung genügen. Hierfür stellt QUILT den existentiellen Quantor SOME sowie den universellen Quantor EVERY zur Verfügung. Die nachfolgenden Beispiele illustrieren die Wirkungsweise dieser Operatoren: Beispiel: Finde alle Buchtitel, bei denen im gleichen Absatz "Segeln" oder "Windsurfen" vorkommt: FOR $b in //Buch WHERE SOME $p in $b/Absatz SATISFIES contains ($p, "Segeln") AND contains ($p, "Windsurfen") RETURN $b/Titel Beispiel: Finde alle Buchtitel, bei denen in jedem Absatz "Segeln" vorkommt: FOR $b in //Buch WHERE EVERY $p in $b/Absatz SATISFIES contains ($p, "Segeln") RETURN $b/Titel 3.4.8 Ausdrücke zum Binden von Variablen Zur Vereinfachung von Anfragen, die dieselben Ausdrücke an mehreren Stellen nutzen, bietet Quilt die Bindung eines Ausdrucks an eine Variable an. Das Binden ähnelt dem LET-Satz eines FLWR-Ausdrucks. Eine gebundene Variable kann außerhalb eines FLWR-Ausdrucks benutzt werden, wenn sie von dem Wort EVAL gefolgt wird. Eine gebundene Variable kann beispielsweise in Verbindung mit einem Elementkonstruktor eingesetzt werden, um Teile eines existierenden Elements zu kopieren. Beispiel: Zuvor wurde die Variable $e an ein Element mit numerischem Inhalt gebunden. Es wird ein neues Element konstruiert mit demselben Namen und denselben Attributen wie das Element $e und mit dem doppelten numerischen Inhalt wie beim Element $e. Im Beispiel sind name(element) und number(element) Funktionen der Quilt-Kernbibliothek. name(element) liefert den Namen des Elements und number(element) den numerischen Inhalt des Elements. LET $tagname := name($e) EVAL <$tagname> $e/@*, -- Übernahme der Attribute vom Element $e 2 * number($e) </$tagname> Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 3.5 Seite 15 Datenbankanfragen In vielen Fällen können SQL-Anfragen direkt in Quilt-Anfragen übersetzt werden, indem SQLAnfrageblöcke auf FLWR-Ausdrücke abgebildet werden. Beispiel: Eine Tabelle Produkt mit Produktnummer und Beschreibung einer relationalen Datenbank kann beispielsweise in XML durch <Produkt> <Produkttupel> <Produktnummer> <Beschreibung> dargestellt werden. Alle Produktnummern von Zylindern werden dann mit folgender Anfrage gefunden: SQL: Quilt: SELECT Produktnummer FROM Produkt WHERE Beschreibung LIKE 'Zylinder' ORDER BY Produktnummer; FOR $p IN document("Produkt.xml")//Produkttupel WHERE contains ($p/Beschreibung, "Zylinder") RETURN $p/Produktnummer SORTBY (.) -- Sortierung nach dem aktuellen Knoten 3.5.1 Grouping Viele relationale Datenbankanfragen gruppieren Daten und wenden Aggregationsfunktionen auf diese Gruppen an. In SQL wird das durch die Verwendung von GROUP-BY- und HAVING-Zusätzen erreicht. Die Aufgabe des HAVING-Satzes in SQL wird in Quilt durch einen geeigneten WHERE-Satz übernommen. Das Gruppieren wird in Quilt durch einen Elementkonstruktor im RETURN-Satz des FLWR-Ausdrucks erreicht. Der Wert des so erzeugten Elements definiert die Gruppierung. 3.5.2 Joins Bei Joins unterscheidet man zwischen "inner join" und "outer join". Ein "inner join" liefert nur Informationen, die in allen Tabellen vorkommen, die beim Join beteiligt sind. Ein "outer join" hingegen liefert Informationen von einer oder mehreren der beteiligten Tabellen, einschließlich der Zeilen, die keine entsprechende Zeile in der verknüpften Tabelle haben. Anstelle der fehlenden Teile werden vom relationalen Datenbanksystem Werte zurückgegeben, die in XML durch leere Elemente oder das Fehlen der Elemente dargestellt werden können. Quilt kennt auch einen UNION-Operator, der dem UNION-Operator in SQL entspricht. 3.5.3 Views Mit Quilt können strukturierte XML-Views auf die Tabellen der relationalen Datenbank erstellt werden. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 3.6 3.6.1 Seite 16 Zusammenfassung und Bewertung Zusammenfassung Binden von Variablen und Verwenden der gebundenen Variablen beim Erstellen neuer Strukturen RANGEPrädikat und InfixOperatoren BEFORE und AFTER Idee für FLWRAusdruck und der Subqueries, Aggregationsfunktionen und distinct-Funktion XML-QL PfadAusdrücke und Funktionenbibliothek XQL SQL Idee der Subqueries XPATH 1.0 OQL QUILT Lorel YATL NEU: Dereferenzierungsoperator FILTER-Operator Einfluss Übernahme von Features Für die Anfragesprache Quilt existiert eine formlose Syntax. Die formale Definition der Syntax und der Semantik von Quilt ist noch in Arbeit. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 3.6.2 Seite 17 Bewertung Die W3C XML Query Working Group hat Forderungen nach einer Anfragesyntax gestellt, die vom Menschen lesbar ist und gleichzeitig auf einer XML-Anfragesyntax basiert. Quilt wird der ersten dieser Forderungen gerecht. Es hat sich gezeigt, dass es für einige Anwendungen hilfreich wäre, wenn eine alternative, XML-basierte Syntax für Quilt zur Verfügung stehen würde, ohne dass die Grundkonzepte von Quilt dafür geändert würden. Meiner Meinung nach erfüllt Quilt die Anforderungen an eine universelle Anfragesprache, denn è è è è è Quilt ist so flexibel wie XML erhält eine gegebene Ordnung und Hierarchie verfügt über die üblichen Datenbankanfragen kann alle in XML vorhandenen Strukturen von Informationen behandeln kann mit Hilfe des FLWR-Ausdrucks Informationen umstrukturieren Auch die Ziele, die sich die Arbeitsgruppe gesetzt hat, wurden erreicht, denn è Quilt ist eine kleine Sprache è die Anfragen sind kurz, aber lesbar è Quilt kann eigenständige XML-Dokumente, Fragmente von XML-Dokumenten oder Ansammlungen von XML-Dokumenten behandeln und ist somit flexibel genug, um ein breites Spektrum vom XML-Informationsquellen bearbeiten zu können Bei Quilt gibt es allerdings noch offene Punkte wie • • einen Erweiterungsmechanismus, durch den Funktionsdefinitonen mit globaler Sichtbarkeit geschrieben in unterschiedlichen Programmiersprachen - zur Quilt-Funktionenbibliothek hinzugefügt werden können. einen Mechanismus, der dem Benutzer beim Verhindern von Endlosschleifen bei rekursiven Funktionen unterstützt. Folglich ist Quilt ein guter Ansatz, aber noch nicht die optimale Lösung für eine Anfragesprache. Dennoch kann sie dazu beitragen, das Potential von XML als universelles Medium für den Datenaustausch auszuschöpfen. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 18 4. Die Anfragesprache XQuery 4.1 Anforderungen und Ziele beim Entwurf Auch für XQuery 1.0 gelten die bereits bei Quilt beschriebenen Anforderungen der W3C XML Query Working Group an eine universelle Anfragesprache. Die W3C XML Query Working Group fordert zum einen, dass die Syntax der Anfragesprache vom Menschen lesbar und zum anderen, dass die Anfragesyntax auf XML basiert. XQuery 1.0 soll ebenfalls die erste Forderung erfüllen. Eine Arbeitsgruppe aus Mitgliedern der W3C XML Query Working Group und der XSL Working Group hat sich der Aufgabe angenommen, die Sprache XQuery 1.0 zu entwerfen. Die Arbeitsgruppe besteht aus Scott Boag und Don Chamberlin von IBM, Mary Fernandez von AT&T, Daniela Florescu, Jonathan Robie von Software AG, Jérôme Siméon von Bell Labs und Mugur Stefanescu von Concentric Visions. Von der Arbeitsgruppe wurden folgende Ziele gesteckt: • • • XQuery soll eine kleine, flexible und leicht implementierbare Sprache sein. Die Anfragen von XQuery sollen knapp und dennoch gut verständlich sein. XQuery soll sowohl für Anfragen an Datenbanken als auch an Dokumente geeignet sein. Da die Sprache noch nicht vollständig definiert ist, sind immer noch Änderungen an ihrem Aufbau möglich. Bei [2] handelt es sich um ein Arbeitspapier der Arbeitsgruppe. 4.2 Die Vorgehensweise beim Entwurf XQuery 1.0 stammt von der Anfragesprache Quilt ab, die wie bereits gezeigt auf Features von XPath 1.0, XQL, XML-QL, SQL und OQL zurückgreift. Die Arbeitsgruppe, die sich mit XQuery befasst hat, ist auch verantwortlich für XPath 2.0. XPath 2.0 stammt ab von XPath 1.0 und XQuery 1.0. Deshalb findet man sehr viele Übereinstimmungen zwischen XPath 2.0 und XQuery 1.0. Man kann sagen, dass XQuery 1.0 die Anfragesprache XPath 2.0 als Untermenge enthält. XQuery ist eine stark typisierte Sprache. Beim Abarbeiten durchläuft eine Anfrage eine statische Typisierungsphase und eine dynamische Auswertungsphase. Der Typ, der bei dynamischen Auswertung zustande kommt, ist garantiert eine Instanz des Typs, der bei der statischen Typisierung festgelegt wurde. Der Benutzer kann auf Wunsch die statische Typisierung überspringen. XQuery ist eine funktionale Sprache, die es erlaubt, Ausdrücke beliebig zu schachteln. XQuery unterscheidet Groß-/Kleinschreibung. Alle Schlüsselwörter in XQuery benutzen Kleinbuchstaben. Grundbaustein von XQuery ist der Ausdruck. Der Wert eines Ausdrucks ist immer eine Sequenz. Eine Sequenz ist eine geordnete Menge von null oder mehr Elementen. Ein Element ist entweder ein einfacher Wert oder ein Knoten. Ein einfacher Wert besteht aus einem Wert, aus dem Wertebereich der primitiven Datentypen, die im XML-Schema beschrieben sind. Zusätzlich enthält er eine Referenz auf eine Schema-Komponente, die den Typ beschreibt. Ein Knoten entspricht einem der sieben Knotentypen, die im XQuery-1.0- und XPath-2.0-Datenmodell ([3]) beschrieben sind. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 4.3 Seite 19 Die Ein-/Ausgabestruktur von XQuery 1.0 XQuery 1.0 kann diesselben Quellen wie Quilt bearbeiten. 4.4 Ausdrücke in XQuery 1.0 Bei der Anfragesprache XQuery 1.0 gibt es folgende Arten von Ausdrücken: • • • • • • • • • Primäre Ausdrücke Pfad-Ausdrücke Konstruktoren FLWR-Ausdrücke Sortierungsausdrücke Ausdrücke, die Operatoren und Funktionen beinhalten Bedingte Ausdrücke Funktionen Quantoren In XQuery ist der Kontext eines Ausdrucks wichtig. Dieser besteht aus allen Informationen, die dessen Ergebnis beeinflussen können. Diese Informationen sind aufgeteilt in zwei Kategorien: - Statischer Kontext Auswertungskontext Der statische Kontext umfasst alle Informationen, die während der statischen Analyse des Ausdrucks verfügbar sind. Diese Informationen dienen der Entscheidung, ob der Ausdruck einen statischen Fehler enthält. In XQuery werden die Informationen des statischen Kontext durch Deklarationen im Query Prolog - wird später beschrieben - bereitgestellt. Der Auswertungskontext umfasst alle Informationen, die zum Auswertungszeitpunkt zur Verfügung stehen. Der Auswertungskontext besteht somit aus allen Teilen des statischen Kontexts sowie folgenden zusätzlichen Teilen: - Fokus: Kontexteinheit, Kontextgröße, Kontextposition und Kontextdokument Dynamische Variablen (stehen in Bezug zu den gleichnamigen in-scope-Variablen) Aktuelles Datum und aktuelle Zeit (behält ihren Wert während der Ausführung einer Abfrage bei) Die Kontexteinheit ist die Einheit, die momentan bearbeitet wird. Das ist entweder ein einfacher Wert oder ein Knoten - auch Kontextknoten genannt. Die Kontexteinheit wird durch den Ausdruck "." zurückgegeben. Die Kontextgröße ist die Anzahl der Einheiten einer Sequenz, die aktuell bearbeitet wird. Ihr Wert ist immer eine ganze Zahl größer als null und wird vom Ausdruck last() zurückgegeben. Die Kontextposition ist die Position der Kontexteinheit innerhalb der Sequenz von Einheiten, die momentan abgearbeitet werden. Ihr Wert ist eine ganze Zahl größer als null und wird vom Ausdruck position() zurückgeliefert. Die Kontextposition ist immer kleiner oder gleich der Kontextgröße. Das Kontextdokument ist das Dokument das momentan bearbeitet wird. Sein Wert ist ein Knoten, der immer ein Dokumentknoten ist. Das Kontextdokument erhält man mittels des Ausdrucks "/" und es wird implizit als Basis für jeden absoluten Pfad-Ausdruck sowie als Eingabe für bestimmte Funktionen wie xf:id verwendet. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 4.4.1 Seite 20 Primäre Ausdrücke Primäre Ausdrücke sind die Grundbestandteile von XQuery. Zu ihnen zählen: • • • • • Literale: XQuery kennt Stringliterale und numerische Literale Variablen Geklammerte Ausdrücke Funktionsaufrufe Kommentare 4.4.2 Pfad-Ausdrücke Ein Pfad-Ausdruck lokalisiert Knoten innerhalb eines Baumes und liefert eine Sequenz unterschiedlicher Knoten in der Dokumentreihenfolge zurück. Ein Pfad-Ausdruck wird immer unter Berücksichtigung des Auswertungskontexts ausgewertet. Es gibt relative und absolute Pfad-Ausdrücke. Ein relativer Pfad-Ausdruck besteht aus einem oder mehreren Schritten getrennt durch "/" oder "//". Ein absoluter Pfad-Ausdruck beginnt mit "/" oder "//" gefolgt von einem relativen Pfad-Ausdruck. Beginnt der Pfad mit "/", dann ist der relative Pfad-Ausdruck optional. Ein Achsenschritt fängt beim Kontextknoten an und verläuft entlang der Knoten, die vom Kontextknoten aus über eine vordefinierte Achse erreichbar sind und wählt dabei einige Untermengen der erreichbaren Knoten aus. Ein Achsenschritt besteht aus - Knotentest Schrittvermerk Achse ("Bewegungsrichtung") Ein Knotentest ist ein Test des Knotens entweder auf seinen Namen oder seine Knotenart. Beispielsweise ist der Test text() wahr für jeden Textknoten. Schrittvermerke sind entweder Eigenschaften, die zum Ausfiltern von Knoten einer Sequenz verwendet werden oder Dereferenzen, die Attributknoten mit Typ "Referenz" auf die Knoten abbilden, die sie referenzieren. Es gibt Vorwärts- und Rückwärtsachsen. Bei XQuery existieren folgende Vorwärtsachsen: - child descendant attribute self descendent-or-self sowie die Rückwärtsachse parent. Ein Schritt kann auch nur ein allgemeiner Schritt sein, das ist ein primärer Ausdruck gefolgt von einem oder mehreren Schrittvermerken. Das Ergebnis eines allgemeinen Schritts ist eine Knotensequenz, geändert durch jeden Schrittvermerk. Liefert der primäre Ausdruck einen Wert, der kein Knoten ist, tritt ein Fehler auf. Beispiel: Ausgehend davon, dass der Wurzelknoten des Dokuments "schloesser.xml" der Kontextknoten ist, finde die Abbildung mit der Unterschrift "Heidelberger Schloss" im 5. Kapitel des Dokuments. child::Kapitel[5]//child::Abbildung[Unterschrift = "Heidelberger Schloss"] Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 21 Beispiel: Ausgehend davon, dass der Wurzelknoten des Dokuments "schloesser.xml" der Kontextknoten ist, finde alle Abbildung in den Kapiteln 2 bis 5 des Dokuments. child::Kapitel[2 to 5]//child::Abbildung Auch bei XQuery gibt es einen Dereferenzierungsoperator, hier dargestellt durch die Zeichen "=>". Dieser Operator wird auf Knotensequenzen angewandt, indem er Element- und/oder Attributknoten abbildet auf die Knoten, die sie referenzieren. Aus einer Knotensequenz können nur Element- oder Attributknoten dereferenziert werden, deren Inhalt vom Typ IDREF oder IDREFS ist. Beispiel: Finde alle Unterschriften von Abbildungen, die durch <figref>-Elemente im Kapitel mit dem Titel = "Baden-Württemberg" des Dokuments "schloesser.xml" referenziert werden. Sei der Wurzelknoten des Dokuments wiederum der Kontextknoten: child::Kapitel[Titel = "Baden-Württemberg"]//child::figref/attribute::refid=>Unterschrift 4.4.3 Konstruktoren XQuery stellt Konstruktoren für Elemente, Attribute, CDATA-Sektionen, Abarbeitungsanweisungen und Kommentare zur Verfügung. Eine Spezialform eines Konstruktors - berechnender Element- oder Attributkonstruktor genannt - wird verwendet, um ein Element oder ein Attribut mit einem berechneten Namen zu erstellen. Die Wirkung des Elementkonstruktors soll nun ein Beispiel veranschaulichen. Der Name von Start- und Endtag muss übereinstimmen. Sind Name, Attribute und Inhalt des Elements durchweg Konstanten, erscheint der Elementkonstruktor in XML-Standard-Notation. Werden hingegen Ausdrücke verwendet, so müssen diese in geschwungene Klammern gesetzt werden, um sie von Textliteralen zu unterscheiden. Eine geschwungene Klammer im Text selbst wird durch Verdoppelung erzeugt. Beispiel: <Mitarbeiter Personalnummer = {$pid}> <Name> { $name } </Name> <Gehaltsgruppe> { $gg } </Gehaltsgruppe> </Mitarbeiter> Beim berechnenden Element- oder Attributkonstruktor wird dem Namen des Knotens das Schlüsselwort element oder attribut vorangestellt. Dieses Feature kann beispielsweise dazu eingesetzt werden, Element- und Attributnamen in verschiedene Sprachen zu übersetzen. Beispiel: element Mitarbeiter { attribute Personalnummer {178713}, element Name { element Vorname { "Martina" }, element Nachname { "Welt" } } } Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 4.4.4 Seite 22 FLWR-Ausdrücke Bei XQuery gelten für die FLWR-Ausdrücke ähnliche Regeln wie bei Quilt. Einziger Unterschied ist, dass die verwendeten Ausdrücke in geschwungene Klammern gesetzt werden müssen. 4.4.5 Sortierungsausdrücke Der Sortierungsausdruck sortby(...) ermöglicht es, die Reihenfolge der Einheiten einer Sequenz zu bestimmen. Es können auch mehrere Ordnungskriterien - getrennt durch Komma - angegeben werden, die dann von links nach rechts bearbeitet werden. Bei jedem Kriterium kann aufsteigend (Voreinstellung) und absteigend sortiert werden. Sortierungsausdrücke können auf die Ergebnisse von FLWR-Ausdrücken oder Pfad-Ausdrücken angewendet werden. Bei Pfad-Ausdrücken ist allerdings Vorsicht angebracht. Es kann passieren, dass der Sortierungsausdruck zu einem unerwarteten Ergebnis führt, weil Pfad-Ausdrücke immer eine Knotensequenz in Dokumentreihenfolge zurückliefern. 4.4.6 Ausdrücke, die Operatoren und Funktionen beinhalten Auch bei XQuery gibt es Schachtelungen von geklammerten Ausdrücken, die üblichen arithmetischen und logischen Operatoren sowie die Mengenoperatoren UNION, INTERSECT und EXCEPT. XQuery verfügt über vier verschiedene Vergleichsausdrücke: - Wertvergleich (eq, ne, lt, le gt, ge) allgemeiner Vergleich (=, !=, <, <=, > >=) Knotenvergleich (==, !==) Ordnungsvergleich (<<, >>, precedes, follows) Der Wertvergleich dient dem Vergleich von einzelnen Werten. Beispiel: $book1/author eq "Güting" Der Vergleich ergibt nur dann wahr, wenn $book1 ein einziges author-Subelement hat und dessen Wert "Güting" ist. Beim allgemeinen Vergleich können die Operanden Sequenzen beliebiger Länge sein. Beispiel: $book1/author = "Güting" Der Vergleich ergibt wahr, wenn der Wert irgendeines author-Subelement von $book1 gleich "Güting" ist. Der Knotenvergleich ist nur dann wahr, wenn beide Seiten genau zum selben Knoten ausgewertet werden. Der Ordnungsvergleich in XQuery ersetzt die Infix-Operatoren BEFORE und AFTER von Quilt. Der Vergleich ist nur dann wahr, wenn der Knoten auf der linken Seite in der Dokumentreihenfolge vor bzw. nach dem Knoten auf der rechten Seite auftritt. Bei XQuery existiert ebenfalls ein FILTER-Operator. Er hat jedoch im Gegensatz zu Quilt keine zwei sondern nur einen Parameter, der ein beliebiger Ausdruck sein kann. Die FILTER-Funktion ist Bestandteil der XQuery-Kernbibliothek. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 23 Sie wertet ihr Argument aus und liefert eine Kopie der ausgewählten Knoten. Dabei werden die Beziehungen zwischen den Knoten erhalten. Ergebnis von $doc (vor dem Filtern): C B C C B A B A C C A A B B Ergebnis von filter($doc//(A | B)): B A A 4.4.7 B B B A A B Bedingte Ausdrücke XQuery unterstützt den bekannten bedingten Ausdruck basierend auf den Schlüsselwörtern if, then und else. Der Testausdruck, der dem Schlüsselwort if folgt, muss allerdings in runden Klammern angegeben werden. 4.4.8 Funktionen Zusätzlich zu den eingebauten Funktionen kann der Benutzer von XQuery eigene Funktionen definieren. Eine Funktion darf rekursiv sein - sogar wechselseitig rekursiv. Zur Definition einer Funktion werden deren Namen, Namen und Datentypen der Parameter sowie der Datentyp des Ergebnisses festgelegt. Der Name einer Funktion kann mit einem Namensraum angegeben werden. Mit dem Befehl default function namespace = ... wird ein Standard-Namensraum festgelegt und der Namensraum kann dann bei der Funktion weggelassen werden. Wenn ein Parameter nur mit Namen und ohne Typ deklariert wurde, akzeptiert er Argumente jeden beliebigen Typs. Wird der RETURN-Satz weggelassen, kann ein Wert von beliebigem Typ zurückgegeben werden. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 24 Beispiel: Die Funktion berechnet die maximale Tiefe des Dokuments "wegenetz.xml": define function depth (element $e) returns xs:integer { {-- Ein leeres Element hat die Tiefe 1, --} {-- ansonsten addiere 1 zur max. Tiefe der Nachfolger --} if (empty($e/*)) then 1 else max (for $C in $e/* return depth($c)) + 1 } depth(document("wegenetz.xml")) Das Überladen benutzerdefinierter Funktionen ist in XQuery momentan nicht möglich. Die Arbeitsgruppe ist jedoch der Auffassung, dass dieses Feature bei zukünftigen Versionen von XQuery berücksichtigt werden sollte. Einige der built-in-Funktionen sind hingegen überladen wie beispielsweise die string-Funktion von XPath. 4.4.9 Quantoren XQuery kennt die Quantoren SOME und EVERY, für die das bei Quilt Beschriebene gilt. 4.5 Datenbankanfragen Die Umsetzung von Datenbankanfragen funktioniert wie bereits bei Quilt gezeigt. 4.6 Query Prolog Der Query Prolog umfasst eine Reihe von Deklarationen und Definitionen, die die Abarbeitung der Anfragen festlegen. Im Query Prolog können Namensräume definiert, Definitonen von Schemata importiert und Funktionen definiert werden. Die Namensraumdeklaration definiert einen Namensraum-Präfix und verbindet ihn mit einem Namensraum-URI, indem das (Präfix, URI)-Paar zur Menge der in-scope-Namensräume hinzugefügt wird. Die Namensraumdeklaration ist gültig für den Rest der Anfrage, in der sie gemacht wurde. 4.7 Zusammenfassung und Bewertung 4.7.1 Zusammenfassung Durch die Abstammung von Quilt verfügt XQuery 1.0 über alle Features von Quilt. Viele Ausdrücke lauten und funktionieren gleich, andere sind vorhanden, tragen aber eine andere Bezeichnung und funktionieren nur ähnlich wie beispielsweise die Infix-Operatoren BEFORE und AFTER bei Quilt und der Ordnungsvergleich mittels "precedes" und "follows" bei XQuery 1.0. Dadurch, dass XPath 2.0 als Untermenge in XQuery 1.0 enthalten ist, verfügt XQuery 1.0 auch über alle Features von XPath 2.0. Unterschiede zu Quilt sind, dass • • XQuery eine stark typisierte Sprache ist, bei der alle Anfragen eine statische Typisierungsphase und eine dynamische Auswertungsphase durchlaufen XQuery zwischen Groß-/Kleinschreibung unterscheidet Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 • • • • • • • • • Seite 25 die Syntax von XQuery etwas anders aussieht XQuery von Sequenzen spricht, wo bei Quilt von Tupellisten die Rede ist bei XQuery Ausdrücke in geschwungene Klammern gesetzt werden müssen, damit man sie von Textliteralen unterscheiden kann es bei XQuery zusätzlich einen berechnenden Element- und Attributkonstruktor gibt der FILTER-Operator bei XQuery nur einen anstatt zwei Parameter hat der Ordnungsvergleich bei XQuery mittels "precedes" und "follows" erfolgt anstelle der InfixOperatoren BEFORE und AFTER von Quilt bei XQuery der Testausdruck beim bedingten Ausdruck in runde Klammern gesetzt werden muss XQuery über einen Query Prolog verfügt, in dem beispielsweise Namensraumdeklarationen zu finden sind in XQuery der Standard-Namensraum für Funktionen geändert werden kann Dieser Beitrag basiert auf dem Stand Dezember 2001 von [2]. Zwischenzeitlich gibt es einen Stand April 2002, der neue Details beim Typsystem enthält und zudem die Element- und Attributkonstruktoren etwas detaillierter beschreibt. 4.7.2 Bewertung Die W3C XML Query Working Group hat eine Forderung nach einer Anfragesyntax gestellt, die vom Menschen lesbar ist. Dieser Forderung wird XQuery 1.0 gerecht. Meiner Meinung nach erfüllt auch XQuery 1.0 die Anforderungen an eine universelle Anfragesprache, denn è è è è è XQuery 1.0 ist so flexibel wie XML erhält eine gegebene Ordnung und Hierarchie verfügt über die üblichen Datenbankanfragen kann alle in XML vorhandenen Strukturen von Informationen behandeln kann mit Hilfe des FLWR-Ausdrucks Informationen umstrukturieren Auch die Ziele, die sich die Arbeitsgruppe gesetzt hat, wurden erreicht, denn è XQuery ist eine kleine, flexible und leicht implementierbare Sprache è die Anfragen sind knapp und trotzdem gut verständlich è XQuery 1.0 ist sowohl für Anfragen an Datenbanken als auch an Dokumente geeignet Meines Erachtens wurde mit dem Entwurf von XQuery 1.0 ein weiterer Fortschritt hinsichtlich einer universellen Anfragesprache erzielt. Aber XQuery 1.0 ist noch in Arbeit und es sind noch etliche Punkte offen. Sicherlich wird XQuery noch vervollständigt und verbessert werden oder vielleicht sogar durch einen weiteren neuen Ansatz überholt werden. Seminar 1912: XML und Datenbanken - Thema 7: Quilt, XQuery Martina Welt, Matrikelnr. 3727750 Seite 26 5. Quellenangaben [1] D. D. Chamberlin, J. Robie und D. Florescu. Quilt: An XML Query Language for Heterogeneous Data Sources. WebDB (Informal Proceedings), 53 - 62, 2000, http://wwwrodin.inria.fr/Fmbrepubs_dana.html [2] S. Boag, D. Chamberlin, M. F. Fernandez, D. Florescu, J. Robie, J. Siméon und M. Stefanescu. XQuery 1.0: An XML Query Language. W3C Working Draft, 2001, http://www.w3.org/TR/xquery/ => Hier handelt es sich um ein Arbeitspapier, das jederzeit aktualisiert, ergänzt oder überholt werden kann, da noch eine Menge offener Fragen zu klären sind. [3] World Wide Web Consortium. XML Query Data Model. W3C Working Draft, May 11, 2000, http://www.w3.org/TR/query-datamodel/ [4] J. Clark und S. DeRose. XML Path Language (XPath), Version 1.0. W3C Recommendation 1999, http://www.w3.org/TR/xpath LG Praktische Informatik IV Seminar zum Thema XML und Datenbanken Sommersemester 2002 Speicherung von XML-Dokumenten in relationalen Datenbanksystemen I Basierend auf: Meike Klettke und Holger Meyer, XML and Object-Relational Database Systems – Enhancing Structural Mappings Based On Statistics Albrecht Schmidt, Martin Kersten, Menzo Windhouwer und Florian Waas, Efficient Relational Storage and Retrieval of XML Documents Elke Pillis Matrikelnummer 4798449 elke.pillis@fernuni-hagen.de Elke Pillis Matrikelnummer: 4798449 Seite: 1 Inhaltsverzeichnis 1 Einleitung und Grundbegriffe _________________________________________2 2 Das XML-Modell MONET _____________________________________________3 3 2.1 Ein Beispiel __________________________________________________________ 3 2.2 Datenstruktur und Algebra ______________________________________________ 3 2.3 Das XML-Modell MONET ________________________________________________ 4 2.4 Anfragen an das XML-Modell MONET _____________________________________ 6 Hybride Datenbanken________________________________________________7 3.1 Objekt-Relationale Abbildungsverfahren __________________________________ 7 3.2 Hybride Datenbanken definieren ________________________________________ 10 4 Zusammenfassung_________________________________________________13 5 Thesen___________________________________________________________13 Anhang A: Abbildungsverzeichnis _______________________________________14 Anhang B: Literatur und Links __________________________________________14 B 1 Basisliteratur __________________________________________________________ 14 B 2 Links im Internet _______________________________________________________ 14 B 3 Weiterführende Literatur ________________________________________________ 14 Anhang C: Vortragsfolien ______________________________________________15 Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I Elke Pillis Matrikelnummer: 4798449 Seite: 2 1 Einleitung und Grundbegriffe XML ist zu dem Standard Format des World Wide Web avanciert. Allerdings gibt es wenige Werkzeuge, die XML verarbeiten können. Es wäre von Vorteil, die XML-Daten in relationale Datenbanken zu speichern. Da es sich bei XML um semi-strukturierte Daten handelt, können diese nicht ohne Weiteres in eine Datenbank gespeichert werden. Abbildung 1.1 zeigt, wo genau das Problem liegt, wenn ein XML Dokument in eine Datenbank gespeichert werden soll. ? Abbildung 1-1 Problem bei der Speicherung eines Baumes in eine Datenbank Das wohl größte Problem bei der Speicherung eines XML-Dokumentes in einer Datenbank ist die Struktur des XML Dokumentes. Wie in der Abbildung 1-1 zu sehen ist, weist das XML Dokument eine Baumstruktur auf, die sich sehr schwer auf das relationale Modell übertragen lässt. In der folgenden Tabelle sind die wesentlichen Unterschiede der beiden Konzepte, Baumstruktur und RDBMS zusammengefasst: XML Daten in hierarchischer Struktur Knoten haben Elemente oder Attributwerte Elemente können verschachtelt werden Elemente sind geordnet Elemente können rekursiv sein Schema optional Direkte Speicherung von XML-Dokumenten Abfrage mit XML-Standards RDBMS Daten in vielen Tabellen Zellen haben einen Wert Atomare Zellenwerte Zeilen/Spalten Ordnung definiert Wenig Unterstützung für rekursive Elemente Schema wird benötigt Häufig Joins zum Finden nötig Abfragen mit XML-erweitertem SQL Abbildung 1-2 Vergleich XML und RDBMS (Software AG) Folgendes Statement unterstreicht das Problem der Abbildung von XML-Dokumenten auf RDBMS ziemlich deutlich. Using RDBMS for storing hierarchically structured XML documents is as efficient as disassembling car for parking it in the garage in the evening and then reassembling it every morning before leaving for work. Diese Aussage stammt von der Firma Software AG. Diese vertreibt den TAMINO XML-Server. Sicherlich ist die Software AG interessiert, ihren TAMINO XML-Server zu verkaufen. Trotzdem findet man diese AUSSAGE in der TAMINO Werbebroschüre. Im Folgenden werden zwei Ansätze vorgestellt, wie man trotzdem XML-Dokumente in RDBMS speichern kann. Will man also XML-Daten in RDBMS speichern, müssen diese erst normalisiert werden. Dies macht bei datenorientierten XML-Dokumenten noch Sinn, bei dokumentorientierten XML-Dokumenten wird es jedoch zum Problem. Im Folgenden stelle ich den MONET Ansatz vor zur Speicherung von datenorientierten XML-Dokumenten und den hybriden Ansatz zur Speicherung von dokumentorientierten XML-Dokumenten. Bei beiden Ansätzen wird eine DTD vorausgesetzt. Natürlich ist es möglich, auch ohne DTD zu arbeiten, denn aus den Dokumenten kann auch eine Struktur ermittelt werden. Jedoch ist es sehr schwierig gleich strukturierte XML Dokumente zu identifizieren, das optimale gemeinsame Schema herauszukristallisieren, und ev. Änderungen am Schema sind sehr schwer zu verarbeiten. Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I Elke Pillis Matrikelnummer: 4798449 Seite: 2 Das XML-Modell MONET 2.1 Ein Beispiel Zunächst einmal ein Beispiel <Hotelverzeichnis> <Hotel LfdNr = „1“> <Name>Hotel Sonnenschein</Name> <Adresse>Zum Sonnenberg 7</Adresse> <Gastronomie>Restaurant</Gastronomie> </Hotel> <Hotel LfdNr = „2“> <Name>Hotel Zum Berg</Name> <Adresse>Am Bergrand 30</Adresse> <Gastronomie>Cafe</Gastronomie> </Hotel> </Hotelverzeichnis> XML Dokumente werden üblicherweise durch einen Syntaxbaum dargestellt. Der passende Syntaxbaum zu dem o.a. Beispiel sieht dann folgendermaßen aus, wobei hier bereits jedem Element ein eindeutiger Object Identifier oi zugewiesen wird. Hotelverzeichnis, o1 „1“ LfdNr Name, o3 Hotel, o2 Adresse, o5 CDATA, o4 CDATA, o6 string „Hotel Sonnenschein“ string Hotel, o9 Gastronomie, o7 CDATA, o8 string „Zum „Restaurant“ Sonnenberg 7“ Name, o10 LfdNr „2“ Adresse, o12 Gastronomie, o14 CDATA, o11 CDATA, o13 string „Hotel Zum Berg“ string „Am Bergrand 30“ CDATA, o15 string „Cafe“ Abbildung 2-1 Syntaxbaum 2.2 Datenstruktur und Algebra Ein XML Dokument wird formal folgendermaßen definiert: Definition: Ein XML Dokument d = (V,E,r,labelE,labelA,rank) ist ein Wurzelbaum mit Knoten V und Kanten E ⊆ VxV und dem Wurzelknoten r ∈ V. Die Funktion labelE : V → string weist Knoten Labels zu, z.B. Elemente. labelA : V → string x string weist Knoten ein Paar von zwei Strings zu, nämlich Attribute und deren Werte. Analog für integer Attribute. In diesem Fall wird dem Knoten ein Paar string x integer zugewiesen. Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I 3 Elke Pillis Matrikelnummer: 4798449 Seite: Die Basis des XML-Modells MONET sind Assoziationen und Pfadsummen. Daher erst die Definition der beiden Begriffe: Definition: Ein Paar (o,x) ∈ oid x (oid ∪ string ∪ int) nennt man Assoziation Die verschiedenen Arten von Assoziationen beschreiben die unterschiedlichen Bereiche im Syntaxbaum. Assoziationen vom Typ oid x oid beschreiben Kanten, Attribute sind als Assoziation oid x string modelliert. oid ist hierbei die Menge der Object Identifier. Definition: Für einen Knoten o im Syntaxbaum wird die Sequenz der Label entlang des Pfades (Knoten und Kanten Labels) vom Wurzelknoten r zum Knoten o als path(o) bezeichnet. Nehmen wir den Knoten o7. Der Pfad ist dann e Hotelverzeichnis Hotel e Gastronomie, der zugehörige Wert „Restaurant“ hat den Pfad Hotelverzeichnis e Hotel e Gastronomie e cdata a string e a wobei Kanten zu einem Element bezeichnen und Kanten zu einem Attribut. Pfade beschreiben die relative Lage des Knotens im Graphen zum Wurzelknoten und path(o) beschreibt den Typen der Assoziation (r, o). Die Menge aller Pfade in einem Dokument ist dann die Pfadsumme. 2.3 Das XML-Modell MONET Zur Erinnerung: Ziel ist es, das XML-Dokument in ein relationales Schema zu packen. Das XML-Modell MONET geht dabei von dem Syntaxbaum aus und generiert für jede Eltern-Kind Beziehung eine Tabelle, eine weitere für alle Element labels, usw. Die Anzahl der Tabellen wird natürlich sehr groß. Zur Rekonstruktion muss das DBMS mit sehr vielen Joins umgehen können. Jedoch ist die Abfrage auf solch große Datenmengen sehr ineffektiv. Deshalb werden Relationen, die der gleichen syntaktischen Definition gehorchen, in dieselbe binäre Relation gepackt. Formal lässt sich das MONET Modell folgendermaßen definieren: Gegeben ist ein XML Dokument d. Die MONET Transformation ist ein 4-er Tupel Mt(d) = (r, R, A, T) R = Menge aller binären Relationen, die alle Assoziationen zwischen Knoten beinhalten A = Menge aller binären Relationen, die alle Assoziationen zwischen Knoten und deren Attributwerte beinhalten, einschließlich Werte T = Menge der binären Relationen mit allen Paaren von Knoten und deren Rang Hier wird path genutzt, um die Assoziationen zu gruppieren. Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I 4 Elke Pillis Matrikelnummer: 4798449 Unser Beispiel: HotelVZ HotelVZ HotelVZ e e e HotelVZ Hotel HotelVZ Hotel HotelVZ Hotel e e e e e e HotelVZ Hotel Name HotelVZ Hotel Adresse HotelVZ Hotel Gastronomie HotelVZ e e e e e e e e e e HotelVZ Hotel Name CDATA Hotel Adresse CDATA Hotel Gastronomie CDATA Hotel e Hotel Name CDATA String Adresse CDATA String Gastronomie CDATA String LfdNr e e e a e e e e a a Seite: 5 = {<o1,o2>,<o1,o9>} = {<o2,o3>,<o9,o10>} = {<o3,o4>,<o10,o11>} = {<o4,“Hotel Sonnenschein“>,o11,“Hotel zum Berg“>} = {o2,o5>,<o9,o12>} = {<o5,o6>,o12,o13>} = {<o6,“Zum Sonnenberg 7“>,<o13,“Am Bergrand 30“>} = {<o2,o7>,<o9,o14>} = {<o7,o8>,<o14,o15>} = {<o8,“Restaurant“>,<o15,“Cafe“>} = {<o2,“1“>,<o9,“2“>} Exemplarisch wird im Folgenden der Aufbau der Tabellen für die Gastronomie dargestellt: Hotel ve rz eic hnis -> Hotel o1 o1 o2 o9 Hotel ve rz eic hnis -> Hotel -> Gas tronom ie o2 o9 o3 o10 Hotel ve rz eic hnis -> Hotel -> Gas tronom ie -> CDA TA o3 o10 o4 o11 Hotel ve rz eic hnis -> Hotel -> G as tronom ie -> CDA TA -> S tring Insgesamt entstehen bei der Transformation unseres Beispiels 11 Tabellen. Abbildung 2-2 Tabellenaufbau Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I o4 o11 „Res taurant“ „Ca fe“ Elke Pillis Matrikelnummer: 4798449 Seite: 6 2.4 Anfragen an das XML-Modell MONET Nicht nur das Speichern der XML-Daten verdient Aufmerksamkeit, sondern auch das Wiederfinden der Daten. Anhand des folgenden Beispiels soll die Vorgehensweise erläutert werden: Gesucht werden alle Hotels, die als Gastronomie ein Restaurant haben: select p e from Hotelverzeichnis Hotel p e e p Gastronomie CDATA a where a = „Restaurant“ Die Anfrage ist in 2 Blöcke unterteilt, im Spezifikationsblock werden die benutzten Relationen deklariert und im sog. Constraint-Block werden die Bedingungen angegeben. Um Pfadausdrücke auswerten zu können, benötigt man zwei Variablentypen: zum einen die Mengendefinitionen, in unserem Falle p, zum anderen die Assoziationen, in unserem Falle a. Intern erhalten wir in unserem Beispiel: p = {o2,o9} assoc(p → a) = {(o2,“Restaurant), (o9,“Cafe“)} Aus dieser Menge werden dann die Elemente selektiert, die den Bedingungen entsprechen, also o2. Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I Elke Pillis Matrikelnummer: 4798449 Seite: 7 3 Hybride Datenbanken Im vorigen Kapitel haben wir gesehen, wie ein XML Dokument offensichtlich auf eine Datenbankstruktur abgebildet wurde. Allerdings gibt es XML Dokumente, bei denen das zu einem sehr großen Datenbankschema führen würde, und die Tabellen hätten nur wenige Einträge. Bei solchen Dokumenten macht es Sinn, Teile des XML Dokumentes als solches in die Datenbank zu speichern. Der Datenbank Typ XML sollte dann Pfadauswertungen erlauben und vor allen Dingen Volltextrecherche. Im Folgenden wird ein Abbildungsverfahren vorgestellt, basierend auf die DTD und auf Statistiken. Die Statistiken werden ermittelt anhand einer Auswahl von Beispiel XML Dokumenten und Vorkenntnisse über die Anfragen an die XML Dokumente. Im Folgenden wird beschrieben, wie ein XML Dokument in eine objekt-relationale Datenbank gespeichert werden kann, welche den Datentyp XML unterstützt. Der erste Schritt wird das bereits bekannte Abbilden eines XML-Dokumentes basierend auf einer DTD sein, dann wird der Datentyp XML in die objektrelationale Datenbank mit eingebracht und der letzte Schritt ist ein Algorithmus, mit Hilfe dessen man bestimmen kann, welches Attribut oder Element als Datenbankattribute abgelegt wird oder als Attribute vom Typ XML. Der Datentyp XML fügt dem RDBMS folgende Funktionalität hinzu: XML Fragmente speichern Auswertung von Pfad Ausdrücken Volltext Recherche 3.1 Objekt-Relationale Abbildungsverfahren Die in der DTD definierte Struktur eines XML-Dokuments wird für die Schemabildung herangezogen. Auf diese Weise ist eine natürliche Abbildung eines XML-Dokuments in eine Datenbank gewährleistet. In der DTD werden das Hauptelement und seine Subelemente definiert. Besitzen die Subelemente keine Struktur, so werden sie im folgenden als einfache Elemente bezeichnet. Abgespeichert werden diese als einfache Relation. <Hotel LfdNr = „1“> <Name>Hotel Sonnenschein</Name> <Adresse>Zum Sonnenberg 7</Adresse> <Gastronomie>Restaurant</Gastronomie> </Hotel> Dieses Beispiel sieht dann in der Datenbank so aus: OID Name Adresse Gastronomie 1 2 Hotel Sonnenschein ... Zum Sonnenberg 7 Restaurant Abbildung 3-1 Relation Hotel Elemente in XML-Dokumenten können in verschiedenen Anordnungen auftreten. Folgen, Gruppierungen, Alternativen und Quantifizierungen sind möglich. Wie bildet man Alternativen ab? DTD <!ELEMENT Hotel (Name, (Adresse | (Stadt, Straße)), Gastronomie)> <!ELEMENT Name (#PCDATA)> <!ELEMENT Adresse (#PCDATA)> <!ELEMENT Stadt (#PCDATA)> <!ELEMENT Straße (#PCDATA)> <!ELEMENT Gastronomie (#PCDATA)> Die Elemente Stadt und Straße treten immer zusammen auf. Außerdem kann entweder das Element Adresse oder das Elementenpaar (Stadt, Straße) in einem Dokument auftreten. Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I Elke Pillis Matrikelnummer: 4798449 Seite: <Hotel LfdNr = „1“> <Name>Hotel Sonnenschein</Name> <Adresse>Zum Sonnenberg 7</Adresse> <Gastronomie>Restaurant</Gastronomie> </Hotel> <Hotel LfdNr = „3“> <Name>Hotel Am Hang</Name> <Stadt>Skigaudi</Stadt> <Straße>Skihaserl 5</Straße> <Gastronomie>Apres Ski Bar</Gastronomie> </Hotel> OID Name Adresse Stadt Straße Gastronomie 1 3 Hotel Sonnenschein Hotel Am Hang Zum Sonnenberg 7 NULL NULL Skigaudi NULL Skihaserl 5 Restaurant Apres Ski Bar Abbildung 3-2 Relation Hotel mit Alternativen Die Abbildung der Relation führt zu NULL-Werten. Jedoch kann auch eine andere Art der Speicherung gewählt werden, indem Attribute, die NULL-Werte enthalten, in eine eigene Relation ausgelagert werden: OID Name Gastronomie 1 3 Hotel Sonnenschein Hotel Am Hang Restaurant Apres Ski Bar Abbildung 3-3 Relation Hotel F_OID Adresse 1 Zum Sonnenberg 7 Abbildung 3-4 Relation Hotel.Adresse F_OID Stadt Straße 3 Skigaudi Skihaserl 5 Abbildung 3-5 Relation Hotel.Stadt.Straße Eine Anfrage nach dem Attribut Adresse wird nun nicht mehr ganz einfach, da es nicht mehr in der Relation Hotel enthalten ist. Hier muss der ‚Umweg’ über die Systemtabellen des DBMS gegangen werden. Alternativ könnte man noch eine Spalte in die Relation Hotel einführen, die den Verweis auf die Relation Hotel.Adresse oder Hotel.Stadt.Straße beinhaltet. Ebenso könnte man die Alternativen als Typ XML abspeichern. Set-of und list-of bieten die Möglichkeit XML-Elemente mit Quantifizierer ’*’ und ’+’abzubilden. Set-of wird benutzt, wenn einfach nur eine Menge dargestellt werden muss, list-of wird benutzt, wenn die Reihenfolge relevant ist. Einige Elemente können komplexe Strukturen aufweisen. OR Datenbanken bieten mit Hilfe des Konstruktors type-of die Möglichkeit, diese Struktur zu definieren und als Attribut darzustellen. In unserem Beispiel Hotel kann die Adresse eine komplexe Struktur enthalten: Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I 8 Elke Pillis Matrikelnummer: 4798449 Seite: <Hotel LfdNr = „1“> <Name>Hotel Sonnenschein</Name> <Adresse> <Straße>Zum Sonnenberg 7</Straße> <PLZ>99999</PLZ> <Ort>Sonnentaldorf</Ort> </Adresse> <Gastronomie>Restaurant</Gastronomie> </Hotel> OID 1 Name Straße Hotel Sonnenschein Zum Sonnenberg 7 Adresse PLZ 99999 Gastronomie Ort Sonnentaldorf Restaurant Abbildung 3-7 Relation Hotel Zusätzlich gibt es noch einen mixed-content type, der es erlaubt, mehrere Elemente als Text zusammenzufassen, oder Elemente und Volltext zu mischen oder Elemente einzubetten. Ein praktisches Beispiel: Die Produktbeschreibung eines IKEA-Stuhls: <p> <b>NICK Klappstuhl</b> aus lackiertem Metall/Kunststoff. 44x46 cm, 77 cm hoch. Sitzhöhe 43 cm. <i>DM 15.65</i> </p> Solche Elemente werden als XML-Typ in der OR-Datenbank abgelegt. Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I 9 Elke Pillis Matrikelnummer: 4798449 Seite: 10 3.2 Hybride Datenbanken definieren Um eine optimale hybride Datenbank zu definieren, wird folgender Algorithmus herangezogen: 1. Schritt: Syntaxgraphen des XML Dokumentes aufbauen 2. Schritt: Für jedes Element/Attribut des Graphen wird die Gewichtung w ermittelt. 3. Schritt: Damit wird aus dem Graphen die Struktur der HYBRID Datenbank abgeleitet 1. Schritt: hier wird der Graph anhand der DTD aufgebaut, hauptsächlich um die hierarchische Struktur des Dokumentes darzustellen Wir erweitern unser Beispiel: <!ELEMENT Zimmerverzeichnis> (Hotel | Pension | Privatzimmer)*> <! – Hotel -- > <!ELEMENT Hotel (Name, Adresse, Gastronomie, Abendessen_fuer)> <!ATTLIST LfdNr id ID #REQUIRED> <!ELEMENT Name (#PCDATA)> <!ELEMENT Adresse (#PCDATA)> <!ELEMENT Gastronomie (#PCDATA)> <! – Pension -- > <!ELEMENT Pension (Name, Adresse, Fruehstueck, Anzahl_Zimmer)> <!ATTLIST LfdNr id ID #REQUIRED> <!ELEMENT Anzahl_Zimmer (#PCDATA)> <! – Privatzimmer -- > <!ELEMENT Privatzimmer (Name, Adresse, Fruehstueck)> <!ATTLIST LfdNr id ID #REQUIRED> <!ELEMENT Fruehstueck (#PCDATA)> </Zimmerverzeichnis> Zimmerverzeichnis Pension Hotel Name Adresse Gastronomie Abendessen_fuer Name Adresse Privatzimmer Anzahl Zimmer Name Adresse Frühstück Abbildung 3-8 Graph zum Zimmerverzeichnis Gemeinsame Ausdrücke aus der DTD (Name; Adresse) werden dupliziert. 2. Schritt: In diesem Schritt werden die Gewichte bestimmt, die die Wichtigkeit der Elemente für jeden Knoten im Graphen widerspiegeln. Dafür werden drei Arten von Informationen benötigt. Zum Einen wird die DTD Struktur benötigt. Jedoch liefert diese nicht alle Informationen für eine optimale Datenbankstruktur. Dieselbe DTD kann für mehrere Dokumente in unterschiedlichen Applikationen auf unterschiedliche Weise benutzt werden. Deshalb wird der Inhalt des DTD Dokumentes auch in Betracht gezogen. Jedoch kommt noch das Verhalten des Benutzers dazu. Es muss berücksichtigt werden, wonach der Benutzer „für gewöhnlich“ sucht. Also werden als drittes Informationen über Abfragen in die Berechnung mit einbezogen. Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I Elke Pillis Matrikelnummer: 4798449 wD wQ Seite: 11 wD - das abgeleitete Gewicht aus den XML Daten wQ - das abgeleitete Gewicht aus den Abfragen wS - das abgeleitete Gewicht aus der DTD wS Abbildung 3-9 Knoten Gewichte Diese drei Gewichte haben dann aber noch unterschiedliche Gewichtung pro Knoten: 1 1 1 w = * wS + * wD + * wQ 2 4 4 Wie werden nun die einzelnen Gewichte ermittelt? wS wird folgendermaßen ermittelt: WS = SH + SA + SQ 3 wobei SH die Position in der Hierarchie ist Anzahl Vorgänger SH = 1 - Höhe des Baumes SA stellt die Ausnutzung der Alternativen in der DTD dar. Und zwar wird ermittelt, wie viele Elemente in der DTD als Alternativen definiert sind. SQ stellt die Ausnutzung der Quantifizierer (?, +, *) dar. Manche Informationen können jedoch nicht der DTD entnommen werden. Z.B. wie oft letztendlich Quantifizierer, wie ‚?’ oder ‚*’ im XML-Dokument auftauchen. Aus diesem Grunde wird das Gewicht W D folgendermaßen berechnet: DA WD = = DT Anzahl der Dokumente, die dieses Element enthalten Gesamtanzahl der Dokumente Des Weiteren können wir aus der DTD nicht ermitteln, welche Daten oft abgefragt werden und welche nicht so interessant sind. Dies kann nur aus Erfahrungswerten gewonnen werden. Diese müssen im Vorfeld ermittelt werden. Wie man an diese Informationen kommt? Entweder es existieren bereits Systeme mit ähnlichem Inhalt, so dass diese herangezogen werden können oder es wird eine Benutzerumfrage gestartet, wonach demnächst gesucht werden soll. Daraus kann dann die Information ermittelt werden, wie oft ein Element in einer Abfrage herangezogen wird in Relation zur Häufigkeit des Auftretens des Elementes im XML Dokument. Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I Elke Pillis Matrikelnummer: 4798449 QA WQ = = QT Seite: 12 Anzahl der Abfragen, die dieses Element enthalten Gesamtanzahl der Abfragen Zusammenfassend kann dann die Gesamtgewichtung eines Knotens ermittelt werden: DA 1 QA (SH + SA + SQ) + + 6 4 DT 4 QT 1 W= 1 Im 3. Schritt wird nun die Struktur der Datenbank definiert. Als Erstes muss ein Limit bestimmt werden, ab dem die Elemente nicht mehr als Attribute dargestellt werden, sondern als XML Attribute. Dieser Grenzwert kann die Detaillierung der Datenbank deutlich beeinflussen. Er wird natürlich deutlich von der Antwortzeit der Abfragesprache der Datenbank beeinflusst. Als XML Attribute werden dann alle Knoten und deren Unterknoten dargestellt, die unter dem Grenzwert liegen. Der Rest wird als ganz normales Datenbankattribut dargestellt. Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I Elke Pillis Matrikelnummer: 4798449 Seite: 13 4 Zusammenfassung Semistrukturierte Daten gewinnen in Applikationen immer mehr an Bedeutung. XML wird hierbei insbesondere zum Datenaustausch verwendet. Daher spielt die Speicherung von XML Dokumenten in Datenbanken eine große Rolle. Es stellte sich heraus, dass relationale Datenbanken nur eine unbefriedigende Möglichkeit zur Darstellung von XML Dokumenten bieten. Objekt-Relationale Datenbanken erlauben eine größere Flexibilität, die dem Entwickler größeren Wirkungsraum einräumen. OR Datenbanken erlauben eine natürlichere Abbildung von XML Dokumenten als relationale Datenbanken das zulassen. Wir haben nun zwei Abbildungsmethoden gesehen: einmal um ein XML-Dokument in eine relationale und einmal in eine objekt-relationale Datenbank abzubilden. Die Darstellung eines XML-Dokumentes in einer relationalen Datenbank anhand des MONET Modells als binäre Relationen führt jedoch zu einer Menge Tabellen, langen Ladezeiten und hohen Abfragekosten. Um die Struktur einer objekt-relationalen Datenbank zu definieren wurde ein einfacher Algorithmus vorgestellt. Datenbanken wie DB2 mit XML-Erweiterung sind in der Lage die XML-Daten aus dem Dokument in die Datenbank abzubilden, wobei der Benutzer die Abbildung der XML-Elemente in die Datenbankattribute definieren muss. Andererseits sind diese Datenbanken auch in der Lage das XMLDokument ohne Änderung als XML-Attribut zu speichern. Der vorgestellte Algorithmus könnte hierbei helfen, eine Alternative zu wählen. 5 Thesen Zum Abschluss noch ein paar Thesen: 1. Applikationen werden zunehmend mit semistrukturierten Daten umgehen müssen. 2. XML wird sich als Format für den Datenaustausch etablieren. 3. Einige Bestandteile semistrukturierter Daten lassen sich nur schwierig oder gar nicht auf Relationenattribute ausrichten. 4. Ein kleines Datenbankschema mit der geringsten möglichen Anzahl Relationen führt zu schwach gefüllten Relationen. 5. Die Vermeidung schwach gefüllter Relationen bedeutet ein großes Datenbankschema mit vielen Relationen und damit eine Streuung der Daten. 6. Durch die Natur semistrukturierter Daten entstehen zwangsläufig NULL-Werte in der Datenbank. 7. Objekt-relationale Datenbankmanagementsysteme sind dafür besser geeignet als relationale Datenbankmanagementsysteme. 8. Ein hybrider Ansatz zur Speicherung von semistrukturierten Daten stellt den besten Kompromiss dar. Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I Elke Pillis Matrikelnummer: 4798449 Seite: 14 Anhang A: Abbildungsverzeichnis Abbildung 1-1 Problem bei der Speicherung eines Baumes in eine Datenbank .....................................................................2 Abbildung 1-2 Vergleich XML und RDBMS (Software AG) ...............................................................................................2 Abbildung 2-1 Syntaxbaum ......................................................................................................................................3 Abbildung 2-2 Tabellenaufbau ..................................................................................................................................5 Abbildung 3-1 Relation Hotel ....................................................................................................................................7 Abbildung 3-2 Relation Hotel mit Alternativen ...............................................................................................................8 Abbildung 3-3 Relation Hotel ....................................................................................................................................8 Abbildung 3-4 Relation Hotel.Adresse .........................................................................................................................8 Abbildung 3-5 Relation Hotel.Stadt.Straße ...................................................................................................................8 Abbildung 3-6 Relation Hotel....................................................................................................................................9 Abbildung 3-7 Relation Hotel ....................................................................................................................................9 Abbildung 3-8 Graph zum Zimmerverzeichnis .............................................................................................................10 Abbildung 3-9 Knoten Gewichte ..............................................................................................................................11 Anhang B: Literatur und Links B 1 Basisliteratur [1] Albrecht Schmidt, Martin Kersten, Menzo Windhouwer und Florian Waas, Efficient Relational Storage and Retrieval of XML Documents [2] Meike Klettke und Holger Meyer, XML and Object-Relational Database Systems – Enhancing Structural Mappings Based On Statistics B 2 Links im Internet [3] www.b-es.de/uni/seminar/xml-abbildungen/ Stefan Huber, XML Abbildungen in relationale Datenbanken B 3 Weiterführende Literatur [4] Timm, Jens, Speicherung von XML-Dateien in Objekt-relationalen Datenbanken, Diplomarbeit [5] Michaela Wenger, Stefan Vielgut, Speicherung von semistrukturierten Daten Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I Elke Pillis Matrikelnummer: 4798449 Seite: Anhang C: Vortragsfolien Seminar 01912 XML und Datenbanken Thema: Relationale DBMS I 15 Seminar 1912 "XML und Datenbanken" Fernuniversität Hagen Sommersemester 2002 Thema 9: Speicherung von XML-Dokumenten in relationalen Datenbanksystemen II Name: Oliver Schmidt Verwendete Artikel: • D. Florescu und D. Kossmann. A Performance Evaluation of Alternative Mapping Schemes for Storing XML Data in a Relational Database. • J. Shanmugasundaram, K. Tufte, C. Zhang, G. He, D. J. DeWitt und J. F. Naughton. Relational Databases for Querying XML Documents: Limitations and Opportunities. Seite 1 Inhaltsverzeichnis: 1 Einleitung und Abgrenzung............................................................................ 3 2 Der Ansatz von Florescu/Kossmann ............................................................... 4 2.1 Der Kantenansatz („Edge Approach“)..................................................... 5 2.1.1 Der Kantenansatz mit Separaten Datenwert-Tabellen...................... 6 2.1.2 Der Kantenansatz mit Inlining......................................................... 7 2.2 Der Attributansatz („Attribute Approach“) ............................................. 7 2.3 Der Universelle-Tabelle-Ansatz („Universal Table Approach“) .............. 8 2.4 Der Normalisierte-Universelle-Tabelle-Ansatz („Normalized Universal Table Approach“)............................................................................................... 8 2.5 3 Performance ........................................................................................... 9 Der Ansatz von Shanmugasundaram et al....................................................... 9 3.1 Die Basic Inlining Technik ..................................................................... 9 3.2 Die Shared Inlining Technik ..................................................................10 3.3 Die Hybrid Inlining Technik..................................................................10 4 Transformation der semistrukturierten Abfragen in SQL ...............................10 5 Vorteile und Vergleich der Ansätze...............................................................11 6 5.1 Vorteile und Probleme der vorgestellten Ansätze...................................11 5.2 Vorteile im Vergleich zu anderen Datenbanksystemen...........................11 Zusammenfassung.........................................................................................12 Abkürzungsverzeichnis 13 Literaturverzeichnis 14 Seite 2 1 Einleitung und Abgrenzung Das XML-Format [BPSM00] wird als eines der heutigen und zukünftigen Standardformate für die Verarbeitung und den Austausch von Daten im Internet gesehen. Bei diesem Format handelt es sich um semistrukturierte Daten, welche sich von strukturierten Daten, wie man sie etwa in relationalen Datenbankschemata findet, unterscheidet. Relationale bzw. objektrelationale Datenbanksysteme stellen heute den Standardanwendungsfall für den Großteil der Datenspeicherung in der Praxis dar. Daraus ergibt sich die Notwendigkeit nach Ansätzen zu suchen, wie XMLDaten in relationalen Systemen gespeichert werden können, um die in der Praxis bestehenden hochperformanten relationalen Datenbanksysteme auch weiterhin nutzen zu können. Die nachfolgenden Ausführungen behandeln die Speicherung von XMLDokumenten in relationalen Datenbanksystemen (im folgenden abgekürzt: RDBS). Nicht dargestellt werden somit die Speicherung von XML-Dokumenten in objektrelationalen Datenbanksystemen unter Verwendung der zusätzlichen nicht- relationalen Eigenschaften [Timm99], die Speicherung in objektorientierten Datenbanksystemen [ABK+00:427] [ScEC01:45] [CACS94], in Datenbanksystemen speziell für XML-Dokumente [FiKM01] [Schö01] [ScBi01:157] bzw. Datenbanksystemen für semistrukturierte Daten im allgemeinen [McAG+97] [LOTU02] sowie ebenfalls nicht die Speicherung von XML-Dokumenten in sonstigen (teils historisch veralteten) Datenspeicherungsansätzen. Die vorliegende Darstellung umfasst dabei die Speicherung von XML-Dokumenten und die Wiederherstellung des Original-XML-Dokuments aus dem relationalen Datenbanksystem sowie die dabei auftretende Performance. Ebenfalls nicht dargestellt werden somit die Erstellung und Extrahierung von vorher nicht existenten XML-Dokumenten aus einem relationalen bzw. objektrelationalen Datenbanksystem bzw. -schema [FeTS00] [CFI+00] [SSC+01]. Es existieren verschiedene theoretische Ansätze zur Speicherung von XMLDokumenten in relationalen Datenbanksystemen. Hier dargestellt werden die Speicherung nach Florescu/Kossmann [FlKo99a] und kurz die Speicherung nach ShanSeite 3 mugasundaram et al. [STZ+99], die ihrerseits jeweils mehrere verschiedene Ansätze vorschlagen. Weitere Ansätze sind in [SYU99] [KlMe01] [SKWW01] zu finden. 2 Der Ansatz von Florescu/Kossmann Der Ansatz von Florescu/Kossmann beruht auf Graphen. Dabei ist jedes XMLElement (Objekt) ein Knoten im Graphen. Die Kanten sind die Attribute, die Blätter des Graphen die Datenwerte. Die Kanten unmittelbar vor den Blättern werden von Florescu/Kossmann als Datenattribute bezeichnet. Das folgende Beispiel aus Florescu/Kossmann [FlKo99a:5,7] soll dies verdeutlichen: Seite 4 Die Abbildung in Relationen lässt sich nun anhand von zwei Dimensionen durchführen: (1) Darstellung der Attribute und (2) Darstellung der Datenwerte. Florescu/Kossmann schlagen vier Ansätze für die erste Dimension vor und zwei Ansätze für die zweite Dimension. Dabei lassen sich jeweils die vier Ansätze der ersten Dimension mit jeweils beiden Ansätzen der zweiten Dimension kombinieren. 2.1 Der Kantenansatz („Edge Approach“) Dieser Ansatz basiert auf der ersten Dimension, d.h. wie die Attribute dargestellt werden. Dabei werden alle Attribute in einer einzigen Tabelle gespeichert. Diese Tabelle enthält die Oids der XML-Quelle, die Oids des Zielelements, den Namen des Attributs, ein Flag das darüber Auskunft gibt ob es sich um eine Inter-ElementReferenz handelt oder um den Verweis auf einen Datenwert, und eine ordinale Nummer um ggf. wieder die richtige Reihenfolge der XML-Elemente herstellen zu können. Die Tabelle hat damit die folgende Struktur, im folgenden dargestellt anhand eines Beispiels [FlKo99a:10]: Edge(source, ordinal, name, flag, target) Seite 5 Der Kantenansatz lässt sich nun mit den beiden Ansätzen der zweiten Dimension kombinieren. Die zwei Ansätze der zweiten Dimension sind: (1) Separate Datenwert-Tabellen und (2) Inlining. 2.1.1 Der Kantenansatz mit Separaten Datenwert-Tabellen Bei diesem Ansatz wird für jeden Datentyp der Datenwerte des XML-Dokuments eine eigene Tabelle angelegt. Das folgende Beispiel aus [FlKo99a:13] verdeutlicht dies: Seite 6 Dabei ist die Struktur der Relationen die folgende: Vtype(vid, value) 2.1.2 Der Kantenansatz mit Inlining Bei diesem Ansatz werden alle Datenwerte und Attribute in den gleichen Tabellen gespeichert. Demzufolge wird für jeden Datentyp eine eigene Spalte benötigt und eine große Anzahl an NULL-Werten tritt auf. Das Flag wird nicht mehr benötigt. 2.2 Der Attributansatz („Attribute Approach“) Bei diesem Ansatz der ersten Dimension werden alle Attribute mit dem selben Namen in jeweils eine Tabelle gespeichert. Demzufolge entstehen so viele AttributTabellen wie es Attributnamen im Original-XML-Dokument gibt. Jede AttributTabelle hat die folgende Struktur: Aname(source, ordinal, flag, target) Auch hier gilt, dass dieser Ansatz mit beiden Ansätzen der zweiten Dimension (Separate Datenwert-Tabellen, Inlining) kombiniert werden kann. Seite 7 2.3 Der Universelle-Tabelle-Ansatz („Universal Table Approach“) Bei diesem Ansatz werden alle Attribute des Original-XML-Dokuments in einer einzigen universellen Tabelle gespeichert. Die Struktur der Tabelle sieht folgendermaßen aus: Universal(source, ordinaln1, flagn1, targetn1, ordinaln2, flagn2, targetn2, …, ordinalnk, flagnk, targetnk) Auch hier gilt dass dieser Ansatz mit beiden Ansätzen der zweiten Dimension (Separate Datenwert-Tabellen, Inlining) kombiniert werden kann. 2.4 Der Normalisierte-Universelle-Tabelle-Ansatz („Normalized Universal Table Approach“) Dieser Ansatz ist eine Variante des Universelle-Tabelle-Ansatzes, wobei MultiwertAttribute in separaten Overflow-Tabellen gespeichert werden. Für jeden AttributNamen des Original-XML-Dokuments wird somit eine separate Overflow-Tabelle geschaffen. Dadurch ist in der Universellen Tabelle nur noch ein Datensatz pro XML-Element vorhanden und die Tabelle ist normalisiert. Die Struktur der Tabellen sieht folgendermaßen aus: UnivNorm(source, ordinaln1, flagn1, targetn1, ordinaln2, flagn2, targetn2, …, ordinalnk, flagnk, targetnk) Overflown1(source, ordinal, flag, target), … Overflownk(source, ordinal, flag, target). Auch hier gilt dass dieser Ansatz mit beiden Ansätzen der zweiten Dimension (Separate Datenwert-Tabellen, Inlining) kombiniert werden kann. Seite 8 2.5 Performance Florescu/Kossmann untersuchen auch die Performance ihrer Vorschläge. Sie untersuchen dabei welchen Speicherplatz die Tabellen benötigen, die Transformationsund Speicherzeit vom XML-Dokument bis zu den fertigen Relationen, die Zeit um das Original-XML-Dokument wiederherzustellen sowie die Laufzeiten von Abfragen und Update-Funktionen für die jeweils verschiedenen Ansätze. Die beste Performance weist dabei der Attributansatz mit Inlining auf. 3 Der Ansatz von Shanmugasundaram et al. Shanmugasundaram et al. [STZ+99] untersuchen drei verschiedene Varianten: - (1) Basic Inlining Technik - (2) Shared Inlining Technik - (3) Hybrid Inlining Technik. Dabei betrachten Sie die DTD. Problem ist dabei, dass die DTDs vereinfacht werden müssen, z.B. um komplexe Verschachtelungen und Fragmentierungen innerhalb der DTD zu umgehen. 3.1 Die Basic Inlining Technik Die Basic Inlining Technik versucht das Problem zu lösen, indem sie möglichst viele Subelemente in eine einzige Relation hereinnimmt („inlining“). Dabei wird für jedes Element eine eigene Relation angelegt. Problem ist dabei, dass es trotzdem vorkommen kann, dass für gleiche Elemente mehrere Relationen angelegt werden. Seite 9 3.2 Die Shared Inlining Technik Die Shared Inlining Technik versucht die Nachteile der Basic Inlining Technik zu umgehen. Dabei werden die Elemente identifiziert, die bei der Basic Inlining Technik in verschiedenen Relationen angelegt sind und sie anschließend zu teilen indem separate Relationen für diese Elemente angelegt werden. 3.3 Die Hybrid Inlining Technik Die Hybrid Inlining Technik ist ähnlich zur Shared Inlining Technik nur mit dem Unterschied, dass zusätzlich Elemente in die jeweilige Relation hereingenommen werden. 4 Transformation der semistrukturierten Abfragen in SQL Für die Speicherung von XML-Dokumenten in relationalen Datenbanken ist es notwendig die semistrukturierten Abfragesprachen in SQL zu transformieren, um Tabellen anzulegen, mit Datenwerten zu füllen, upzudaten, zu löschen sowie auch abzufragen um ggf. das Original-XML-Dokument wieder herstellen zu können. Geeignet hierfür ist zum Beispiel XML-QL, welche es im Vergleich zu anderen Sprachen auch ermöglicht Abfragen nach bestimmten Mustern zu erstellen [FlKo99a:16]. Ein Beispiel für XML-QL ist das folgende [FlKo99a:8]: Seite 10 5 Vorteile und Vergleich der Ansätze 5.1 Vorteile und Probleme der vorgestellten Ansätze Der Ansatz von Florescu/Kossmann hat den Vorteil, dass er einfach ist. Es wird ausschließlich das XML-Dokument betrachtet. Nachteile hingegen sind, dass beim Ansatz von Florescu/Kossmann die Unterscheidung von Attributen und Subelementen verloren geht. Außerdem geht die Information über XML-Referenzen verloren. Die Autoren merken jedoch an, dass sich beides über zusätzlichen Aufwand lösen ließe. Ebenfalls nicht betrachtet wird die DTD, womit diese Informationen nicht gespeichert werden können. Mit der Weiterentwicklung der XML-Schema in nächster Zeit und der möglichen Ablösung der DTD durch andere Möglichkeiten wird dieser Nachteil jedoch ggf. wieder abgeschwächt. Shanmugasundaram et al. hingegen beziehen ihre Ansätze auf die DTD womit dieser Ansatz umfassender ist. 5.2 Vorteile im Vergleich zu anderen Datenbanksystemen Die RDBS sind ausgereift und skalierfähig, wohingegen spezielle XMLDatenbanksysteme insbesondere für die Speicherung großer Datenmengen noch einige Zeit benötigen um ausgereifter zu werden. OODB hingegen sind insbesondere bei Abfragen aus großen Datenmengen noch verbesserungswürdig. Außerdem ist zu beachten, dass sich in der betrieblichen Praxis viele IT-Experten mit RDBS auskennen und auf bestehende Systeme zurückgegriffen werden kann. Strukturierte und unstrukturierte Daten können in RDBS koexistieren. Nachteil hingegen ist, dass die RDBS gebaut wurden, um strukturierte Daten zu verwalten und nicht für semistrukturierte Daten. Im Vergleich zu anderen, speziellen XML-Datenbanken können sich somit je nach verwendetem Ansatz und dem zu speichernden XML-Dokument mehr oder weniger große Performance-Probleme ergeben wie sie in Florescu/Kossmann und Shanmugasundaram et al. beschrieben sind. Seite 11 6 Zusammenfassung Die vorliegende Ausarbeitung hat den Ansatz von Florescu/Kossmann zur Speicherung von XML-Dokumenten in relationalen Datenbanken vorgestellt. Ebenfalls kurz betrachtet wurde ein zweiter Ansatz von Shanmugasundaram et al. Die Ansätze zeigen, dass relationale Systeme eine mögliche Speicherform zur Speicherung von XML-Dokumenten sind. Dies ist insbesondere wichtig, um bestehende relationale Systeme und Kapazitäten nutzen zu können. Seite 12 Abkürzungsverzeichnis: DTD Document Type Descriptors/Document Type Definition Oid Object ID OODBS Objektorientiertes Datenbanksystem ORDBS Objektrelationales Datenbanksystem RDBS Relationales Datenbanksystem SQL Structured Query Language Vid Value ID XML Extensible Markup Language XML-QL XML Query Language Seite 13 Literaturverzeichnis: [ABK+00] R. Anderson, M. Birbeck, M. Kay, u.a. XML professionell. Bonn, 2000 [BPSM00] T. Bray, J. Paoli, C. M. Sperberg-McQueen und E. Maler. Extensible Markup Language (XML). Second Edition, W3C Recommendation, 2000 http://www.w3.org/TR/REC-xml [CFI+00] M. J. Carey, D. Florescu, Z. G. Ives, Y. Lu, J. Shanmugasundaram, E. J. Shekita und S. N. Subramanian. XPERANTO: Publishing Object-Relational Data as XML. WebDB (Informal Proceedings), 105110, 2000 http://www.cs.cornell.edu/People/jai/pubs.html [CACS94] V. Christophides, S. Abiteboul, S. Cluet und M. Scholl. From structured documents to novel query facilities. Proc. of ACM SIGMOD Conf. on Management of Data, 1994 [Ende01] J. Enderle: XML in relationalen Datenbanken. Informatik Spektrum 24(6), 357-368, 2001 [FeTS00] M. F. Fernandez, W. C. Tan und D. Suciu. SilkRoute: Trading Between Relations and XML. WWW9 / Computer Networks 33(1-6), 723-745, 2000 http://www.cs.washington.edu/homes/suciu/NodeInternal,sitegraph.g enoid_2.html [FiKM01] T. Fiebig, C.-C. Kanne und G. Moerkotte. Natix - ein natives XMLDBMS. Datenbank-Spektrum 1 (2001), 5-13, 2001 [FlKo99a] D. Florescu und D. Kossmann. A Performance Evaluation of Alternative Mapping Schemes for Storing XML Data in a Relational Database. INRIA Technical Report No. 3680, 1999, http://www-rodin.inria.fr/Fmbrepubs_dana.html [FlKo99b] D. Florescu und D. Kossmann. Storing and Quering XML Data using an RDMBS. IEEE Date Engineering Bulletin 22(3), 27-34, 1999 http://www.cs.washington.edu/homes/suciu/PAPERS/florescukossman.pdf Seite 14 [KlMe01] M. Klettke und H. Meyer. XML and Object-Relational Database Systems - Enhancing Structural Mappings Based on Statictics. In: D. Suciu und G. Vossen (Hrsg.): The World Wide Web and Databases: selected Papers / Third International Workshop WebDB 2000, Dallas, TX, USA, May 18-19, 2000. S. 151-170, Berlin, 2001 http://wwwdb.informatik.uni-rostock.de/xml/ [LOTU02] Lotus Notes. http://www.lotusnotes.com/, 2002 [McAG+97] J. McHugh, S. Abiteboul, R. Goldmann, D. Quass und J. Widom. Lore: A database management system for semistructured data. SIGMOD Record 26(3), 54-66, 1997 [ScBi01] H. Schinzer und N. Bieber. Virtuell Integrierte Netzwerke und XML. In: K. Turowski und K. J. Fellner (Hrsg.): XML in der betrieblichen Praxis: Standards, Möglichkeiten, Praxisbeispiele. S. 151-167, Heidelberg, 2001 [ScEC01] C. Schmauch, C. Ey und S. Closs. Content-Management: Speichertechniken und der Einsatz von Directory-Servern. In: K. Turowski und K. J. Fellner (Hrsg.): XML in der betrieblichen Praxis: Standards, Möglichkeiten, Praxisbeispiele. S. 29-54, Heidelberg, 2001 [SKWW01] A. Schmidt, M. L. Kersten, M. Windhouwer und F. Waas. Efficient Relational Storage and Retrieval of XML Documents. In: D. Suciu und G. Vossen (Hrsg.): The World Wide Web and Databases: selected Papers / Third International Workshop WebDB 2000, Dallas, TX, USA, May 18-19, 2000. S. 137-150, Berlin, 2001 http://www.cwi.nl/htbin/ins1/publications?request=papers [Schö01] H. Schöning. Tamino - A DBMS designed for XML. ICDE 2001, 149-154, 2001 [SSC+01] J. Shanmugasundaram, E. J. Shekita, R. Barr, M. J. Carey, B. G. Lindsay, H. Pirahesh und B. Reinwald: Efficiently Publishing Relational Data as XML documents. VLDB Journal 10(2-3), 133-154, 2001 http://www.cs.cornell.edu/People/jai/pubs.html [STZ+99] J. Shanmugasundaram, K. Tufte, C. Zhang, G. He, D. J. DeWitt und Seite 15 J. F. Naughton. Relational Databases for Quering XML Documents: Limitations and Opportunities. VLDB 1999, 302-314, 1999 http://www.cs.cornell.edu/People/jai/papers/RdbmsForXML.pdf [SYU99] T. Shimura, M. Yoshikawa und S. Uemura. Storage and Retrieval of XML Documents using Object-Relational Databases. http://citeseer.nj.nec.com/shimura99storage.html [Timm99] J. Timm. Speicherung von XML-Dateien in Objekt-relationalen Datenbanken. Diplomarbeit Universität Rostock, Fachbereich Informatik, 1999 http://wwwdb.informatik.uni-rostock.de/xml/sada/da-timm.html Seite 16 FernUniversität Hagen Fachbereich Informatik Lehrgebiet Praktische Informatik IV Prof. Güting XML-Sichten auf relationale Datenbanken Helmut Hüsges basierend auf: M. F. Fernandez, W. C. Tan und D. Suciu. SilkRoute: Trading Between Relations and XML M. J. Carey, D. Florescu, Z. G. Ives, Y. Lu, J. Shanmugasundaram, E. J. Shekita und S. N. Subramanian: XPERANTO: Publishing Object-Relational Data as XML J. Shanmugasundaram, E. J. Shekita, R. Barr, M. J. Carey, B. G. Lindsay, H. Pirahesh und B. Reinwald: Efficiently Publishing Relational Data as XML documents -2- 1 Motivation Fast alle Datenbestände sind heutzutage in relationalen oder objekt-relationalen Datenbanken gespeichert. Andererseits setzt sich XML als universelles Datenaustauschformat immer mehr durch. Eine Möglichkeit, Datenbestände aus relationalen oder objekt-relationalen Datenbanken für XML-basierte Anwendungen zugänglich zu machen, sind XML-Sichten. XML-Sichten definieren auf den Daten einer Datenbank ein virtuelles XML-Dokument. Die Daten können so dem Zugriff mit XML-Abfragesprachen zugänglich gemacht und/oder einer von außen vorgegebenen DTD angepasst werden. Zwei Punkte sind dabei besonders hervorzuheben: XML-Sichten sind virtuelle XML-Dokumente und können mit XML-Abfragesprachen (bei beiden im folgenden vorgestellten Systemen mit XML-QL) abgefragt werden XML-Sichten sind virtuelle XML-Dokumente. Abfragen auf XML-Sichten werden von den hier vorgestellten Systemen mit der Abfrage zur Sichtdefinition kombiniert. Diese kombinierten Abfragen werden vom Datenbanksystem ausgewertet, was gegenüber der Auswertung von Abfragen auf echten (materialisierten) XML-Dokumenten einen erheblichen Performancevorsprung bedeutet. Als Beispiel soll die in Abb. 1 dargestellte Datenbank mit Informationen über Klettergebiete dienen. Sie enthält neben Teilen, die veröffentlicht werden sollen in der Tabelle "Begehung" auch Daten, die vor externen Benutzern verborgen bleiben sollen.Im folgenden wird gezeigt, wie Informationen aus dieser Datenbank mit den Middleware-Systemen SilkRoute[1] und XPERANTO[2] als XML-Sicht (s. Abb. 2) entsprechend der in Abb. 3 gezeigten DTD zur Verfügung gestellt werden können. Die Abschnitte 2 und 3 erläutern die Philosophie und die Architektur der beiden Systeme, Abschnitt 4 zeigt, wie jeweils Sichten definiert werden. Abschnitt 5 behandelt den komplexesten Teil dieser Programme, die effektive Zusammensetzung von Abfragen. Bevor in Abschnitt 7 die Übersetzung in SQL-behandelt wird, erörtert Abschnitt 6 grundlegende Möglichkeiten dieser Umsetzung und stellt kurz einen anderen Ansatz, nämlich die Definition von XMLSichten innerhalb einer Datenbank mit entsprechender Erweiterung von SQL dar. In Abschnitt 8 wird kurz die Erzeugung des XML-Dokuments dargestellt, in Abschnitt 9 folgt ein Vergleich der vorgestellten Systeme. GebietID* G1 Name Gestein Frankenjura Kalk G2 Pfalz Tabelle Gebiet FelsID* GebietID Sandstein Name kinderfreundlich F1 G1 Student nein F2 G2 Heufels ja F3 G1 Tabelle Fels Ankatalwand ja -3RoutenID* FelsID Name Laenge Schwierigkeit Ausrichtung R1 F3 Computerspiele 18 8 SW R2 F3 Internet 18 9 SW Simon 15 10 S R3 F1 Tabelle Route RoutenID* R1 Datum 24.05.1998 R2 03.05.2001 Tabelle Begehung Abb. 1: Tabellen der Datenbank Klettern <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE KLETTERGEBIET SYSTEM "klettergebiet.dtd"> <GEBIETE> <Gebiet Name = "Frankenjura" Gestein= "Kalk"> <Fels Name="Student" kinderfreundlich = "nein"> <Route Name="Simon"> <Länge>15</ Länge> <Schwierigkeit>10</ Schwierigkeit> <Ausrichtung>S</Ausrichtung> </Route> </Fels> <Fels Name="Ankatalwand" kinderfreundlich = "ja"> <Route Name="Computerspiele"> <Länge>18</ Länge> <Schwierigkeit>8</ Schwierigkeit> <Ausrichtung>SW</Ausrichtung> </Route> <Route Name="Internet"> <Länge>18</ Länge> <Schwierigkeit>9</ Schwierigkeit> <Ausrichtung>SW</Ausrichtung> </Route> </Fels> </Gebiet> <Gebiet Name = "Pfalz" Gestein= "Sandstein"> <Fels Name="Heufels" kinderfreundlich = "ja"/> </Gebiet> <GEBIETE> Abb. 2: Klettergebiete : XML-Sicht auf die Daten der Datenbank Klettern -4<!-- klettergebiet.dtd (version 1.0) --> <!ELEMENT GEBIETE (Gebiet*)> <!ELEMENT Gebiet (Fels*)> <!ATTLIST Gebiet Name CDATA #REQUIRED Gestein CDATA #REQUIRED> <!ELEMENT Fels (Route*,Info?)> <!ATTLIST Fels Name CDATA #REQUIRED kinderfreundlich (ja|nein) #IMPLIED> <!ELEMENT <!ATTLIST <!ELEMENT <!ELEMENT <!ELEMENT Route (Länge, Schwierigkeit, Ausrichtung?, Info?)> Route Name CDATA #REQUIRED> Länge (#PCDATA)> Schwierigkeit (#PCDATA)> Ausrichtung (N|NO|O|SO|SW|W|NW) > <!ELEMENT Info (#PCDATA)> Abb.3: Eine mögliche DTD für die XML-Sicht auf die Daten der Datenbank Klettern 2 Philosophie 2.1 SilkRoute SilkRoute ist in erster Linie dafür gedacht, Daten aus einer relationalen Datenbank auf eine (möglicherweise von außen vorgegebene) DTD abzubilden und als XML-Sicht zur Verfügung zu stellen. Als wesentliche Vorteile von SilkRoute gegenüber existierenden Systemen werden in [1] hervorgehoben: SilkRoute ist allgemein: die Daten aus einer relationalen Datenbank können auf eine beliebige DTD abgebildet werden SilkRoute ist dynamisch: die erzeugte XML-Sicht ist, wie oben bereits erwähnt, virtuell und wird erst im Zusammenhang mit Benutzerabfragen materialisiert SilkRoute ist effizient: für die Beantwortung der Benutzerabfragen wird das (schnelle) zugrunde liegende Datenbanksystem genutzt 2.2 XPERANTO Der Ansatz von XPERANTO ist ähnlich, aber umfassender. Zusätzlich zu den bei SilkRoute genannten Punkten wird in [2] folgendes hervorgehoben XPERANTO macht die Datenbestände auch ohne vorherige Abbildung auf eine DTD in einer Standardsicht zugänglich. XPERANTO ist rein XML-basiert, Sichtdefinition und Benutzerabfragen erfolgen in einer XML-Abfragesprache XPERANTO erlaubt nicht nur den Zugriff auf die Datenbestände der Datenbank, sondern auch auf Meta-Daten (Katalog-Information) XPERANTO unterstützt auch den Zugriff auf objekt-relationale Datenbanken (SQL 99) 3 Architektur Beide hier vorgestellten Systeme haben einen prinzipiell sehr ähnlichen Aufbau. Benutzeranfragen, die von außen (z.B. über's Internet) eingehen, werden zunächst im XML-QLParser geparst. Der Abfrage-Zusammensetzer (s. Kap. 5) erzeugt aus der Benutzeranfrage und einer vorgegebenen Sichtdefinition (s. Kap. 4) eine zusammengesetzte Anfrage -5in einer systemspezifischen internen Sprache. Die zusammengesetzte Anfrage wird vom Anfrage-Übersetzer (s. Kap. 7) in eine SQL-Anfrage übersetzt. Aus dem vom Datenbanksystem gelieferten Ergebnis erzeugt der XML-Erzeuger (s. Kap. 8) ein XMLDokument, das an den Benutzer weitergegeben wird. Anwendung Sichtdefinition (RXL) XML-Dokument Abfrage(XML-QL) XML-Schema XML-QL Parser Sicht-Definition Sicht-Verwaltung AbfrageZusammensetzer KatalogInformation AbfrageÜbersetzer Abfrage(SQL) beide Systeme XMLErzeuger XML-Schema Erzeuger XML/DB Vermittler XML-Template Ergebnis (Tupel) Datenbank XPERANTO SilkRoute Abb. 4: Aufbau der Systeme zur Vermittlung zwischen XML und Datenbanken Im Detail gibt es im Aufbau der beiden hier vorgestellten System einige Unterschiede: Bei SilkRoute muss zunächst eine Sicht auf die Daten definiert werden, die festlegt, welche Daten aus der Datenbank nach außen (d.h. für die Anwendung) sichtbar sind. Diese wird zusammen mit der Benutzeranfrage in den Abfrage-Zusammensetzer eingespeist. XPERANTO generiert automatisch eine Standard-XML-Sicht in Form eines XMLSchemas auf die Datenbank. Zusätzlich können weitere Sichten definiert werden, die in einer Sicht-Verwaltung gespeichert werden. Diese Sichten werden auf der Grundlage der Standard-XML-Sicht mit einer XML-Abfragesprache (zur Zeit XML-QL) definiert. XPERANTO verwendet in mehreren Teilsystemen Katalog-Information aus der Datenbank: für die Definition der Standard-XML-Sicht, bei der Auswertung von Anfragen, wenn sich diese (was bei SilkRoute nicht vorgesehen ist) auf Metadaten beziehen, sowie für die Erzeugung des XML-Schemas. -6XPERANTO erzeugt zusätzlich zum XML-Dokument ein XML-Schema. Hierzu dient das Teilsystem XML-Schema-Erzeuger. Der Anfrage-Übersetzer von SilkRoute erzeugt ein XML-Template für den XML-Erzeuger. Bei der Beschreibung von XPERANTO ist ein solches Template nicht erwähnt, in irgendeiner ähnlichen Form muss der XML-Erzeuger aber auch dort erfahren, welche Tags in welcher Reihenfolge eingefügt werden müssen. 4 Definition von Sichten 4.1 SilkRoute Bei SilkRoute muss zunächst eine Sicht auf die Datenbank definiert werden, bevor Abfragen möglich sind. Für die Sichtdefinition wird eine eigene Sprache benutzt, RXL (Relational to XML transformation Language), die sich im wesentlichen aus der constructAnweisung von XML-QL und from ,where, sort by und/oder group by -Anweisungen aus SQL zusammensetzt. Die Sichtdefinition für Klettergebiete aus Abb. 1 auf der Grundlage der DTD aus Abb 3. lautet dann: from Gebiet $g construct <GEBIETE> <Gebiet Name=$g.Name Gestein=$g.Gestein> { from Fels $f where $f.GebietId = $g.GebietID construct <Fels Name = $f.Name kinderfreundlich=$f.kinderfreundlich> { from Route $r where $r.FelsID = $f.FelsID construct <Route Name=$r.Name> <Länge>$r.Laenge</> <Ausrichtung>$r.Ausrichtung</> <Schwierigkeit>$r.Schwierigkeit</> </> } </> } </> </> Abb. 5: RXL-Sichtdefinition für die XML-Sicht aus Abb. 2 4.2 XPERANTO XPERANTO stellt eine Standard-Sicht auf die Datenbank zur Verfügung. Deren Aufbau wird mit Hilfe eines XML-Schemas beschreiben, das für das hier vorgestellte Beispiel so aussieht: <?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <complexType name ="gebietTupelType"> <element name= "GebietID" type="string"/> <element name= "Name" type="string"/> <element name= "Gestein" type="string"/> </complexType> -7- <complexType name ="gebietSetType"> <element name= "gebietTupel" type="gebietTupelType" maxOccurs="*"/> </complexType> <element name="gebiet" type="gebietSetType"/> <complexType name ="felsTupelType"> <element name= "FelsID" type="string"/> <element name= "GebietID" type="string"/> <element name= "Name" type="string"/> <element name= "kinderfreundlich" type="bool"/> </complexType> <complexType name ="felsSetType"> <element name= "felsTupel" type="felsTupelType" maxOccurs="*"/> </complexType> <element name="fels" type="felsSetType"/> <complexType name ="routeTupelType"> <element name= "RoutenID" type="string"/> <element name= "FelsID" type="string"/> <element name= "Name" type="string"/> <element name= "Laenge" type="integer"/> <element name= "Schwierigkeit" type="integer"/> <element name= "Ausrichtung" type="string"/> </complexType> <complexType name ="routeSetType"> <element name= "routeTupel" type="routeTupelType" maxOccurs="*"/> </complexType> <element name="route" type="routeSetType"/> <complexType name ="begehungTupelType"> <element name= "RoutenID" type="string"/> <element name= "Datum" type="date"/> </complexType> <complexType name ="begehungSetType"/> <element name= "begehung" type="begehungTupelType" maxOccurs="*"/> </complexType> <element name="begehung" type="begehungSetType"/> </schema> Abb. 5: Schema der von XPERANTO produzierten Standard-Sicht auf die Datenbank -8Ausgehend von diesem Schema können nun direkt Anfragen in XML-QL formuliert werden. Die diesem Schema entsprechende XML-Sicht entspricht aber nicht der in Abb. 3 dargestellten DTD. Um Anfragen entsprechend dieser DTD zu ermöglichen, kann aufbauend auf die Standardsicht eine neue Sicht mit Hilfe von XML-QL definiert werden. 5 Zusammensetzung von Anfragen aus der Sichtdefinition und Benutzeranfragen Beide Systeme führen aus Performancegründen nicht die Anfragen zur Sichtdefinition und darauf aufbauende Benutzeranfragen getrennt aus, sondern verfügen über Algorithmen, die hieraus neue (schneller zu beantwortende) Abfragen generieren. Performancevorteile gegenüber der Nacheinanderausführung der Abfragen können sich z.B. ergeben aus: dem Weglassen von Elementen, die in der Sichtdefinition, nicht aber in der Benutzeranfrage enthalten sind der Ausnutzung von Indizes der zugrunde liegenden Datenbank, wenn in einer Benutzeranfrage nach einem eingeschränkten Wertebereich gefragt wird. SilkRoute konstruiert aus einer Benutzeranfrage (in XML-QL) und der Sichtdefinition (in RXL) mit Hilfe eines recht komplexen Algorithmus (Details in [1]) eine neue RXL-Abfrage. Der Abfrage-Zusammensetzer von XPERANTO verfolgt das Ziel, komplexen Benutzeranfragen auf ebenfalls (möglicherweise) komplexen benutzerdefinierten Sichten eine möglichst einfache Anfrage auf der Standard-Sicht zurückzuführen. Alle Abfragen werden zunächst in eine interne Repräsentation (XQGM XML Query Graph Model) überführt. Diese interne Repräsentation ist eng angelehnt an QGM, die intere Repräsentation von SQL-Abfragen in IBM's DB2 Datenbanksystem. 6 Implementierungsalternativen für das Erzeugen von XML-Dokumenten aus Daten in relationalen Datenbanken In den folgenden Abschnitten werden verschiedene Strategien zur Erzeugung von XMLDokumenten aus dem Inhalt von relationalen Datenbanken betrachtet. Abschnitt 6.1 beschäftigt sich mit der Frage, welches Programm (das Datenbanksystem oder ein externes System) diese Umsetzung vornimmt. Die folgenden Abschnitte diskutieren die Reihenfolge der bei der Umsetzung erforderlichen Schritte Gewinnung der Daten Strukturierung der Daten Einfügen der Tags Hierbei werden nur die Ansätze näher erläutert, bei denen ein Teil der Arbeit außerhalb des Datenbanksystems stattfindet. Diese Ansätze erfordern keine Erweiterung von SQL und können somit von Middleware wie SilkRoute oder XPERANTO in Zusammenarbeit mit einer beliebigen relationalen Datenbank genutzt werden. 6.1 Komplett innerhalb oder teilweise außerhalb der Datenbank Mit einigen Erweiterungen von SQL könnten relationale Datenbanken direkt XML-Dokumente erzeugen. Die Abfrage entsprechend der in Abb. 3 gezeigten DTD hätte dabei folgende Form: Select GEBIET(Gebiet.Name,Gebiet.Gestein (Select XMLAGG(FELS(Fels.Name,Fels.kinderfreundlich) (Select XMLAGG(ROUTE(Route.Name, Route.Länge, -9Route.Schwierigkeit, Route.Ausrichtung)) From Route Where Route.FelsID = Fels.FelsID ) From Fels Where Fels.GebietID = Gebiet.GebietID) From Gebiet Abb.7: Abfrage mit SQL-Erweiterung für die Sichtdefinition innerhalb der Datenbank Dies ist eine geschachtelte SQL-Abfrage, die die XML-Konstruktoren GEBIET(), FELS() und ROUTE() benutzt und die XMLAGG-Funktion benutzt, um als Ergebnis ein XML-Dokument zu erhalten. XML-Konstruktoren sind Funktionen, die aus den übergebenen Parametern (Daten der Datenbank und XML-Fragmente) XML-Fragmente erzeugen. Die XMLAGG-Funktion reiht die von einem XML-Konstruktor für ein Tupel einer Tabelle gelieferten XML-Fragmente aneinander. Als Beispiel für einen XML-Konstruktor zeigt Abb. 8 den Konstruktor GEBIET(). Dieser erfordert als Parameter Name und Gestein eines Klettergebiets sowie eine XML-Liste von (zugehörigen) Felsen. Diese wird vom Konstruktor FELS(), der die Daten für einen einzelnen Felsen erzeugt, zusammen mit der XMLAGG-Funktion, die XML-Fragmente der einzelnen Felsen aggregiert, geliefert. Analog liefert der XML-Konstruktor ROUTE() ein XML-Fragment für eine einzelne Route und XMLAGG(ROUTE(...)) die aneinander gereihten XML-Fragmente für alle Routen an einem Felsen. create function GEBIET(gebName: varchar(20), gebGestein: varChar(20), felsList: xml) returns xml language xml return <Gebiet Name={gebName} Gestein= {gebGestein}> <fels>{felsList}</fels> </Gebiet> Abb. 8: Definition des XML-Konstruktors GEBIET() mit Hilfe der SQL-Erweiterung Dies hätte, wie die Autoren von [3] zeigen, unabhängig vom sonstigen Implementierungsansatz erhebliche Performancevorteile gegenüber allen Lösungen, bei denen die Erzeugung des XML-Dokuments (aus den von der Datenbank gelieferten Daten) außerhalb der Datenbank geschieht. Grund hierfür ist die für die Übergabe der Ergebnisse an ein Programm außerhalb der Datenbank benötigte Zeit. 6.2 Frühe Strukturierung der Daten und frühes Einfügen der XML-Tags Hierbei wird sowohl die Strukturierung der Daten als auch das Einfügen der Tags in einem Programm außerhalb des Datenbanksystems erledigt. Für die als Beispiel verwendete Datenbank wären dabei folgende Schritte erforderlich: Schreiben des Root-Elements ("<GEBIETE>") SQL-Abfrage: select Name, GebietID, Gestein from Gebiete für jedes Gebiet: Schreiben des Gebiet-Elements SQL-Abfrage: select * from Fels where Fels.GebietID = {GebietID} für jeden Fels: Schreiben des Fels-Elements SQL-Abfrage: select * from Route where Route.FelsID = {FelsID} für jede Route: Schreiben des Route-Elements und der inneren Elemente Abb. 9: frühe Strukturierung der Daten und frühes Einfügen der XML-Tags - 10 Dieser Ansatz ist relativ einfach zu implementieren, bei größeren Datenmengen aufgrund der Vielzahl von Abfragen und der vorgegebenen Struktur (keine Optimierungsmöglichkeit für das Datenbanksystem) aus Performancegründen aber nicht praktikabel. 6.3 Späte Strukturierung der Daten und spätes Einfügen der XML-Tags In [3] werden drei verschieden Methoden diskutiert, die auf diesem Ansatz basieren. Die von den Autoren favorisierte dieser drei Methoden wird als (unsorted) node outer union bezeichnet. with gebRoot(gebID varChar(20), gebName varChar(20), Gestein) as select GebietID, Name, Gestein from Gebiet geb ), gebFels(gebID varChar(20), flsID varChar(20), felsName varChar(20), kinderfreundlich boolean) as select geb.GebietID, fls.felsID, fls.Name, fls.kinderfreundlich from geb, Fels fls ), felsRoute(gebID varChar(20), flsID varChar(20), rtName varChar(20), Laenge integer, Schwierigkeit integer, Ausrichtung char(2)) as select fls.GebietID, fls.felsID, rt.Name, rt.Laenge, rt.Schwierigkeit, rt.Ausrichtung from fls, Route rt ), select 0, gebID, gebName, Gestein, null, null, null, null, null, null, null from gebRoot union all select 1, gebID, null, null, flsID, felsName, kinderfreundlich, null, null, null, null from gebFels union all select 2, gebID, null, null, flsID, null, null, rtName, Laenge, Schwierigkeit, Ausrichtung from felsRoute Abb. 10: SQL-Abfrage für node outer union Das Ergebnis ist eine Tabelle, die drei Typen von Tupeln enthält: Typ 0 enthält Informationen über Gebiete Typ 1 enthält Informationen über Felsen Typ 2 enthält Informationen über Routen - 11 typ gebI gebName Gestein fls felsName D ID kinde rtNam Laeng Schwi Ausric rfreun e e erigke htung dlich it 1 G2 F2 Heufels ja 2 G1 F3 1 G1 F3 Ankatalwand 2 G1 2 Comput 18 erspiele 8 SW F3 Internet 18 9 SW G1 F1 Simon 10 S 1 G1 F1 Student 0 G2 Pfalz 0 G1 Frankenjura Kalk ja 15 nein Sandstein Abb. 11: mögliches Abfrageergebnis nach dem (unsorted) node outer union-Ansatz Die Ergebnistabelle ist unsortiert und enthält eine Vielzahl von null-Werten, aber im Gegensatz zu anderen in [3] diskutierten, hier nicht vorgestellten Vorgehensweisen keine redundanten Daten. Im Anschluss an die Abfrage müssen die Daten strukturiert und mit Tags versehen werden. Da die Reihenfolge der Daten nicht vorhersehbar ist, muss die Zusammensetzung des XML-Dokuments im Speicher geschehen und das Dokument kann erst geschrieben werden, wenn alle Daten vorliegen und eingebaut sind. 6.4 Frühe Strukturierung der Daten und spätes Einfügen der XML-Tags Der Speicheraufwand für das Einfügen der Tags entfällt, wenn die Daten innerhalb des Datenbanksystems entsprechend sortiert werden. Hierzu ist ein abschließende Sortierung der Daten ausreichend (sorted node outer union). Im Beispiel muss eine Sortierung nach gebID, felsID und rtName erfolgen, um die richtige Reihenfolge der Tupel sicherzustellen: typ gebI gebName Gestein fls felsName D ID 0 G1 1 G1 F1 Student 2 G1 F1 1 G1 F3 Ankatalwand 2 G1 F3 2 G1 F3 0 G2 1 G2 kinde rtNam Laeng Schwi Ausric rfreun e e erigke htung dlich it Frankenjura Kalk Pfalz nein Simon 15 10 S Comput 18 erspiele 8 SW Internet 18 9 SW ja Sandstein F2 Heufels ja Abb. 12: Abfrageergebnis nach dem sorted node outer union-Ansatz Dadurch, dass null-Werte in der Sortierreihenfolge vor allen echten Werten einsortiert werden, ergibt sich die richtige Reihenfolge der Daten-Tupel. Das Einfügen der Tags wird dadurch sehr einfach, alle Daten können sofort geschrieben werden. Der Tagger braucht nur noch so viel Speicherplatz wie nötig ist, um sich die IDs der Vorgänger des aktuellen Datensatzes (im Beispiel (gebID und flsID) zu merken, um festzustellen, ob ein neuer - 12 Datensatz zum gleichen oder zu einem anderen Felsen oder Gebiet gehört und das entsprechende Tag zu schließen ist. Dieser Speicherplatz ist nur von der Verschachtelungstiefe des XML-Dokuments, aber nicht mehr vom Umfang der auszugebenden Daten abhängig. 6.5 Schlussfolgerungen Die in 6.1 vorgestellte Umsetzung der Inhalte einer Datenbank in XML innerhalb des Datenbanksystems bietet erhebliche Performancevorteile. In [3] wird nicht explizit die Möglichkeit erwähnt, die SQL-Abfrage als Sichtdefinition (CREATE VIEW "Klettergebiet" AS...) virtuell zu halten, jedoch sollte dies durchaus möglich sein. Aber auch dann gibt es im Gegensatz zu SilkRoute und XPERANTO keine Möglichkeit, hierauf aufbauende Benutzeranfragen in einer XML-Abfragesprache effektiv mit der Sichtdefinition zu verknüpfen. Ein weiterer Nachteil besteht darin, dass diese Lösung vom Datenbanksystem bereitgestellt werden muss. Im Gegensatz hierzu können SilkRoute und XPERANTO prinzipiell mit jeder SQL-Datenbank verwendet werden. Sehr vorteilhaft ist die Lösung innerhalb des Datenbanksystems, wenn die vorgeschlagene SQL-Erweiterung von der vorhandenen Datenbank unterstützt wird und der Inhalt der Datenbank im allgemeinen nicht für wechselnde Benutzeranfragen, sondern entsprechend einer oder mehrerer vorgegebener DTD zur Verfügung gestellt werden soll. Für externe Programme wie SilkRoute oder XPERANTO bietet sich der in Abschnitt 6.4 vorgestellte sorted node outer union-Ansatz an, der bei guter Performance auch bei größeren Datenmengen keine Probleme mit dem Speicherplatz beim Einfügen der XML-Tags mit sich bringt. Ungünstig wird dieser Ansatz allerdings dann, wenn das Datenbanksystem keine geeignete Verwaltung von null-Werten bietet. 7 Übersetzung der zusammengesetzten Anfragen in SQL 7.1 SilkRoute Die Umsetzung der (zusammengesetzten) RXL-Anfrage in SQL wird in der Literatur nicht detailliert beschrieben. Komplexere RXL-Anfrage mit mehreren Unter-Anfragen werden in mehrere SQL-Abfragen (eine pro Unter-Abfrage) übersetzt. Alle erzeugten SQL-Abfragen enthalten eine sort by-Anweisung, um aus den aus der SQL-Abfrage resultierenden Tupeln anschließend einfach das XML-Dokument erzeugen zu können. Für das Beispiel sähen die SQL-Anfragen in etwa so aus: 1.Select * from Gebiet sort by GebietID 2.Select * from Fels sort by GebietID 3.Select Fels.GebietID, Fels.FelsID, Route.Name, Route.Laenge, Route.Schwierigkeit, Route.Ausrichtung, from Route, Fels where Route.FelsId = Gebiet.FelsID sort by GebietId, FelsID Abb. 13: SQL-Abfragen für SilkRoute Als Ergebnis erhält man dann die folgenden Tabellen: - 13 - GebietID Name Gestein G1 Frankenjura Kalk G2 Pfalz FelsID GebietID Sandstein Name kinderfreundlich F1 G1 Student F3 G1 Ankatalwand ja F2 G2 Heufels GebietID FelsID nein ja Name G1 F1 Simon G1 F3 G1 F3 Laenge Schwierigkeit Ausrichtung 15 10 S Computerspiele 18 8 SW Internet 9 SW 18 Abb. 14: Abfrageergebnis SilkRoute Bei der Entwicklung von SilkRoute wurde nach Angaben in [3] ein Datenbanksystem ohne Kompression von null-Werten benutzt. Hierdurch würde sich die Ergebnistabelle nach dem sorted node outer union -Ansatz erheblich aufblähen und dieser Ansatz aufgrund der verlängerten Sortierzeit weniger effizient. Nach [3] ist unter dieser Voraussetzung der von SilkRoute benutzte Ansatz nahezu optimal. 7.2 XPERANTO XPERANTO benutzt den in Abschnitt 6.4 beschriebenen "sorted node outer union" Ansatz zur Umsetzung der Anfragen in SQL. Pro Anfrage wird dabei eine einzelne SQL-Abfrage erzeugt. Das Ergebnis der Abfrage entspricht Abb. 11. 8 Erzeugung des XML-Dokuments Bei beiden Systemen werden die Daten von der Datenbank sortiert und können daher sofort (d.h. ohne nochmaliges Speichern) mit Tags versehen und ausgegeben werden. 8.1 SilkRoute Neben der SQL-Abfrage wird bei Übersetzung der Anfrage auch ein XML-Template erzeugt, das dem XML-Generator das Zusammensetzen des XML-Dokuments aus den hierin enthaltenen Tags und den von der Datenbank gelieferten Tupeln ermöglicht. 8.2 XPERANTO Zu jeder Benutzerabfrage wird neben der SQL-Abfrage auch ein XML-Schema erzeugt. Die von der Datenbank gelieferten Tupel werden vom XML-Tagger (der als weitere Quelle vermutlich das XML-Schema nutzt) mit Tags versehen. - 14 9 Vergleich von SilkRoute und XPERANTO 9.1 Funktionsumfang Beide Programme erfüllen den Zweck, relationale Datenbanken auf eine XML-Sicht abzubilden. XPERANTO bietet einen deutlich größeren Funktionsumfang: Abbildung objektrelationaler Datenbanken (SQL 99) Die Erzeugung eines XML-Schemas für die Standard-Sicht und benutzerdefinierte Sichten gibt dem Benutzer detaillierte Informationen insbesondere über die Wertebereiche der Daten in der Datenbank. Meta-Daten können in Abfragen einbezogen werden. Vorhandene, benutzerdefinierte Sichten werden gespeichert und stehen für weitere Abfragen zur Verfügung 9.2 Benutzerfreundlichkeit Im Gegensatz zu SilkRoute stellt XPERANTO eine Standard-Sicht zur Verfügung. Dadurch ist es möglich, Benutzern den Inhalt einer Datenbank ohne weitern Aufwand als XML-Sicht zugänglich zu machen. Da Datenbanken oft aber auch Daten enthalten, die nicht extern zugänglich sein sollen, muss in der Regel auch bei der Verwendung von XPERANTO eine XML-Sicht definiert werden. Vorteil von XPERANTO ist hier, dass für die Sichtdefinition keine eigene Sprache verwendet, sondern XML-QL benutzt wird. Allerdings scheint der Aufwand für das Erlernen von RXL für einen Datenbankadministrator, der ohnehin SQL und evtl. XML-QL beherrscht, eher gering. 10 Zusammenfassung Es wurde gezeigt, wie zwei Middleware-Systeme Daten aus relationalen Datenbanken als XML-Sichten zur Verfügung stellen. Beide Systeme scheinen für diesen Zweck geeignet, wobei XPERANTO vor allem durch seinen erheblich größeren Funktionsumfang und seine daraus resultierende Flexibilität bei der Anwendung überzeugt. Als weiterer Ansatz wurde eine Erweiterung von SQL vorgestellt, die - bei reduzierter Benutzerfreundlichkeit und Flexibilität – die schellste Möglichkeit für die Präsentation von Datenbankinhalten als XML-Sicht darstellt. Literatur: [1] M. F. Fernandez, W. C. Tan und D. Suciu. SilkRoute: Trading Between Relations and XML. WWW9 / Computer Networks 33(1-6), 723-745, 2000, http://www.cs.washington. edu/homes/suciu/NodeInternal/sitegraph.genoid_2.html [2] M. J. Carey, D. Florescu, Z. G. Ives, Y. Lu, J. Shanmugasundaram, E. J. Shekita und S. N. Subramanian: XPERANTO: Publishing Object-Relational Data as XML. WebDB (Informal Proceedings), 105-110, 2000, http://www.cs.cornell.edu/People/jai/pubs.html [3] J. Shanmugasundaram, E. J. Shekita, R. Barr, M. J. Carey, B. G. Lindsay, H. Pirahesh und B. Reinwald: Efficiently Publishing Relational Data as XML documents. VLDB Journal 10(2-3), 133-154, 2001, http://www.cs.cornell.edu/People/jai/pubs.html [4] Eric van der Vlist: Using W3C XML Schema, http://www.xml.com/pub/a/2000/11/29/schemas/part1.html [5] XML-QL Users's Guide: Basics, http://www.research.att.com/~mff/xmlql/doc/sitegraph.genoid_5.html Native XML-Datenbanken: Natix und Tamino Seminararbeit zum Kurs 1912 im Sommersemester 2002 Dozent: Prof. Ralf H. Güting an der FernUniversität Hagen Lehrgebiet Praktische Informatik IV Von Monika Wienbeck, Matr.-Nr. 5360242 Inhaltsverzeichnis 1. Natix und Tamino: Wer hat es entwickelt und warum?.................................................... 3 1.1. Daten- vs dokumentenzentrierte Dokumente........................................................... 3 1.2. Speicherung von XML-Dokumenten in relationalen Datenbanken ........................... 8 1.3. Kernthemen in der Diskussion um native XML-Datenbanken ................................ 10 2. Globale Vorgaben für Progammierschnittstellen (APIs) ................................................ 10 2.1. DOM (W3C)........................................................................................................... 10 2.2. SAX ....................................................................................................................... 11 2.3. Relevante ‚Open issues‘, z.B. Views...................................................................... 11 3. Natix ............................................................................................................................. 11 3.1. Architektur ............................................................................................................. 11 3.2. Organisation der Speicherung von XML-Baumstrukturen ...................................... 12 3.3. Transaktionsverwaltung und Speicherebene in Natix ............................................ 15 3.4. Abfragen und Views .............................................................................................. 16 3.5. Performance.......................................................................................................... 17 3.6. Diskussion ............................................................................................................. 19 4. Tamino ......................................................................................................................... 20 5. Ausblick ........................................................................................................................ 21 6. Literatur ........................................................................................................................ 21 Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 2 von 22 1. Natix und Tamino: Wer hat es entwickelt und warum? Natix wurde von einem Projektteam an der Universität Mannheim entwickelt. Der Gesamtkontext war ein vom Bundesministerium für Bildung und Forschung (BMBF) gefördertes Vorhaben, die Biochemical Pathways des Spektrum Verlages zu digitalisieren. Dieses Nachschlagewerk bietet Informationen über chemische Reaktionen, es enthält Informationstexte und graphische Darstellungen, die die NutzerInnen sich sowohl im Detail als auch im Kontext ansehen möchten. Das Mannheimer Projektteam erhielt 1998 die Zuständigkeit für die Datenhaltung und entschied sich, dafür eine „native XML-Datenbank“ zu entwickeln. [13] Eine native XML-Datenbank: Was ist das überhaupt? Offenbar wurde dieser Begriff bei einer Vermarktungskampagne von Software AG für das Produkt Tamino in die breite Diskussion gebracht und dann in Internet-Diskussionsforen im nachhinein theoretisch definiert [1]. Eine brauchbare Definition findet sich beispielsweise im Internet auf der Webpage von Ronald Bourret. Demnach - hat eine native XML-Datenbank ein logisches Modell für XML-Dokumente – bspw. DOM oder das XPath-Datenmodell –, und die Speicherung von bzw. Anfragen an Dokumente ist entsprechend gestaltet. XML-Elemente, -Attribute, -PCDATA, und die Reihenfolge des Dokuments müssen in dem Modell berücksichtigt sein. - ist die grundlegende Einheit der logischen Speicherung bei einer nativen XML-Datenbank das Dokument Der Begriff „native XML-Datenbank“ kann nach dieser Definition unabhängig von der physikalischen Speicherung der Dokumente angewandt werden [2]. Die in dieser Arbeit vorgestellten Datenbanken Natix und Tamino entsprechen dieser Definition. Sie haben beide ein proprietäres Speicherformat, das XML-Dokumenten entsprechend ihrer logischen Struktur auf Speicherseiten aufteilt. Die Motivationen für die Entwicklung einer nativen XML-Datenbank für die digitale Version der Biochemical Pathways waren weit gestreut. Zu einen gab es wirtschaftliche Gründe: Bei Verwendung einer etablierten relationalen Datenbank wie Oracle 8i wären erhebliche Lizenzgebühren angefallen, die den Preis bei einem Vertrieb des Projektergebnisses auf CD erheblich in die Höhe getrieben hätten. Zum anderen handelt es sich bei den Texten des Nachschlagewerks um dokumentenzentrierte Dokumente – und somit um ein Format, das nach heutigem Stand der Diskussion besser in nativen XML-Datenbanken als in relationalen Datenbanken abgelegt wird. 1.1. Daten- vs dokumentenzentrierte Dokumente Der Dichotomie von datenzentrierten und dokumentenzentrierten Dokumenten ist eine theoretische Begrifflichkeit zur Unterscheidung von Dokumentenstrukturen. Sie gehört zum Standardrepertoire einer Argumentation, die die Überlegenheit von nativen XMLDatenbanken mit den Eigenheiten der zu verwaltenden Dokumente begründet. In der Praxis kommen jedoch häufig Zwischenformen vor. Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 3 von 22 „Datenzentriert“ sind Dokumente, in denen die Reihenfolge der Datensätze irrelevant ist, deren Struktur regelmäßig ist, und in denen kein gemischter Inhalt vorkommt – wie zum Beispiel im folgenden Datenblatt über eine Abteilung und ihre Angestellten: <department> <deptno>15</deptno> <name>Marketing</name> <employee> <empno>815</empno> <firstname>Maria</firstname> <lastname>Weber</lastname> </employee> <employee> <empno>216</empno> <firstname>Karl</firstname> <lastname>Kunger</lastname> </employee> </department> Bei einer Anfrage über dieses Dokument wäre es nicht relevant, in welcher Reihenfolge die beiden employee-Elemente zurückgeliefert würden. Der Inhalt könnte im relationalen Modell in zwei Tabellen übertragen werden, ohne dass Namenskonflikte oder Probleme mit nullvalues vorkämen. „Dokumentenzentriert“ sind dagegen Bücher, e-mails, Werbung und andere Dokumente, die eine eher unregelmäßige Struktur haben, die Daten mit relativ hoher Granularität enthalten, ausserdem gemischten Inhalt, und in denen nicht zuletzt die Reihenfolge der Elemente zählt (s. [2] und [14]). Wir im stellen im folgenden eine XML-Verson von William Shakespeares Theaterstück „The Tempest“ (Der Sturm) als Beispiel für ein dokumentenzentriertes Dokument vor, tempest.xml. Diese Datei ist im Internet zur freien Verfügung eingestellt [16], und sie ist Teil des Materials, das Kanne und Moerkotte bei der in Abschnitt 3.5 dieser Arbeit diskutierten Performance-Studie für Natix verwendet wurde. Die hier vorgestellte Version von tempest.xml enthält weder Attribute noch Ausführungsanweisungen. Trotz dieser reduzierten strukturellen Komplexität ist sie zur Darstellung der wesentlichen Aspekte von dokumentenzentrierten Dokumenten ebenso geeignet wie als Beispiel zur Darstellung der wesentlichen Funktionalitäten von Natix. Beispiel: tempest.xml Das Dokument tempest.xml ist eins von insgesamt 38 Dokumenten in der XML-Version von Shakespeares gesammelten Werken. Die hier verwendete Version wurde 1992-1994 von John Bosak in SGML Markup erstellt und 1996-1997 auf XML umformatiert. Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 4 von 22 Die data type definition (DTD) ist für alle im Korpus enthaltenen Dokumente einheitlich deklariert: <!-- DTD for Shakespeare J. Bosak 1994.03.01, 1997.01.02 --> <!ENTITY amp "&"> <!ELEMENT play - - (title, fm, personae, scndescr, playsubt, induct?, prologue?, act+, epilogue?)> <!ELEMENT title - - (#PCDATA)> <!ELEMENT fm - - (p+)> <!ELEMENT p - - (#PCDATA)> <!ELEMENT personae - - (title, (persona | pgroup)+)> <!ELEMENT pgroup - - (persona+, grpdescr)> <!ELEMENT persona - - (#PCDATA)> <!ELEMENT grpdescr - - (#PCDATA)> <!ELEMENT scndescr - - (#PCDATA)> <!ELEMENT playsubt - - (#PCDATA)> <!ELEMENT induct - - (title, subtitle*, (scene+|(speech|stagedir|subhead)+))> <!ELEMENT act - - (title, subtitle*, prologue?, scene+, epilogue?)> <!ELEMENT scene - - (title, subtitle*, (speech | stagedir | subhead)+)> <!ELEMENT prologue - - (title, subtitle*, (stagedir | speech)+)> <!ELEMENT epilogue - - (title, subtitle*, (stagedir | speech)+)> <!ELEMENT speech - - (speaker+, (line | stagedir | subhead)+)> <!ELEMENT speaker - - (#PCDATA)> <!ELEMENT line - - (stagedir | #PCDATA)+> <!ELEMENT stagedir - - (#PCDATA)> <!ELEMENT subtitle - - (#PCDATA)> <!ELEMENT subhead - - (#PCDATA)> Abbildung 1: DTD für Shakespeares gesammelte Werke In der DTD lassen sich entsprechend der DOM-Vorgaben zwei Typen unterscheiden: 1. Elemente, in die weitere Elemente eingebettet sind. Wir bezeichnen dieses Verhältnis im folgenden als „Elternknoten“ (das Element selber) und „Kindknoten“ (die eingebetteten Knoten). Selbstverständlich können in ein Kindknoten weitere Elemente eingebettet sein, so dass der Kindknoten Elternknoten weiterer Kindknoten ist. Elternknoten haben in tempest.xml lediglich die Kindknoten zum Inhalt. Der Elternknoten, der selbst keinen Elternknoten hat, nennen wir Wurzelknoten. Der Wurzelknoten in der DTD ist play. Weiter Elternknoten sind fm, personae, pgroup, induct, act, scene, prologue, epilogue, speech und line. 2. Textfelder. Dies sind Elemente mit Inhalt, die immer einen (Element-)Elternknoten haben und niemals einen Kindknoten. Inhalt ist in tempest.txt ein einfacher Textstring, in der DTD deklariert als PCDATA. Hierzu gehören title, p, persona, grpdescr, scndescr, playsubt, speaker, stagedir, subtitle und subhead. Die Struktur des hier im Detail betrachteten Abschnitts von tempest.xml – also bis zum Ende der ersten Szene – ist in der DTD vollständig beschrieben. Es beginnt mit dem XML-header und einem nachfolgenden Kommentar. Dann folgt der PLAY-Wurzelknoten für das gesamte nachfolgende Dokument mit zehn Kindknoten: TITLE, fm, PERSONAE, SCNDESCR, PLAYSUBT und – entsprechend der klassischen Drama-Lehre – fünf ACT-Elementen. Inhalt von TITLE ist der Title des gesamten Stücks, „The Tempest“. Das fm-Element enthält vier p-Kindknoten, Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 5 von 22 die jeweils eine Zeile der Dokumentgeschichte bzw. der Erklärung zum Copyright zum Inhalt haben: <?XML version="1.0"?> <!DOCTYPE play PUBLIC "-//Free Text Project//DTD Play//EN"> <PLAY> <TITLE>The Tempest</TITLE> <fm> <p>Text placed in the public domain by Moby Lexical Tools, 1992.</p> <p>SGML markup by Jon Bosak, 1992-1994.</p> <p>XML version by Jon Bosak, 1996-1997.</p> <p>This work may be freely copied and distributed worldwide.</p> </fm> <PERSONAE>...</PERSONAE> <SCNDESCR>...</SCNDESCR> <PLAYSUBT>...</PLAYSUBT> <ACT>...</ACT> <ACT>...</ACT> <ACT>...</ACT> <ACT>...</ACT> <ACT>...</ACT> </PLAY> Abbildung 2: Grobstruktur von tempest.xml Das PERSONAE-Element enthält 17 Kindknoten, von links nach rechts: ein TITLE-Element, fünf PERSONA-Textfeld, ein PGROUP-Element, acht weitere PERSONA-Textfelder, ein weiteres PGROUP-Element und ein letztes PERSONA-Textfeld. Inhalt des TITLE-Textfelds ist der Titel des Abschnitts: „Dramatis Personae“; Inhalt der PERSONA-Textfelder sind jeweils Name und ggf. Eigenschaft einer im Stück vorkommenden Person, z.B. „MIRANDA, daughter to Prospero.“ Die PGROUP-Elemente haben Kindknoten, nämlich zwei bzw. fünf bzw. PERSONATextfelder (Inhalt ist diesmal nur der Name der Person) und ein GRPDESCR-Textfeld. Inhalt des GRPDESCR-Textfeld ist „Lords.“ bzw. „presented by Spirits.“ Das sind text-semantisch gesehen Eigenschaften der in den Nachbarknoten definierten Personen, analog zu dem Substring „daughter to Prospero“ bei Miranda: <PERSONAE> ... <PGROUP> <PERSONA>ADRIAN</PERSONA> <PERSONA>FRANCISCO</PERSONA> <GRPDESCR>Lords.</GRPDESCR> </PGROUP> ... <PERSONA>MIRANDA, daughter to Prospero.</PERSONA> ... </PERSONAE> Abbildung 3: Semantik von GRPDESCR als Gruppenattribut Das SCNDESCR-Textfeld hat den Inhalt „SCENE A ship at Sea: an island.“, also der Ort, an dem die Handlung des gesamten Stücks beginnt. Das PLAYSUBT-Textfeld hat den Inhalt „THE TEMPEST“ und wiederholt damit in Grossbuchstaben den Titel, den wir schon im TITLE-Kindknoten von PLAY gefunden hatten. Das erste ACT-Element hat die Kindknoten TITLE und SCENE. SCENE wiederum hat den Kindknoten TITLE sowie insgesamt 10 STAGEDIR- und 28 SPEECH-Kindknoten in unsystematischer Folge. Die Sequenz: 1 x STAGEDIR, 3 x SPEECH, 2 x STAGEDIR, 1 x SPEECH, 1 x STAGEDIR, 8 x SPEECH, 1 x STAGEDIR, 1 x SPEECH, 2 x STAGEDIR, 6 x SPEECH, 1 x STAGEDIR, 6 x SPEECH, 1 x STAGEDIR, 2 x SPEECH, 1 x STAGEDIR, 1 x SPEECH. Jeder Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 6 von 22 SPEECH-Knoten hat ein SPEAKER-Kindknoten und ein oder mehrere LINE-Kindknoten. Der TITLE-Kindknoten von ACT hat „ACT I“ zum Inhalt, der TITLE-Kindknotens von SCENE „SCENE I. On a ship at sea: a tempestuous noise of thunder and lightning heard.“ Mit dem STAGEDIR-Element mit dem Inhalt „Enter a Master and a Boatswain“ beginnt dann die eigentliche Handlung des Stücks, nämlich dem Untergang des Schiffes, auf dem sich Ferdinand befindet. Obwohl in dem betrachteten Ausschnitt aus tempest.txt keine XML-Attribute und keine XMLAusführungsanweisungen vorkommen, illustriert es hervorragend die typischen Charakteristika von dokumentenzentrierten Dokumenten. So ist für die Semantik des Dokuments beispielsweise die Reihenfolge der Kindsknoten des ersten SCENE-Elements konstitutiv: <SPEECH> <SPEAKER>Boatswain</SPEAKER> <LINE>Here, master: what cheer?</LINE> </SPEECH> <SPEECH> <SPEAKER>Master</SPEAKER> <LINE>Good, speak to the mariners: fall to't, yarely,</LINE> <LINE>or we run ourselves aground: bestir, bestir.</LINE> </SPEECH> <STAGEDIR>Exit</STAGEDIR> Abbildung 4: Inhalt des ersten ACT-Elements in tempest.xml (Auszug) Würden in dieser Sequenz das erste SPEECH-Element (Boatswain-SPEAKER) und das STAGEDIR-Textfeld in der Reihenfolge vertauscht, dann müssten Schauspieler agieren, die bereits die Bühne verlassen haben. Ausserdem würde der Master-SPEAKER auf eine nicht gestellte Frage antworten, und die Frage des Boatswain-SPEAKERs würde gar nicht oder in einer hier nicht mehr abgebildeten, nachfolgenden Sequenz auf sinnverfälschte Weise beantwortet. Am Beipiel des des PGROUP-Elements haben wir bereits gesehen, dass aufgrund der Dokumentenstruktur ein Knoten semantisch gesehen ein Attribut zu seinen Nachbarknoten enthalten kann. Die Verwendung des TITLE-Elements illustriert, dass zusätzlich die Semantik ein- und desselben Feldes im Dokument durchaus variieren kann: <PLAY> <TITLE>The Tempest</TITLE>... </PLAY> ... <PERSONAE> <TITLE>Dramatis Personae</TITLE>... </PERSONAE> ... <ACT><TITLE>ACT I</TITLE>... </ACT> ... </PLAY> Abbildung 5: Semantik der TITLE-Elemente variiert mit dem Kontext Einmal handelt es sich um den Titel des Stücks, einmal um den Titel der Personenliste, und einmal um den Titel des Akts. In der DTD ist nur ein TITLE-Textfeld deklariert, allerdings als Kind mehrerer Knoten, die selbst in einer hierarchischen Beziehung zueinander stehen. Es handelt sich hier um ein typisches Beispiel von gemischtem Inhalt. Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 7 von 22 1.2. Speicherung von XML-Dokumenten in relationalen Datenbanken Für das Problem der variierenden Semantik des TITLE-Textfeldes gäbe es in einer relationalen Datenbank eine klassische Lösung, nämlich die Verdreifachung des Feldes: play.title, personae.title und act.title. Tempest.xml wird mit diesem Ansatz durch eine Menge von Tabellen modelliert. Wir erhalten damit eine tabellenbasierte Abbildung des Dokumentenschemas auf ein relationales Datenbankschema (vgl. [1], Abschnitt 5.1.1), die für die drei Strukturebenen play, personae und act jeweils eine eigene Tabelle anlegt: Abbildung 6: Lösung des title-Problems bei tabellenbasierter Abbildung des Dokumentenschemas in ein relationales Datenbankschema Eine solche Abbildung in relationale Tabellen verbietet sich für die Verwaltung veränderlicher, dokumentenzentrierter Dokumente jedoch schon nach kurzer Überlegung von selbst: - Die Tabellenstruktur müsste induktiv aus den vorliegenden Dokumenten erschlossen und mit jedem neuen Dokument neu überprüft werden, da die schematische Information eines XML-Dokuments nicht in einer DTD deklariert werden muss. - Die Tabellenstruktur wäre auch deshalb nie mit Sicherheit abgeschlossen, weil bei jeder Operation auf bestehenden Dokumenten bislang undefinierte Knoten hinzukommen könnten. Ausserdem könnten jederzeit Operationen eine Modifikation der Struktur zum Gegenstand haben. Der Aufwand für diese permanenten Reorganisationen der Tabellen zum Zweck der Ausführung einfacher Operationen ist jedoch nicht vertretbar. - Die mögliche Variationsbreite der möglichen Kombinationen und Einbettungen von Knoten würde regelmäßig eine Tabellenstruktur hervorbringen, die sich nicht mehr sinnvoll verwalten lässt. - In XML-Dokumenten können grundsätzlich Kommentare und Ausführungsanweisungen unsystematisch über die Dokumente verteilt sein. Hier liegt ein großes Potential für eine Komplexität, die sich nicht mehr sinnvoll in Tabellenstrukturen verwalten lässt [14]. Eine logisch unkomplizierte Möglichkeit ist dahingegen die Speicherung von dokumentenzentrierten XML-Dokumenten als binary large objects (BLOBs) oder character large objects (CLOBs). Diese Lösung ist jedoch für viele Anwendungsbereiche nicht Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 8 von 22 geeignet. Ist zum Beispiel ein Dokument größer als eine Speicherseite, dann würde es bei den relationalen BLOB- bzw. CLOB-Lösungen unbeachtet seiner XML-Struktur auf Speicherseiten aufgeteilt. Eine solche Aufteilung wäre beispielsweise bei tempest.xml bei einer Gesamtlänge von 149.472 Zeichen und einem Speicherplatzbedarf von 152 KB bei Abspeicherung als Textdatei höchstwahrscheinlich erforderlich. Um bei Anfragen relevante Kontextinformation – wie im Beispiel des PGROUP-Elements in tempest.xml – zu erhalten müsste das Dokument bei jeder Abfrage erneut zusammengesetzt und geparst werden. Dies wird jedoch in den meisten Fällen zu völlig unakzeptablen Wartezeiten für die Benutzerin / den Benutzer führen. Eine weitere Lösung wäre die Repräsentation der Baumstruktur in einer einfachen Tabelle, die alle Elemente aus allen Dokumenten auflistet und durch Identifikationsnummern (IDs) und Verweise in Beziehung stellt, analog einer Array-Implementierung von Bäumen: Abbildung 7: Repräsentation der Baumstruktur von tempest.xml in einer einzelnen Tabelle einer relationalen Datenbank Eine solche Lösung diskutieren Fiebig, Kanne und Moerkotte, kommen jedoch zu einem negativen Ergebnis: Nachbildungen von DOM-Funktionen – bspw. nach dem Geschwisterknoten – in SQL würden zu komplex. Ausserdem sei die Übersetzung von XPath- und XQuery-Ausdrücken in SQL gleich aus mehreren Gründen kritisch: Zum einen gebe es einen Leistungsverlust durch zusätzliche Abbildungsschichten; weiterhin sei SQL nicht mächtig genug, um alle XPath- und XQuery-Ausdrücke wiederzugeben; und nicht zuletzt müsse bereits beim Einfügen eines einzigen Knotens zur Vermeidung von Phantomproblemen immer die Relation als Ganzes gesperrt und somit ggf. mehrere Dokumente gesperrt werden. ([4], S. 7) Letztlich ist also – so die Argumentation von Fiebig, Kanne und Moerkotte als Vertreter des Natix-Anbieters data ex machina und Schöning als Vertreter des Tamino-Anbieters SoftwareAG – bietet die Verwaltung von dokumentenzentrierten Dokumenten in nativen XMLDatenbanken gegenüber der Verwaltung solcher Dokumente in relationalen Datenbanken erhebliche Vorzüge in Bezug auf Mehrbenutzerbetrieb, Abfragemöglichkeiten und – performance sowie wesentlich bessere Eigenschaften für den Mehrbenutzerbetrieb. Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 9 von 22 1.3. Kernthemen in der Diskussion um native XML-Datenbanken Für die heutigen nativen XML-Datenbanken listet Bourret ([1]) einige typische Leistungsmerkmale auf, die sich auch bei Natix und bei Tamino im wesentlichen wiederfinden lassen1: Document Collections – Dokumente werden in der Datenbank zu Collections gruppiert, so dass bei Abfragen der abzusuchende Bereich von vorneherein auf bestimmte Collections eingegrenzt werden kann. Das Collections-Konzept ist bei Tamino implementiert. Anfragesprachen – Die vom W3C empfohlenen Anfragesprachen werden unterstützt. Bei Natix ist das XPath und NQL, bei Tamino XQL. Änderungs- und Löschoperationen – Die Datenbank unterstützt Änderungs- und Löschoperationen auf Dokumenten. Natix und Tamino haben beide dieses Leistungsmerkmal, jedoch gibt es bemerkenswerte Unterschiede in der Realisierung von Dokumentenspeicherung und –indizierung. Transaktionen, Sperren und gleichzeitige Zugriffe – Transaktionen müssen unterstützt werden, Sperren sollten möglichst so organisiert sein, dass sie ein Höchstmaß an Freiheiten für gleichzeitige Zugriffe zu gewährleisten. Hier gibt es insbesondere Unterschiede in der Verfügbarkeit von Protokollen für Transaktionen. Application Programming Interfaces und Zugriff auf externe Datenquellen - zum Umfang der hier vorgestellten XML-Datenbanken gehören auch standardisierte Programmierschnittstellen (APIs) wie in Kapitel 2 dieser Arbeit vorgestellt. Diese Schnittstellen gehören ebenso zur Architektur der Datenbank wie der Zugriff auf externe Datenquellen. Möglichkeit zur identischen Rückgabe des eingegebenen Dokuments – Es sollte möglich sein, Dokumente in genau der Form abzurufen, in der sie in eine native XML-Datenbank eingegeben wurden. Dies ist sowohl in Natix als auch in Tamino möglich. Indizes – Im Interesse einer schnelleren Ausführung von Anfragen sollte auch eine native XML-Datenbank Indizes führen. Dies ist sowohl bei Natix als auch bei Tamino der Fall. Bevor wir uns der Realisierung dieser Merkmale im Detail zuwenden werfen wir noch einen kurzen Blick auf relevante und systemunabhängige Konventionen aus dem W3C-Kontext. 2. Globale Vorgaben für Progammierschnittstellen (APIs) 2.1. DOM (W3C) Das Document Object Model (DOM) ist die objektorientierte Spezifikation einer Programmierschnittstelle zum Zugriff auf HTML-Dokumente (DOM HTML) und XMLDokumente (DOM Core). Das DOM liegt zur Zeit (Juni 2002) im Entwurf vor und ist auf der Webpage von W3C veröffentlicht [3]. Historisch enstand es als Spezifikation for JavaProgramme und JavaScript Scripte, die portabel zwischen den Web-Browsern sein sollten. Die heute vorliegende Version ist das Ergebnis einer Arbeitsgruppe bei W3C, an der auch VertreterInnen von kommerziellen Anbietern für HTML- und XML-Editoren sowie für Dokumentrepositorien teilnahmen. Erkennbar ist auch die Handschrift von Charles Goldfarb, einen der Urheber der ersten Markup Language, in der Berücksichtigung von SGML-Groves2 sowie des HyTime-Standards3. Hinzu kommen Einflüsse aus firmenspezifischen 1 die von Bourret in diesem Kontext diskutierte Speicherung externer Entitäten ist nicht Gegenstand der vorliegenden Arbeit. 2 Ein SGML-Grove ist ein geparstes SGML-Dokument [6] 3 HyTime ist ein älterer Standard für die Architektur von Adressierung und Verknüpfung (linking), scheduling, und renditions [7] Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 10 von 22 Objektmodellen aus APIs für XML- und SGML-Editoren und Repositorien. ([3] Abschnitt „What is the DOM?“). Das DOM enthält - Interfaces und Objekte, die zur Repräsentation und Manipulation eines Objekts verwendet werden - die Semantik dieser Interfaces und Objekte – einschließlich des Verhaltens und der Attribute - die Beziehung zwischen und Zusammenarbeit von diesen Interfaces und Objekten. Insbesondere enthält es Funktionen, die festlegen, wie Objekte manipuliert werden können. DOM entspricht damit der Konzeption von objektorientierten Programmiersprachen, wonach Daten in Objekten gekapselt sind. In den Interfaces bleibt sogar die Umsetzung in konkrete Objekte offen. So gilt im wesentlichen: createX()-Methoden ersetzen Konstruktorenaufrufe; get()/set()-Methoden ersetzen den Zugriff auf Attribute; DOM-Applikationen können zusätzliche Methoden zur Verfügung stellen. DOM macht keine Vorgaben in Bezug auf die Implementierung. Es geht um die Herstellung eines strukturellen Isomorphismus, d.h. wenn zwei DOM-Implementierungen verwendet werden, um eine Repräsentation desselben Dokuments zu erzeugen, dann sollen sie dasselbe Strukturmodell entsprechend dem XML Information Set erzeugen. Variationen sollen nur bei den whitespaces entstehen, da sich das bei der Verwendung unterschiedlicher Parser nicht ausschließen lässt. In den Appendices von DOM sind u.a. die entsprechenden IDL-Definitionen sowie die Bindungen an Java und an ECMA Script angegeben. 2.2. SAX SAX ist eine eventbasierte Standard-API für XML (Simple API for XML). Der Java-Code und die Spezifikation sind unter http://www.saxproject.org publiziert und können dort frei heruntergeladen werden. 2.3. Relevante ‚Open issues‘, z.B. Views In den Publikationen des W3C gibt es keine Vorgaben für Views auf XML-Dokumente. Als Abfragesprache wird bei W3C zur Zeit XQuery etabliert. Die Gestaltung von Anfragen über Menge von XML-Dokumenten ist jedoch nicht Gegenstand der XML-Empfehlung. Insbesondere gibt es keine Vorgaben oder Vorschläge für die Indizierung von Dokumenten oder den Aufbau von Suchpfaden. 3. Natix Natix wurde in C++ auf UNIX-Plattformen entwickelt. Auf der data ex machina Webpage [18] liegt zur Zeit eine Natix-Demoversion für Linux ab Kernel 2.2.16 bereit, diese Demoversion verlangt, dass das Betriebssystem CODA unterstützt. Geplant war bereits im Jahr 2001 eine Windows-Version und Java-Anbindungen ([4], S. 8). Die Windows-Version wird von der Herstellerfirma data ex machina derzeit aufgrund mangelnder Nachfrage nicht weiterverfolgt (mdl. Auskunft G. Moerkotte am 17. Juni 2002, mwi). 3.1. Architektur Die Architektur von Natix besteht aus drei Ebenen: Anbindungsebene: Anwendungen greifen auf Natix über die Anbindungsebene zu. Hier liegen die Treiber, die unter anderem erforderlich sind, um auf externe XML-Quellen bspw. Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 11 von 22 durch einen SAX-Import zuzugreifen, ausserdem ein ODBC-Apparat zum Zugriff auf relationale Datenquellen. Schnittstellen gibt es für den Java DOM-Treiber, den C++-DOMTreiber, den SAX-Treiber sowie für Dateisystemtreiber. ([4], S. 8) Natix Engine Interface: Hier koordiniert Natix die Datenbankdienste, erhält Aufträge wie Compiliation (Prepare), den Auftrag zur Auswertung einer Anfrage sowie zum Import bzw. Export von Dokumenten und reicht sie an die beteiligten Datenbankdienste weiter. Datenbankdienste: Query Compiler, Natix Virtual Machine, Transaktionsverwaltung und Objekmanager. Der Query Compiler übersetzt Anfragen für die Natix Virtual Machine. Zur Zeit (Juni 2002) sind Query Compiler für XPath und für die XQuery-Variante NQL verfügbar. Die Natix Virtual Machine dient der Auswertung von Anfragen. Sie simuliert einen Prozessor und stellt dafür einen Befehlssatz, bestehend aus Operationen auf Basistypen und Befehlen zum Zugriff auf Dokumente, zur Verfügung. Die Natix Virtual Machine hat die Möglichkeit, direkt auf die Hintergrundspeicherrepräsentation der XML-Dokumente zuzugreifen. Die Transaktionsverwaltung in Natix stellt die Infrastruktur für den Mehrbenutzerbetrieb zur Verfügung. Nähres dazu Abschnitt 3.3. Speicherebene: Aufgabe ist die Verwaltung der persistenten Daten. Die NatixSpeicherebene unterstützt Standard-Indexstrukturen wie B-Bäume und invertierte Listen. Noch in Planung ist ein Index, der neben absoluten Positionen auch Zusatzinformationen über den Kontext liefert. ([4] S. 8) Wir gehen darauf in den Abschnitten 3.3 und 3.4 näher ein. Abbildung 8: Architektur von Natix. Quelle: [4] 3.2. Organisation der Speicherung von XML-Baumstrukturen Natix verwendet ein proprietäres, modellbasiertes sog. hybrides Speicherungsformat4. Ein Dokument wird so lange wie möglich als Datensatz auf eine Speicherseite geschrieben. Natix erlaubt es auch, mehrere Datensätze auf eine Hintergrundseite zu schreiben ([4], S. 9). Daher ist der erste Schritt bei Überschreitung der Seitengröße, nach einer ausreichend 4 Die Bezeichnung „hybrides Speicherungsformat“ ist in der Literatur nicht eindeutig, so verwendeten bspw. Ingo Macherius, Peter Fankhauser und Thomas Tesch bei ihrer Präsentation vor der GMD im September 2000 den Begriff „Hybride Speicherung“ für eine kombinierte Lösung, bei der strukturierte Daten in einem RDBMS abgelegt werden und die semistrukturierten Daten in XML-BLOBs. [11]. Wir verwenden im folgenden den Begriff „hybrides Speicherungsformat“ im Sinne von Fiebig und Moerkotte. Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 12 von 22 großen freien Seite zu suchen. Wenn dieser Versuch scheitert, dann wird der Baum in mehrere Datensätze gesplittet. Ein Natix-Datensatz ist eine serielle Repräsentationen einer DOM-Baumstruktur, also ein flat stream. Erst mit dem Datensatzsplit erfolgt ein metamodeling, d.h. eine Abbildung der Struktur des Dokuments in strukturierte Teile der Datenbank[9]. Die Vorgaben für den Split-Prozess sind teilweise konfigurierbar: Seitengröße (max. 64 KB) als Schwellenwert für die Größe eines Datensatzes; das Verhältnis der Größe von rechtem und linkem Teilbaum (split target), die Abweichungstoleranz für dieses Verhältnis (split tolerance). Natix sucht einen Pfad (separator) durch den Dokumentenbaum bis es den Teilungsknoten erreicht. Das split target gibt dabei anschaulich gesprochen die Schräglage des Teilungspfades gegenüber der Vertikalen vor, d.h. der konfigurierte Wert bestimmt, ob Natix immer den mittleren Knoten wählt oder bspw. immer den linken Knoten im rechten Drittel aller Kindknoten. Die Abweichungstoleranz gibt insbesondere eine Minimalgröße für die abteilbaren Teilbäume vor: Solange der Teilbaum unterhalb des zunächst ermittelten Teilungspunktes kleiner ist, als die Konfiguration der split tolerance erlaubt, dann wird der Teilungspfad um einen Knoten verkürzt. Nachdem der Teilungspfad bestimmt ist, überträgt Natix für jeden Knoten des Teilungspfades jeweils die rechten und die linken Teilbäume auf jeweils eine neue Seite als sog. Partitions-Datensatz (partition record). Bei nicht-binären Bäumen besteht grundsätzlich das Problem, dass es einen Wald rechts bzw. links von Knoten des Teilungspfades geben kann. In solchen Fällen setzt Natix ein sog. Gerüst-Aggegat (scaffolding aggregate) als künstliche Wurzel dieses Waldes ein. An der ursprünglichen Position der umkopierten Teilbäume werden sog. Platzhalter (proxies) eingerichtet, die den abgetrennten Teilbaum durch seine RID repräsentieren [9]. Platzhalter fallen ebenfalls unter die Kategorie der Gerüst-Objekte Um die Gerüst-Metapher zu vervollständigen nennen Kanne und Moerkotte die Objekte, die XML-Dokumentenknoten repräsentieren, „Fassadenobjekte“. Natix dekonstruiert sozusagen Häuser (= Dokumente), und setzt ein Gerüst aus inhaltsleeren Aggregaten und Platzhaltern und ein, um die Fassade an den Bruchstellen zusammenzuhalten. Nehmen wir zum Beispiel an, die Elemente des Dokuments tempest.xml würden chronologisch eingegeben. Nehmen wir weiterhin an, die Seitengröße wäre so eingestellt, dass bei Eingabe des ersten PERSONA-Elements der Schwellenwert überschritten wäre. Nehmen wir weiterhin an, das split target sei so konfiguriert, dass für den Teilungspfad immer der mittlere Knoten gewählt wird, und dass kein einzelner Knoten von einem Baum abgespalten wird. (Letzteres ist eigentlich eine Redundanz gegenüber den Grundeinstellungen: Um einer zu starke Fragmentierung entgegenzuwirken lässt Natix die Abspaltung einzelner Knoten grundsätzlich nicht zu.) Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 13 von 22 Abbildung 9: Bestimmung des Teilungspfades für tempest.xml. r1 steht für eine Speicherseite Aufgrund der Konfigurationsparameter endet der Teilungspfad bei dem fm-Knoten. Um die Kindsknoten als Ganzes adressierbar zu machen, werden die p-Knoten unter einem GerüstAggregat zusammengefasst: Abbildung 10: Die Anfangssequenz von tempest.xlm nach dem Datensatzsplit In Natix hat die Wurzel eines Datensatzes hat die Funktionalität eines standalone-Objekts. Sie enthält alle Knoten des Teilbaums als eingebettete Objekte (embedded objects) sowie einen header. Dieser header enthält den Inhaltstyp (aggregate / literal / proxy), die Größe Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 14 von 22 des Objekts5 sowie den Zeiger auf den Elternknoten. Bei Fassadenobjekten kommt die Information über den logischen Typ hinzu. Tag- und Attributnamen von Elementen werden in Natix in eine Symboltabelle usgelagert. Dadurch werden für die Information über Objektgröße und Position des Elternknotens insgesamt weniger als 2 Byte benötigt, die gesamte Strukturinformation eines Datensatzes kann platzsparend in einem 8-Byte-header untergebracht werden. ([4] S. 9 und [9] S. 20) Jedes der eingebetteten Objekte enthält selbst einen header und einen Inhalt. Als Inhalt kommen weitere eingebettete Objekte (ggf. repräsentiert durch einen Platzhalter) oder Literale in Frage. Die zulässige Formate für Literale waren 1999 String, 8/16/32/64-Bit Integer, Float und Uniform Resource Identifier (URI). Alle Knoten, die noch weitere Knoten enthalten, heissen bei Kanne und Moerkotte aggregate node (etwa: umfassender Knoten). (Appendix A in [9]). Die Speicherung der ersten vier Zeilen aus tempest.xml liesse sich demnach schematisch wie folgt darstellen: Byte-Repräsentation 10 Byte 6 Byte 6 Byte The Tempest Header Inhalt String-Literalknoten Header Inhalt TITLE-Knoten Header Strukturinformation Inhalt PLAY-Knoten Abbildung 11: Schematische Darstellung eines Datensatzes in Natix Der Aufbau von Datensätzen wird in Natix nicht zuletzt durch die sog. split matrix gesteuert. Hier kann festgelegt werden, welche Elementtypen niemals und welche möglichst oft gemeinsam in einem Datensatz stehen sollten, und für welche Kombinationen von Elementtypen der Natix-Teilungsalgorithmus entscheiden soll ([9], S. 10) 3.3. Transaktionsverwaltung und Speicherebene in Natix Die Transaktionsverwaltung gewährleistet in Natix die ACID-Eigenschaften Atomicity, Consistency, Isolation und Durability. Sie enthält u.a. Komponenten zur Isolation der Transaktionen durch Verwaltung der Sperren auf Objekten sowie die Recovery, die eine Logdatei führt und damit zuständig für die Wiederherstellung der Daten bei Systemausfall oder Abbruch einer Transaktion ist. In Natix können grundsätzlich mehrere NutzerInnen – wenn auch mit Einschränkung – gleichzeitig an einem Dokument arbeiten ([4] S. 10). Zum einen ermöglicht es das hybride Speicherungsformat, Sperren auf der Datensatzebene anzulegen und somit auf Teilbäume zu beschränken. Zudem stehen mehrer Protokolle zur Auswahl: Vier 2PL-basierte Protokolle (Doc2PL, Node2PL, NO2PL und OOPL), die mit unterschiedlicher Granularität Sperren auf Knoten bzw. Zeigern anlegen; zusätzlich das zeitstempel-basierte Protokoll XTO und ein neues Protokoll, die sog. dynamische Commit-Anordnung, XCO. Grob gesagt stehen Aufwand und erreichbare Flexibilität bei diesen Protokollen im umgekehrten Verhältnis. XCO setzt am wenigsten Hindernisse für Operationen auf angrenzenden Knoten, Doc2PL setzt demgegenüber Sperren auf Dokumentenebene an und ist damit das aufwandsärmste Protokoll [9]. Die Implementierung der Protokolle erfolgt in Natix generisch auf API-Ebene, d.h. bei jedem Zugriff auf Daten über die Anbindungsebene kann spezifiziert werden, welches Protokoll für die entsprechenden Transaktionen zu verwenden ist. 5 als Objekt gilt hier die Einheit aus Knotenrepräsentation und Inhalt Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 15 von 22 Zur Verbesserung der Performance hat Natix einen Objekt-Cache in der Transaktionsverwaltung ([4], S. 9) sowie einen Cache-Mechanismus auf der Speicherungsebene. Letztere enthält ausserdem eine Abstraktionsschicht für Massenspeichergeräte wie Dateien und Festplattenpartitionen. In solchen Festplattenpartitionen sind in Natix die verschiedenen Typen von Segmenten organisiert. So gibt es ein XML-Segment, ein B-Baum-Segment sowie jeweils ein Segment für die im nachfolgenden Abschnitt vorgestellten Indizes und Relationen. Die Speicherungsebene ist in der Lage, auf Massenspeichergeräte wahlfrei, d.h. mit Random Access, zuzugreifen ([4], S. 8). 3.4. Abfragen und Views Die Effizienz von Abfragen über große Datenmengen lässt sich durch Indizierung der Daten verbessern. Ein reiner Wortindex reicht jedoch nicht aus, wenn die hierarchische Struktur der XML-Dokumente in Abfragen berücksichtigt werden soll. In Natix ist daher ein Segmenttyp im Speicher für Relationen vorgesehen, auf dem die eXtended Access Support Relations (XASR) abgelegt werden kann. XASR funktioniert in Kooperation mit vier weiteren Komponenten, nämlich 1. dem DocDescriptor, der u.a. eine ID und den Uniform Resource Identifier (URI) für die indizierten Dokumente enthält 2. dem Lexikon, in dem alle suchbaren Wörter indiziert sind, und zwar inklusive der Namen der Elemente und der Textfelder 3. dem FTI-Index, der Zeilen in der DocDescriptor-Relation mit eine Strukturinformation aus diesem im XASR verknüpft 4. der FNI-Index, der Einträge aus dem FTI-Index übernimmt und durch die Referenz auf einen Lexikoneintrag ergänzt Die in XASR enthaltene Strukturinformation umfasst den Namen des Knotens (ename), die Nummerierung des Knotens bei schrittweisem Durchlaufen des Baums mit dem Algorithmus für depth-first traversal (dMin und dMax) sowie die dMin des Elternknotens (parent_dMin). Die Anfrage erfolgt dann in SQL. So würde beispielsweise die folgende Anfrage die URI aller indizierter Dokumente liefern, die im Titel das Wort „Tempest“ enthalten. SELECT DISTINCT dd.uri FROM DocDesc dd WHERE EXISTS( SELECT * FROM XASR p, XASR n, Lexicon lp, Lexicon ln, FTI fti, Lexicon lf WHERE p.docID = n.docID AND p.dMIN = n.parent_dMIN AND p.eTYPE = lp.number AND lp.word = „PLAY“ AND n.eTYPE = ln.number AND ln.word = „TITLE“ AND fti.docID = p.docID AND fti.dMIN = n.dMIN AND fti.number = lf.number AND lf.word = „Tempest“ AND dd.docID = p.docID) In der WHERE-Phrase stehen alle docID-Variablen in einer Identitätsbeziehung, mit den Teilausdrücken p.dMIN = n.parent_dMIN und fti.dMIN = n.dMIN werden dahingegen die Hierarchiebeziehung simuliert. Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 16 von 22 Eine Reindizierung von Dokumenten erfolgt in Natix nicht automatisch. Vielmehr ist der Auftrag zur Reindizierung der Datenbank über die Anbindungsebene mitzuteilen. Es ist allerdings möglich, Reindizierungs-Aufträge auf einzelne Dokumente zu beschränken, bspw. auf das zuvor modifizierte Dokument. 3.5. Performance Kanne und Moerkotte haben in Natix Performance-Vergleiche mit zwei unterschiedlichen Belegungen der split matrix durchgeführt: - Die Belegung „Record:Node 1:1“ gibt vor, dass jedes Objekt ein standalone ist. - Die Belegung „Record:Node 1:n“ lässt dem Natix-Teilungsalgorithmus freie Hand bei der Einrichtung von Datensätzen. Ein zusätzlicher Parameter ist die Repräsentation der Baumstruktur im Speicher. Im Beispiel für die Arbeitsweise des Teilungsalgorithmus in Abschnitt 3.2. hatten wir implizit vorausgesetzt, dass der Baum in pre-order repräsentiert ist. Jeder nicht-binäre Baum lässt sich aber auch in eine binäre Repräsentation umwandeln, den sog. threaded binary tree [10]. Der Elternknoten erhält dabei nur die Verbindung zum linken Kind, die übrigen Kinder werden als rechtes Kind des vorher linken Nachbarn eingesetzt. Eine solche „Breite-zuerst“-Baumstruktur würde sowohl für den Datensatz als auch für den Split ein anderes Ergebnis liefern: Abbildung 12: Ermittlung des Teilungspfades in der binären Repräsentation von tempest.xml Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 17 von 22 Der Split kommt ohne Gerüst-Aggretate aus und verfestigt insbes. die Nachbarschaftsbeziehungen der Knoten: Abbildung 13: Split der binären Repräsentation von tempest.xml Ausgehend davon, dass ein solcher struktureller Unterschied Auswirkungen auf die Performance haben muss, definierten Kanne und Moerkotte einen zweiten Parameter: - „Append“: Repräsentation in pre-order - „Incremental Update“: binäre Repräsentation als threaded binary tree Dritter Parameter in der Untersuchung ist die konfigurierte Seitengröße von 2K bis 32K. Ziel von Kanne und Moerkotte war es zu überprüfen, ob der Teilungsalgorithmus in Natix tatsächlich nennenswerte Vorteile bringt. Als Material dient die komplette XML-Version von Shakespeares gesammelten Werken. Über die verwendete Dokumentenversion gibt die Kannes und Moerkottes Publikation der Ergebnisse keine Auskunft. Es sei hier nur exemplarisch das Ergebnis für Einfügeoperationen vorgestellt. Bei beiden Konfigurationen der Matrix bringt hier die pre-order-Repräsentation eine klaren Vorteil. Die Konfiguration Record:Node 1:1 mit pre-order-Repräsentation ist bei kleinen Seitengrößen der Konfiguration Record:Node 1:n bei binärer Repräsentation überlegen. Das beste Ergebnis liefert allerdings die 1:n-Konfiguration bei Seitengrößen ab ca. 7K. Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 18 von 22 Abbildung 14: Performancemessung für Einfügeoperatinen in Natix. Quelle: [9] Bei den Ergebnissen zeichnet sich bei allen Anfrage-Operationen sowie bei der einfachen Durchquerung der Dokumente ein signifikanter Vorteil für die binäre Repräsentation in Kombination mit einer Konfiguration, die die volle Ausnutzung des hybriden Speicherungsformat zulässt. Bei der einfachen Durchquerung ist bei Seitengrößen unter 10K eine Konfiguration mit Record:Node 1:1 günstiger, jedoch lässt sich mit Seitengrößen >10K für alle Konfigurationen eine kürzere Bearbeitungszeit erzielen. Unabhängig von der Seitengröße ist dagegen die Performance für die exemplarische Anfrage mit kleinteiligem Ergebnis bei Konfiguration Record:Node 1:n und binärer Repräsentation für alle der getesteten Seitengrößen-Einstellungen um 30 bis 50% besser als die Alternativen. (Gegenstand dieser kleinteiligen Anfrage war hier die Wiederherstellung der textuellen Repräsentation des ersten SPEECH-Elementes in jeder Szene.) Auch der Speicherplatzbedarf wurde verglichen. Er ist bei Seitengrößen um die 17K für das verwendete Material für alle Konfigurationen relativ niedrig, bei pre-order-Repräsentation und 1:n-Konfiguration wächst er allerdings mit Seitengrößen >17K wieder leicht an. 3.6. Diskussion Obwohl bei Natix noch – beispielsweise bei den Query Compilern – Entwicklungsbedarf besteht ist es bemerkenswert, dass ein kleines akademisches Team und ein daraus ausgegründetes Unternehmen ausreichte, um diese Entwicklung bereits nach wenigen Jahren zur Produktionsreife zu bringen. Die API-Treiber ermöglichen es, bereits mit Kentnissen der offen zugänglichen und in dem W3C-Umfeld weithin akzeptierten Standards DOM und SAX Anwendungen auf dieser Datenbank zu programmieren. Ein tieferes Verständnis von Natix ist daher bei der Optimierung der anwendungsbezogenen Konfiguration, dem Einsatz von Protokollen für Transaktionen, der Reindizierung sowie für die Programmierung von Oberflächen für Anfragen an die Indextabellen erforderlich. Die Indexstruktur mit Lexikon, XASR, FNI und FTI bietet sehr flexible Suchmöglichkeiten, muss Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 19 von 22 allerdings auch die bisher offenbar fehlende Strukturierung der Daten in Collections ersetzen. Konzeptionell wirken die bisherigen Publikationen über Natix sehr kohärent, insbes. das Speicherungsmodell ist überzeugend. Jedoch gibt es in der uns bekannten Literatur keine statistische Grundlage, um die tatsächlichen Performance-Vorteile zu beurteilen. Insbesondere fehlt es an einer vergleichenden Untersuchung mit einer konkurrierenden Datenbank. 4. Tamino Zielsetzung bei Tamino ist eine integrierte XML-Sicht auf strukturierte, semi- und unstrukturierte Daten. Tamino ist darüber hinaus ein Instrument, um Daten aus externen Quellen (z.B. aus relationalen Datenbanken) in Views zu integrieren oder als Bausteine für neu zu erstellende XML-Dokumente zu verwenden. Der Zugriff auf Tamino erfolgt im Gegensatz zu Natix in der Regel nicht über APIs, sondern über HTTP. Das Dokument oder das Kommando erreicht den Tamino Web Server über die Schnittstelle XPort. Anschließend wird es von der XML-Maschine akzeptiert. Letzere wertet die Kommandos auf Grundlage der Meta-Daten im Tamino-Repositorium aus. Die eigentliche Bearbeitung findet in der XML-Engine statt. Für die Kommunikation mit auf externen Quellen hat Tamino zwei zusätzliche Schnittstellen, die direkt mit der XML-Engine in Verbindung stehen: Die bidirektionale Übertragung von XML-Dokumenten oder -befehlen zwischen externen Applikationen und Tamino kann über die sog. X-Tension erfolgen, die direkt aus einer Server Extension Daten austauscht. Daneben stehen APIs für den bidirektionalen Austausch mit externen Datenbanken zur Verfügung. Hier ist die Kommunikation über eine Komponente namens X-Node realisiert. Tamino unterstützt DOM, JDOM und SAX. In den nachfolgenden, derzeit (Juni 2002) auf der Webpage von Software-AG publizierten Schema der Architektur von Tamino sticht die Komponente Object Processor & Object Composer als das zentrales Element heraus. Hier findet die Vermittlung zwischen Query Interpreter und Daten statt. Abbildung 15: Architektur von Tamino. Quelle: [17]. Beschriftung „XML-Machine“ und „XML-Engine“ von mwi. Zu den Aufgaben des Document Composers gehört es, zur Laufzeit die Dokumentenschemata (document schemas) zu erstellen. Diese Schemata werden als „Data Maps“ verwaltet. Dokumentenschemata sind im Data Map hierarchisch einer weiteren Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 20 von 22 Gruppierungsebene untergeordnet, den Collections. Beim Übertragen von Dokumenten prüft Tamino, ob das Dokument als Mitglied einer Collection deklariert wurde. Wenn ja, dann sucht Tamino innerhalb der Collection aufgrund des Typs des Dokumenten-Wurzelelements nach einem passenden Schema. Kann die Dokumentenstruktur gegen ein Schema verifiziert werden, dann bleibt diese Information im Data Map erhalten. Über die im Data Map gespeicherte Strukturinformation hinaus stellt Tamino drei Typen von Indizes zur Verfügung: - wertbasierte Indizes zur Unterstützung von datenzentrierten Anfragen - Textindizierung zur Unterstützung von dokumentenzentrierten Anfragen - Strukturindizes zur Spezifikation von Suchbereichen Grundsätzlich sind in Tamino auch Volltextsuchen möglich, die das Markup ignorieren. Die Speicherung in Tamino ist modellbasiert, es ist kein Konzept für eine Abbildung von Dokumentenstrukturen in flat streams publiziert. 5. Ausblick Natix und Tamino sind Teil einer relativ jungen Entwicklung, Robert Bourret stellt sie in einem Überblicksartikel zum status quo der nativen XML-Datenbanken zusammen mit 28 mehr oder weniger vergleichbaren Produkten vor [2]. Aber bereits im Vergleich dieser beiden Datenbanken zeichnen sich unterschiedliche Richtungsentscheidungen ab: Natix ist auf AnwendungsprogramiererInnen zugeschnitten, es sind vor allem Informationen publiziert, die ein analytisches Verständnis der Datenbank ermöglichen und bspw. technische Entscheidungen bei den veränderlichen Parametern unterstützen. Diese Strategie veranlasst Fiebig, Kanne und Moerkotte (data ex machina), zu schreiben, dass die Dateisystemtreiber bereitgestellt werden, damit „die eventuell bestehende Hürde beim Einsatz eines neuen DBMS leichter geommen werden kann“ ([4] S. 9). Dahingegen wird Software AG bei der Vermarktung von Tamino recht konkret, wenn es um externe, zu integrierender Geräte und Systeme geht. Vielleicht ist hier auch eine Ursache für den höheren Bekanntheitsgrad und den größeren kommerziellen Erfolg von Tamino. Gleichwohl fehlt es zu einem tatsächlichen Leistungsvergleich an Daten. Native XML-Datenbanken werden zur Zeit werden zur Zeit auf einem Markt angeboten, der im wesentlichen bereits Lösungen zur Bereitstellung und Organisation von Daten in relationalen Datenbanken oder in Dateisystemen einerseits und in Dokumentenverwaltungssystemen andererseits gefunden hat. Niedrigere Kosten und ein erheblich geringerer Aufwand für die Datenbankadministration und –programmierung könnten den nativen XML-Datenbanken in der näheren Zukunft ebenso Aufwind geben wie die ungleich viel höhere Flexibilität bei der Definition von Schemata. Letzteres macht native XML-Datenbanken auch interessant für die Datenbankintegration – eine Chance, die wohl in der schematischen Darstellung der Architektur von Tamino bewusst hervorgehoben ist. Eines der interessantesten Potentiale von nativen XML-Datenbanken möglicherweise in der Konkurrenz zu Dokumentenverwaltungssystemen. Längerfristig könnten gerade hier das Problem der Verfügbarkeit vorhandenen Wissens ebenso den Wunsch nach effizient abfragbaren Repositorien führen wie der Wunsch nach möglichst fokussierter Präsentation der gesuchten Information in den Ergebnissen von Anfragen. 6. Literatur [1] Ronald Bourret. XML and Databases. Stand von Februar 2002. Erhältlich unter http://www.rpbourret.com/xml/XMLAndDatabases.htm [2] Ronald Bourret. XML Database Products: Native XML Databases. Stand vom Februar 2002. Erhältlich unter http://www.rpbourret.com/xml/ProdsNative.htm Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 21 von 22 [3] Lauren Wood et al. (Hrsg.). W3C Document Object Model (DOM) Level 1 Specification, Version 1.0, W3C Working Draft 29 September 2000. W3C Recommendation, erhältlich unter: http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929 [4] Thorsten Fiebig, Carl-Christian Kanne, Guido Moerkotte. Natix – ein natives XML-DBMS. Datenbankspektrum 1 (2001), 5-13, 2001 [5] Thorsten Fiebig, Guido Moerkotte. Evaluating Queries on Structure with eXtended Access Support Relations [6] Charles F. Goldfarb’s SGML Source: InFrequently Asked Questions (InFAQs), Überarbeitung vom 26. Dezember 2001, erhältlich unter http://www.sgmlsource.com/infaqs.htm [7] Charles F. Goldfarb et al. A Reader’s Guide to the HyTime Standard. Überarbeitung vom 25. Juni 1997, erhältlich unter http://www.hytime.org/papers/htguide.htm [8] S. Helmer, Carl-Christian Kanne, Guido Moerkotte. Isolation in XML Bases. Technical Report of the University of Mannheim 15, 2001 [9] Carl-Christian Kanne, Guido Moerkotte. Efficient storage of XML data. Technical Report of the University of Mannheim 16, 2001 [10] Donald E. Knuth. The Art of Computer Programming, Band 1, Kapitel 2.3.2. Addison Wesley, 3. Auflage, 2000 [11] Ingo Macherius, Peter Fankhäuser, Thomas Tesch. Modul 3: XML Datenmanagement. Folien zum Vortrag auf der 30. Jahrestagung des GI e.V. in Berlin, 19. September 2000, erhältlich unter http://swt.cs.tu-berlin.de/informatik2000/skripte/xml-datenbank.pdf [12] Gerhard Michal (ed.). Biochemical Pathways. Spektrum Akademischer Verlag, Heidelberg, 1999. [13] Natix: Ein natives Datenbanksystem für XML, erhältlich unter http://pi3.informatik.unimannheim.de/staff/mitarbeiter/moer/natix.html [14] Harald Schöning. Tamino – a DBMS Designed for XML. IEEE 2001 [15] Harald Schöning, Jürgen Wäsch. Tamino – An Internet Database System. In: C. Zaniolo et al. (Hrsg.): EDBT 2000, LNCS 1777, pp. 383-387, 2000 [16] UNC Sunsite. XML Sample Documents. Erhältlich unter: http://metalab.unc.edu/pub/suninfo/standards/xml/eg/ [17] Software-AG: Architecture of http://www.xmlstarterkit.com/tamino/architecture.htm Tamino. Erhältlich [18] data ex machina-Webpage: http://www.dataexmachina.de/natix.html Seminar 1912, Ausarbeitung zum Vortrag „Native XML-Datenbanken: Natix und Tamino“ von Monika Wienbeck Seite 22 von 22 unter: