Labeling dynamischer XML-Bäume Seminararbeit von Jochen Leitz vorgelegt am Lehrstuhl für Praktische Informatik III Prof. Dr. Guido Moerkotte Universität Mannheim im Februar 2004 Inhaltsverzeichnis 1 Einleitung 3 2 Grundlagen 5 2.1 Strukturelle Anfragen . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 Labeling-Algorithmen . . . . . . . . . . . . . . . . . . . . . . . 6 2.2.1 Präfixbäume . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2.2 Intervallbäume . . . . . . . . . . . . . . . . . . . . . . 8 2.3 Anwendung struktureller Labels . . . . . . . . . . . . . . . . . 8 3 Statisches Labeling 9 4 Dynamisches Labeling 11 4.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.2 Labeling mittels Präfixbäumen . . . . . . . . . . . . . . . . . . 12 4.3 Labeling mittels Intervallbäumen . . . . . . . . . . . . . . . . 13 4.3.1 Ganzzahlige Markierung . . . . . . . . . . . . . . . . . 14 4.3.2 Intervall-Labeling . . . . . . . . . . . . . . . . . . . . . 17 4.3.3 Erweiterung des Intervall-Labeling . . . . . . . . . . . 17 5 Clues 19 5.1 Größe eines Labels . . . . . . . . . . . . . . . . . . . . . . . . 19 5.1.1 Statisches Labeling . . . . . . . . . . . . . . . . . . . . 19 5.1.2 Dynamisches Labeling . . . . . . . . . . . . . . . . . . 19 5.2 Subtree Clues . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 5.3 Sibling Clues . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 6 Zusammenfassung 24 Literaturverzeichnis 24 2 1 Einleitung Der Inhalt eines XML-Dokuments [1] kann als eine Menge von Dokumentknoten dargestellt werden. Um die Knoten innerhalb eines Dokuments unterscheiden zu können, muss jeder mit einem eindeutigen Kennzeichner (Label ) versehen werden. Diese Labels sind grundsätzlich beim gezielten Zugriff auf Dokumentinhalte, wie bei der Anfragebearbeitung, notwendig. Bei geschickter Wahl können Labels nicht nur zum Identifizieren von Knoten dienen, sondern erlauben auch die Beantwortung von strukturellen Anfragen ausschließlich durch Indexzugriff. Labels können so gewählt werden, dass für zwei Knoten nur durch Vergleich ihrer Labels entschieden werden kann, ob zwischen den Knoten eine Vorgänger-/Nachfolgerbeziehung besteht. Zur Hilfe bei der effizienten Auswertung von Anfragen werden also zwei Anforderungen an ein Label gestellt: es muss einen Knoten eindeutig identifizieren und Strukturinformation enthalten. XML-Dokumente lassen sich als Bäume darstellen. Es werden für die Vergabe von Labels statische Bäume betrachtet, in denen die Baumstruktur bekannt ist, und dynamische Bäume, in denen sich die Struktur z. B. durch Einfügen weiterer Knoten ändern kann. Im statischen Fall ist es einfach, ein einziges Label, das beide der oben genannten Anforderungen erfüllt, zuzuweisen. Im dynamischen Fall werden häufig zwei Labels pro Knoten verwendet: ein eindeutiges, persistentes, das beim Einfügen eines Knotens in das Dokument vergeben wird und immer gleich bleibt, und ein strukturelles für die Strukturinformationen, das bei weiteren Änderungen am Dokument neu berechnet werden muss, da sich die strukturellen Beziehungen zwischen Knoten geändert haben könnten. 3 Die hier behandelte Arbeit von Cohen, Kaplan und Milo [3] untersucht Labeling-Algorithmen für statische und dynamische XML-Bäume. Für die dynamische Variante wird gezeigt, wie ein einziges persistentes, strukturelles Label beim Einfügen jedes Knotens vergeben werden kann. Des Weiteren wird die Größe der von beiden Varianten erzeugten Labels verglichen, um den benötigten Speicherplatz abzuschätzen. Der weitere Verlauf ist wie folgt: In Abschnitt 2 werden Grundlagen erklärt. Um die Auswertung struktureller Anfragen ohne Zugriff auf Nutzdaten zu zeigen, wird statisches Labeling an einem Beispiel in Abschnitt 3 betrachtet. In Abschnitt 4 werden dynamische Labeling-Algorithmen vorgestellt. Weiter zeigt die Arbeit in Abschnitt 5 einen Vergleich des Speicherverbrauchs beim statischen und dynamischen Labeling, und wie die Größe der Labels im dynamischen Fall verringert werden kann, wenn Hinweise (clues) auf die zukünftige Dokumentstruktur vorhanden sind. Zuletzt erfolgt in Abschnitt 6 die Zusammenfassung. 4 2 Grundlagen 2.1 Strukturelle Anfragen Um den Begriff des strukturellen Labels genauer zu erklären, wird er anhand seines Einsatzgebiets vorgestellt. Ein Beispiel für eine strukturelle Anfrage, die durch Labels unterstützt werden kann, ist die Suche nach allen Titeln von Büchern in einem XML-Literaturverzeichnis. In diesem Fall sollen alle Dokumentknoten vom Typ titel geliefert werden, die als Vorgänger einen buch-Knoten haben, und nicht einen artikel- oder zeitschrift-Knoten (siehe Abb. 1). literatur buecher zeitschriften buch buch zeitschrift titel titel titel Abbildung 1: Beispieldokument Über diese Vorgänger-/Nachfolgerbeziehung soll nur durch Betrachten der strukturellen Labels, ohne Untersuchung der Nutzdaten, entschieden werden können. Damit wird vermieden, für jeden titel-Knoten im Dokument durch Textsuche zu überprüfen, ob er innerhalb eines buch-Knotens vorkommt, oder nicht. 5 2.2 Labeling-Algorithmen Bei der Berechnung von strukturellen Labels werden in dieser Arbeit statische und dynamische Labelingverfahren unterschieden. Im Folgenden ist L(B) die Menge der strukturellen Labels eines Baums B und L(v) das Label eines Knotens v aus der Knotenmenge des Baums V (B). L(B) wird als gültig bezeichnet, wenn jedem Knoten ein eindeutiges Label zugeordnet ist, so dass ein Vergleich zwischen zwei Labels dieselbe Beziehung ergibt, wie sie auch tatsächlich im Baum zwischen den Knoten besteht. statischer Labeling-Algorithmus: Eingabe: B mit bekannter Struktur Ausgabe: L(B) = {L(v) : v ∈ V (B)} gültig für die gegebene Struktur von B dynamischer Labeling-Algorithmus: Eingabe: B mit teilweise bekannter Struktur Ausgabe: L(B) = {L(v) : v ∈ V (B)} gültig für alle möglichen Fortsetzungen von B Bei der statischen Variante ist somit das Labeling an eine feste Baumstruktur (statischer Baum) gebunden, und die Labels müssen für alle Knoten neu berechnet werden, wenn sich die Struktur z. B. durch Einfügen neuer Knoten ändert. Für statische Bäume genügt diese Art Algorithmus. Wenn jedoch bei dynamischen Bäumen Knoten nach Änderungen weiterhin eindeutig identifiziert werden sollen, muss zusätzlich zum strukturellen ein eindeutiges persistentes Label existieren. Ein dynamischer Labeling-Algorithmus erhält als Eingabe einen dynamischen Baum, in den noch Knoten eingefügt werden können. Labels werden so vergeben, dass das Labeling trotzdem in obigem Sinne gültig bleibt. D. h. 6 beim Einfügen neuer Knoten müssen die Labels bereits vorhandener Knoten nicht neu berechnet werden, die Labels sind eindeutig und anhand ihnen kann über strukturelle Beziehungen entschieden werden. Ein solches kann also als persistentes strukturelles Label verwendet werden. Gleichgültig welches Verfahren verwendet wird, es gibt zwei wesentliche Möglichkeiten, strukturelle Labels zu berechnen. Entweder wird der Baum als Präfixbaum, oder als Intervallbaum aufgefasst. 2.2.1 Präfixbäume Ein Präfixbaum ist in dieser Arbeit so definiert, dass für zwei Knoten u,v und ihre zugeordneten Präfixe L(u),L(v) gilt: v Nachfolger von u ⇐⇒ L(u) Präfix von L(v) Zum Beispiel ist in Abbildung 2 das Label 10 Präfix aller anderen Labels und damit ist sein Knoten Vorgänger aller anderen. [1, 8] 10 100 1010 [2, 5] 1000 [6, 7] [3, 4] Abbildung 2: Präfixbaum Abbildung 3: Intervallbaum 7 2.2.2 Intervallbäume Ein Intervallbaum ist hier folgendermaßen definiert: Für zwei Knoten u,v und ihre zugeordneten Intervalle L(u),L(v) gilt: v Nachfolger von u ⇐⇒ L(v) ⊆ L(u) Die Intervalle werden als Labels verwendet. So sind in Abb. 3, die einen durch Tiefensuche nummerierten Baum zeigt, die Intervalle [2, 5], [6, 7] und [3, 4] Teilmengen des Intervalls der Wurzel [1, 8], und die dazugehörigen Knoten sind somit Nachfolger des Wurzelknotens. Durch mit Präfix- und Intervallbäumen berechnete Labels kann also über Beziehungen zwischen Knoten entschieden werden, ohne den tatsächlichen Baum zu betrachten, d. h. die Struktur der Nutzdaten zu untersuchen. 2.3 Anwendung struktureller Labels Die Tatsache, dass anhand der Labels über Strukturbeziehungen entschieden werden kann, wird insbesondere bei der Speicherung von Dokumenten in XML-Datenbankmanagementsystemen (XDBMS) interessant. Diese besitzen Indexstrukturen, die eine schnellere Auswertung von Anfragen auf die gespeicherten Dokumente erlauben. Eine mögliche Indexstruktur ist ein Key-Value - Index. Die Schlüssel (keys) sind die Elemente, Attribute und Worte eines XML-Dokuments. Jedem Schlüssel wird folgender Wert (value) zugeordnet: die Liste der Dokumente in denen er vorkommt, und pro Dokument die Labels der betroffenen Knoten. Handelt es sich um strukturelle Labels, kann über Beziehungen zwischen Knoten nur durch Betrachtung der Labels in der Indexstruktur entschieden werden. Hier ist ein dynamischer Labeling-Algorithmus sinnvoll, da es bei Updates auf Dokumente nicht erwünscht ist, Labels neu zu berechnen, und dadurch die Indexstruktur ebenfalls aktualisieren zu müssen. 8 3 Statisches Labeling Beim statischen Labeling ist die Struktur des Baums bekannt, und er kann Knoten für Knoten mit Labels versehen werden. Im folgenden Beispiel entsteht durch Tiefensuchenummerierung ein strukturelles Label, das zugleich eindeutig ist. Somit können die Knoten über ihre Label z. B. in eine Hashtabelle abgebildet werden. literatur buecher [1, 18] [2, 11] zeitschriften [12, 17] buch [3, 6] buch [7, 10] zeitschrift [13, 16] titel [4, 5] titel [8, 9] titel [14, 15] Abbildung 4: statisches Labeling durch einen Intervallbaum ... −→ . . . {<buecher>} −→ {dokument1, {[2, 11]}} {<buch>} −→ {dokument1, {[3, 6], [7, 10]}} {<titel>} −→ {dokument1, {[4, 5], [8, 9], [14, 15]}} ... −→ . . . Abbildung 5: Auschnitt eines Key-Value - Index In den Abbildungen 4 und 5 wird der Zusammenhang zwischen Labels und Index gezeigt. Zur Vereinfachung wird nur ein Dokument verwendet. Betrachtet wird nun eine Anfrage an ein Literaturverzeichnis mit verschiedenen 9 Arten von Quellen wie Büchern, Zeitschriften, u. s. w. nach allen Buchtiteln (z. B. in der XML-Anfragesprache XPath[2]: //buch/titel). Es müssen alle titel-Knoten in die Ergebnismenge, die einen buchKnoten als Vorgänger haben, d. h. das Intervall des titel-Knotens muss Teilmenge des Intervalls eines buch-Knotens sein. Bei den titel-Knoten mit Label [4, 5] und [8, 9] ist dies wegen [4, 5] ⊆ [3, 6] und [8, 9] ⊆ [7, 10] der Fall. Für den titel-Knoten mit Label [14, 15] gibt es keinen buchKnoten, dessen Intervall seines umfasst. Erst wenn so die Labels der relevanten Knoten bestimmt wurden, muss auf die Nutzdaten zugegriffen werden, um das tatsächliche Ergebnis der Anfrage, in diesem Fall den Inhalt der titel-Knoten, zu liefern. Wenn dieser Baum durch das Einfügen oder Entfernen von Knoten dynamisch wird, gibt es jedoch einige Probleme, die im folgenden Abschnitt erklärt werden. 10 4 Dynamisches Labeling 4.1 Motivation Wenn Knoten aus einem mit statischem Labeling bearbeiteten Baum wie im letzten Abschnitt entfernt werden, bleibt die Teilmengenbeziehung zwar erhalten, es entstehen aber unnötige Lücken zwischen den Wertebereichen der Labels. Kleine Werte bleiben unbenutzt, dafür werden größere verwendet. Dies ist nicht erwünscht, da Labels möglichst klein sein sollen, um sie schnell vergleichen und effizient speichern zu können. Beim Einfügen neuer Knoten in den Baum müssen die Labels neu berechnet werden, da z. B. unter den Blättern kein Platz mehr für neue Intervalle ist. Die Möglichkeit, im Voraus Lücken zwischen den Labels zu definieren, um Platz für zukünftige Knoten zu lassen, hat den Nachteil, dass Wertebereiche für Labels reserviert sind, die vielleicht niemals gebraucht werden, oder dass zuwenig Platz reserviert wird, was eine Neuberechnung notwendig macht. Um trotz der Neuberechnung des strukturellen Labels jedem Knoten ein eindeutiges, dauerhaftes Label zuzuordnen, wird zusätzlich zu dem aus einem statischen Labeling gewonnenen strukturellen Label ein zweites persistentes Label pro Knoten verwendet, das beim Einfügen des Knotens zugewiesen wird. Dynamisches Labeling sorgt nun dafür, dass Bäume mit persistenten strukturellen Labels versehen werden können, so dass diese bei Updates nicht neu berechnet werden müssen. Als Updates werden hier Einfügen und Entfernen betrachtet. Verschieben wird als Entfernen mit anschließendem Einfügen modelliert, da sich hierbei die Dokumentstruktur und damit Vorgänger- oder Nachfolgerbeziehungen zwischen Knoten ändern, die bereits mit Labels versehen waren. In einem solchen Fall müssten Labels auch bei dynamischem Labeling 11 neu berechnet werden. Wenn z. B. ein Blattknoten an die Stelle der Wurzel verschoben wird, kann sein strukturelles Label nicht mehr zum Vergleich verwendet werden, da bei seiner Berechnung von einer anderen Position im Baum ausgegangen wurde. Hier wird statt der Aktualisierung des Labels der Knoten gelöscht, an der neuen Position eingefügt und ein neues Label vergeben. Im Folgenden wird dynamisches Labeling mit Präfix- und Intervallbäumen an Beispielen vorgeführt.. 4.2 Labeling mittels Präfixbäumen In dem hier betrachteten Präfixbaum werden Labels wie folgt vergeben: 1. Die Wurzel erhält einen leeren Text als Label. 2. Angenommen, der Knoten v ist von links gezählt das i-te Kind eines Knotens u. Dann berechnet sich das Label von v, indem an das Label von u die Zeichenkette 00 1i−1 000 angehängt wird. L(v) = L(u).00 1i−1 000 . Für zwei Knoten u, v gilt: L(u) Präfix von L(v) ⇐⇒ u Vorgänger von v Das liegt daran, dass an ein Label L(u), um Nachfolgerlabels zu erhalten, nur Zeichenketten angehängt werden. Somit ist L(u) Präfix aller Labels im Teilbaum unter u. An einem Beispiel lässt sich das einfach veranschaulichen. In Abbildung 6 sind an den Kanten die anzuhängenden Zeichenketten, und in den Knoten die Labels eingetragen. Hier ist die Idee, die dynamisches Labeling ermöglicht, sichtbar. In jedem Knoten werden die Labels, die für den darunterliegenden Teilbaum zukünftig benötigt werden, durch einen Präfix reserviert. 12 ”” 0 0 10 0 00 110 10 110 0 100 10 0 1010 1100 Abbildung 6: dynamisches Labeling durch einen Präfixbaum Der Knoten mit Label 0 reserviert für seinen Teilbaum alle möglichen Labels mit Präfix 0. Der darunterliegende Knoten reserviert alle mit Präfix 00. Genauso reserviert der Knoten mit 10 alle denkbaren Labels mit Präfix 10, und so weiter. Bei anderen Knoten außer Vorgänger und Nachfolger kann es durch diese Konstruktion nicht passieren, dass ein Label Präfix des anderen ist. Das liegt daran, dass für verschiedene Teilbäume verschiedene Präfixe reserviert werden, und bei Kindern diese Präfixe immer verlängert werden. Es kann somit über Vorgänger-/Nachfolgerbeziehungen entschieden werden. Zudem müssen die Labels beim Einfügen von Knoten nicht neu berechnet werden, da die Blätter beliebig erweiterbar sind. 4.3 Labeling mittels Intervallbäumen Bei Intervallbäumen kann kein so frei erweiterbares Schema gefunden werden wie bei Präfixbäumen, da eine obere Intervallgrenze festgelegt werden muss. Bei Präfixbäumen ist die obere Grenze des Wertebereichs für einen Teilbaum offen. Es gibt aber eine Möglichkeit, die Intervalle einfach zu vergrößern, wenn keine Teilmengen dieser Intervalle mehr gebildet werden können [3, S. 10]. 13 Zunächst wird an einem Beispiel ein dynamischer Labeling-Algorithmus aus dem Artikel vorgestellt, der dieser Seminararbeit zugrunde liegt [3, S. 6]. Wie auch der Artikel klar sagt, ist der Algorithmus nur ein analytisches Werkzeug, da die Laufzeit abschreckend ist. Im folgenden Algorithmus ist die Baumstruktur unbekannt. Die Anzahl zukünftiger Knoten im Dokument wird zwar vorausgesetzt, es ist aber durch die später vorgestellte Methode der Intervallvergrößerung möglich, weitere Knoten in das Dokument einzufügen. Bei ihrer Anwendung müssen zugewiesenen Labels nicht neu berechnet werden, so dass das Verfahren zu den dynamischen gezählt werden kann. 4.3.1 Ganzzahlige Markierung Gegeben sei eine Sequenz von einzufügenden Knoten {a, b, c, d} in ein leeres Dokument. Der fertige Baum soll die Gestalt wie in Abbildung 7 haben. a b c d Abbildung 7: Dokument Dazu betrachten wir alle möglichen Präfix-Labels nach dem Algorithmus aus Abschnitt 4.2 für Bäume, die mit dieser Anzahl Knoten, also 4, gebildet werden können (siehe Abb. 8). Nun kann für jeden Knoten v eine ganzzahlige Markierung N (v) berechnet werden. Sie ergibt sich aus der Anzahl verschiedener Labels, die an mögliche 14 ”” a 0 0 0 b 00 c 10 10 10 110 110 100 010 d 100 0 000 Abbildung 8: mögliche Labels für einen Baum mit 4 Knoten 15 Nachfolgerknoten von v vergeben werden können, plus 1. Mögliche Nachfolgerknoten sind dabei alle Knoten, die in der Einfügesequenz hinter v stehen. Sie können aber an beliebigen Stellen im Teilbaum von v eingefügt werden. Nur die Reihenfolge muss die gleiche bleiben, wie in der Einfügesequenz. Im Beispiel heißt das • für a: Die Nachfolgerknoten sind b, c und d. Sie können an allen Stellen unterhalb der Wurzel auftauchen. Dabei wird die Reihenfolge „erst b, dann c, dann d “ beibehalten, nur die Knoten, an denen eingefügt wird, ändern sich. Somit sind 7 Labels möglich: 0, 00, 010, 000, 10, 100, 110 ⇒ N (a) = 7 + 1 = 8 • für b: Die Nachfolgerknoten sind c und d. Der Knoten b ist jetzt eingefügt und hat das für ihn einzig mögliche Label 0. Nur wenn c und d unter 0 eingefügt werden, sind sie Nachfolger von b. Unterhalb 0 gibt es 3 mögliche Labels: 00, 010, 000 ⇒ N (b) = 3 + 1 = 4 • für c: Der Nachfolgerknoten ist d. c ist eingefügt und hat das Label 00. Der Knoten d ist nur Nachfolger von c, wenn er unterhalb 00 eingefügt wird. Dafür gibt es eine Möglichkeit: 000 ⇒ N (c) = 1 + 1 = 2 • für d: Der Knoten d hat keine Nachfolgerknoten. ⇒ N (d) = 0 + 1 = 1 Den markierten Baum zeigt die linke Seite in Abbildung 9. Die Zweierpotenzen sind Zufall, wie an einem Beispiel mit fünf Knoten gezeigt werden könnte. 16 8 [1, 8] 4 [1, 4] 2 1 [1, 2] [3, 3] Abbildung 9: Labeling durch ganzzahlige Markierung 4.3.2 Intervall-Labeling Mit dieser Markierung kann nun ein Intervall-Labeling (siehe Abb. 9) erfolgen: 1. Die Wurzel root erhält das Intervall [1, N (root)]. 2. Alle anderen Knoten v erhalten ein N (v) großes Intervall aus dem Intervall ihres Elternknotens. Intervalle von Geschwistern werden dabei aneinandergereiht. Am Beispiel sieht man, wie hinsichtlich der Struktur eines Baums noch Platz für zukünftige Nachfolger gelassen wird. Wenn in einem Intervall kein Platz mehr für Teilmengen ist, kann es leicht vergrößert werden. 4.3.3 Erweiterung des Intervall-Labeling Intervalle können erweitert werden, indem in der Binärdarstellung eines Intervalls [a, b] an a eine Sequenz 0en und an b eine gleichlange Sequenz 1en angehängt wird. Beim Anhängen von n Bits multipliziert sich die Größe des Intervalls mit Faktor 2n (siehe Abb. 10). Dabei ist zu beachten, dass das Label, also das Intervall, nicht neu gespeichert werden muss. Es muss lediglich für die Vergleichsfunktion vermerkt werden, wieviel Zeichen beim binären Vergleich zweier Intervalle jedesmal 17 [1, 8] [0001, 1000] ⇐⇒ [1, 4] [1, 2] [0001, 0100] [0001, 0010] [3, 3] ↓ [4, 35] 2 Bit virtuelle Erweiterung ↓ [000100, 100011] ⇐⇒ [4, 19] [4, 11] [0011, 0011] [12, 15] [000100, 010011] [000100, 001011] [001100, 001111] Abbildung 10: Erweitern von Intervallen angehängt werden müssen, wenn auf Vorgänger-/Nachfolgerbeziehungen getestet wird. Somit werden nur beim Vergleich Zeichen angehängt, das persistente strukturelle Label bleibt unverändert. Es handelt sich somit um einen dynamischen Labeling-Algorithmus. In Abb. 10 werden die tatsächlichen und die um 2 Bits erweiterten Labels dargestellt. Hier konnte z. B. das Intervall [1, 8] vor der Erweiterung 8 Labels aufnehmen. Das virtuell erweiterte Intervall [4, 35] kann danach 32, also 22 = 4mal soviel aufnehmen. Ebenso wird das Intervall [3, 3] durch Erweiterung auf [12, 15] von Größe 1 auf 4 gebracht. 18 5 Clues Die Präfix- und Intervall-Labels beim dynamischen Labeling sind länger als beim statischen und verbrauchen damit mehr Speicherplatz. Einen Vergleich und Verbesserungen beim dynamischen Labeling durch Hinweise auf die zukünftige Dokumentstruktur, sogenannte Clues, liefert dieser Abschnitt. 5.1 5.1.1 Größe eines Labels Statisches Labeling Hier wird ein anderes Labeling durch Intervalle betrachtet, als in den bisherigen Abschnitten. Der Algorithmus besteht aus zwei Schritten: 1. Nummeriere die Blätter in einem Baum von links nach rechts. 2. Weise jedem Knoten ein Intervall mit folgenden Eigenschaften zu: Die untere Grenze ist die kleinste Nummer eines Blatts in seinem Teilbaum, die obere Grenze ist die größte Nummer. Da ein Baum mit n Knoten maximal n−1 Blätter hat, ist die größte Nummer n − 1. Diese lässt sich mit O(log n) Bits darstellen. Es kann gezeigt werden [3, S. 2], dass die untere Schranke für die maximale Länge eines Labels in Ω(log n) liegt, es also keinen Algorithmus gibt, der asymptotisch kürzere Labels erzeugt. Die maximale Länge eines Labels ist damit in Θ(log n). 5.1.2 Dynamisches Labeling Zur Untersuchung von dynamischem Labeling wird ein Präfixbaum mit geringer Tiefe und einer großen Anzahl Kinder pro Knoten betrachtet (siehe Abb. 11). Mit 9 Knoten wird maximal die Länge 8 für ein Label erreicht. Dadurch, dass für das Label des i-ten Kindes eines Knotens nur 1i−1 0 angehängt wird, ist bei einem Baum mit n Knoten die maximale Länge eines Labels n − 1, also in O(n). Dies kann durch Induktion gezeigt werden. Es lässt sich wieder allgemein beweisen [3, S. 3f], dass die untere Schranke für 19 ”” 0 10 110 0 10 110 1110 0 11100 1110 10 110 111010 1110 1110110 11101110 Abbildung 11: „breiter“ Präfixbaum die maximale Länge eines Labels in Ω(n) liegt, also beliebige dynamische Labeling-Algorithmen ohne Clues nur um einen konstanten Faktor kürzere Labels erzeugen. Die maximale Länge eines Labels ist also in Θ(n). Beim statischen Labeling ist bei einem Baum mit n Knoten die maximale Länge in Θ(log n), beim dynamischen Labeling in Θ(n). Dieser exponentielle Unterschied ist anschaulich so erklärbar, dass beim dynamischen Labeling exponentiell viele Labels für mögliche zukünftige Nachfolger reserviert werden müssen, wohingegen beim statischen die Struktur feststeht und deshalb effizient Labels vergeben werden können. So werden z. B. in Abb. 11 im ganz linken Knoten 0 alle kurzen Labels mit Präfix 0 vorreserviert, obwohl sie niemals gebraucht werden, was beim Einfügen von 0 nicht bekannt ist. Statt den nicht-verwendeten kurzen Labels werden immer längere Labels zugewiesen. Ziel des nächsten Abschnitts ist es nun, dynamisches Labeling zu verbessern, um insgesamt kürzere Labels zu ermöglichen. Der Punkt dabei ist, unnötiges Reservieren kurzer Labels zu vermeiden. 20 [1, 8] [1, 4] [1, 4] [1, 2] [1, 2] [3, 3] [1, 1] [2, 2] Abbildung 12: Labeling mit/ohne Subtree Clues 5.2 Subtree Clues Dynamisches Labeling kann verbessert werden, wenn beim Einfügen eines Knotens Informationen über die zukünftige Baumstruktur aus einer DTD oder einem XML-Schema bekannt sind und in den Algorithmen ausgenutzt werden. Eine solche Information sind subtree clues. Der Subtree Clue eines Knotens v ist ein Intervall [l(v), h(v)], wobei l(v) die minimale Anzahl zukünftiger Knoten im Teilbaum mit Wurzel v ist, und h(v) die maximale. Dieses Intervall ist beim Einfügen eines Knotens gegeben. Ein Labeling-Algorithmus kann es verwenden, um kürzere Labels zu erzeugen. Der Teilbaum links aus Abbildung 12 entstand ohne Clues. Der rechte zeigt die Situation, wenn beim Einfügen des obersten Knotens der Subtree Clue [4, 4] vorhanden ist. Dann gibt es genau 4 Knoten im Teilbaum, und es genügt im obersten Knoten das kürzere Label [1, 4] zu vergeben. Auf mehr als die Idee der Subtree Clues wird hier nicht eingegangen. Durch Subtree Clues liegt die maximale Länge von Labels beim dynamischen Labeling in Θ(log 2 n) [3, S.7]. 21 5.3 Sibling Clues Ähnlich zu den Subtree Clues sind sibling clues, bei denen beim Einfügen eines Knotens noch Informationen über die zukünftige Anzahl Geschwister und die Größe ihrer Teilbäume bekannt sind. Dies bringt einen weiteren Vorteil. Angenommen, ein Knoten v1 hat eine hohe Anzahl potentieller Nachfolger, und durch den Subtree Clue seines Elternknotens u ist ebenfalls eine hohe Anzahl möglich. Wenn nun ein Sibling Clue vorliegt, der Aussage über die Anzahl zukünftiger Knoten in Teilbäumen von Geschwistern von v1 gibt, müssen für den Teilbaum von v1 ggf. weniger Labels reserviert werden, als ohne den Sibling Clue. Die Anzahl zukünftiger Knoten im Teilbaum eines Geschwisterknotens kann die potentielle Anzahl Knoten im Teilbaum von v1 reduzieren, da beide der maximalen Anzahl Knoten aus dem Subtree Clue des Vaterknotens u unterworfen sind. u max 40 Nachfolger max. 30 Nachfolger v1 v2 min. 30 Nachfolger ⇒ in v1 nur noch max. 10 Nachfolger Abbildung 13: Sibling Clues Das kann an einem Beispiel besser erklärt werden (siehe Abb. 13). Die im Bild eingetragenen Einschränkungen sind durch Clues gegeben. Wenn beim Einfügen von v1 nicht durch den Sibling Clue für v2 bekannt wäre, dass dort mindestens 30 Knoten zu erwarten sind, so würden in v1 30 Labels reserviert werden. Durch den Clue ist jedoch bekannt, dass von den maximal 22 40 Nachfolgern von u allein 30 für den Teilbaum von v2 aufgebraucht werden. In v1 muss also nur noch Platz für 10 Labels reserviert werden. Mit Sibling Clues liegt beim dynamischen Labeling die maximale Länge der Labels in Θ(log n). Für eine genauere Betrachtung sei, wie bei den Subtree Clues, auf den Artikel von Cohen, Kaplan und Milo [3, S. 8] verwiesen. Der Vergleich der maximalen Länge von Labels für alle Verfahren wird im nächsten Abschnitt zusammengefasst. 23 6 Zusammenfassung Die hier behandelte Arbeit von Cohen, Kaplan und Milo [3] stellt die Möglichkeit vor, Knoten eines XML-Baums bei ihrem Einfügen mit einem einzigen persistenten strukturellen Label zu versehen. Durch diese Labels kann ein Knoten eindeutig identifiziert werden, und sie unterstützen strukturelle Anfragen dadurch, dass anhand ihnen über Vorgänger-/Nachfolgerbeziehungen zwischen Knoten entschieden werden kann. Die Labels können mit Präfixoder Intervallbäumen berechnet werden. Bei den Labeling-Algorithmen werden statische, für bekannte Baumstruktur, und dynamische, für sich ändernde Baumstruktur unterschieden. Der Mehrverbrauch an Speicherplatz für die Labels beim dynamischen Labeling gegenüber dem statischen, kann durch Hinweise auf die zukünftige Baumstruktur ausgeglichen werden. statisch Grenzen Θ(log n) dynamisch keine Clues Subtree Clues Sibling Clues Θ(n) Θ(log 2 n) Θ(log n) Tabelle 1: maximale Länge der Labels (Baum mit n Knoten) Die maximale Länge der Labels wird in Tabelle 1 zusammengefasst. Interessant ist dabei vor allem der Beweis für die unteren Schranken, d. h. die Tatsache, dass es für diese Voraussetzungen nur Algorithmen gibt, die um einen konstanten Faktor kürzere Labels erzeugen. Literatur [1] Tim Bray, Jean Paoli, C.M. Sperberg-McQueen, and Eve Maler. Extensible markup language (xml) 1.0 (second edition). Techni- cal report, World Wide Web Consortium (W3C) Recommendation, http://www.w3.org/TR/2000/REC-xml-20001006, 2000. 24 [2] James Clark and Steve DeRose. Xml path language (xpath) version 1.0. Technical report, World Wide Web Consortium (W3C) Recommendation, http://www.w3.org/TR/xpath, 1999. [3] Edith Cohen, Haim Kaplan, and Tova Milo. Labeling dynamic xml trees. 2002. 25