Wissens- und Content Management XML-Verarbeitung Dr. Roman Schneider Institut für Informatik XML-Verarbeitung Zielsetzung 1/4 „Techniken, um XML herum“ – Möglichkeiten zur Verarbeitung von XML-Instanzen (in Datenbanken) Analyse durch XML-Prozessoren machen den Inhalt eines XML-Dokuments für die Weiterverarbeitung verfügbar nichtvalidierend / validierend in Bezug auf DTD oder XML Schema standardisierte XML-Schnittstellen für zahlreiche Programmiersprachen (Java, Python, C, C++, PL/SQL, ...) SAX (Simple API for XML) – sequentielle ereignisorientierte Verarbeitung DOM (Document Object Model) - Manipulation von Baumstrukturen Generierung von XML-Dokumenten Transformation von XML-Dokumenten (Saxon, msxml, oraxml, ...) Dr. Roman Schneider Modul Wissens- und Contentmanagement 2 XML-Verarbeitung Zielsetzung 2/4 Schemabeschreibung Modellierung XML-Dokumente Generierung Transformation Datenbank XSLT HTML XML-Instanzen werden aus Datenbankinhalten generiert – oder... Dr. Roman Schneider Modul Wissens- und Contentmanagement 3 XML-Verarbeitung Zielsetzung 3/4 Schemabeschreibung Modellierung XML-Dokumente Generierung CMS / Datenbank Transformation XSLT HTML ...XML-Instanzen werden in CMS/DBMS vorgehalten und verarbeitet. Dr. Roman Schneider Modul Wissens- und Contentmanagement 4 XML-Verarbeitung Zielsetzung 4/4 Bedienung von Anfragen: XML in => XML out oder XML in => SQL out oder SQL in => XML out Speicherung Generierung XML-Anfragen DB-Anfragen, Updates, Indizierung XML – Dokumentformat Dr. Roman Schneider Datenbanken (DBMS) – Systeme zur Speicherung großer Datenmengen Modul Wissens- und Contentmanagement 5 XML-Verarbeitung DBMS als Speicherungssystem Gegenüber Standard-Dateisystemen haben DBMS-basierte Lösungen „Datenbankvorteile“, z.B.: – Datensicherheit, Konsistenzprüfung, Indizierung, Optimierung etc. – (aber: neuere Dateisysteme evtl. spezialisiert, z.B. für parallele Verarbeitung wie Map-Reduce) Wahl des Systems hängt von konkreten Erfordernissen, Verfügbarkeit, Vorkenntnissen ab Beachten: langfristige Produktpflege, Änderungs-/Updatezyklus („Investitionssicherheit“) => Im Folgenden: Darstellung der XML-Verarbeitung in Oracle (ähnliche Funktionalitäten existieren z.B. in IBM DB2, MS SQL-Server, ...) Dr. Roman Schneider Modul Wissens- und Contentmanagement 6 XML-Verarbeitung XML-Unterstützung in Oracle Seit Oracle 9iR2 Vereinigung der Daten- (Data) und Inhaltsverarbeitung (Content Processing) ConText => Text, XMLDB Grundlegende Funktionen: – Ausgabe relationaler Datenbankinhalten als XMLInstanzen (Baumstruktur!) – Verschiedene (native) XMLSpeicherungsverfahren (werden noch vorgestellt) – Validierung – Weiterverarbeitung (=> XDK) Dr. Roman Schneider Modul Wissens- und Contentmanagement 7 XML-Verarbeitung XML-DB und XML Developer's Kit (XDK) 1/2 XML-DB: Repository für XML-Schemata, Tabellen, Indizes, … XML Developer's Kit (XDK): Techn. Grundbausteine zum - Lesen - Manipulieren - Transformieren - Anzeigen - Generieren von XML-Dokumenten Dr. Roman Schneider Modul Wissens- und Contentmanagement 8 XML-Verarbeitung XML-DB und XML Developer's Kit (XDK) 2/2 XML Parser: – DOM (einschließlich Version 3.0) – SAX XSLT Prozessor (mit XSLT 2.0 Java-Unterstützung) XML Schema Prozessor: erlaubt Validierung gegen ein XML-Schema XML Class Generator: generiert Java-Klassen aus DTDs oder XML-Schemata XML SQL Utility: – generiert XML-Dokumente, DTDs und Schemas aus SQL-Anfragen – realisiert das “Insert” von XML-Instanzen in das RDBMS direkter Zugriff auf XML-Dokumentstruktur durch Datentyp => XMLType Dr. Roman Schneider Modul Wissens- und Contentmanagement 9 XML-Verarbeitung Speicherung von XML in Oracle: XMLTYPE XMLType ist ein spezieller Datentyp für XML-Instanzen in der Datenbank, kann intern physikalisch auf drei verschiedene Arten realisiert werden: Unstrukturierte Speicherung als CLOB Strukturierte Speicherung in objektrelationalen Tabellen Speicherung als binary Wahl der Speicherungsoption ist für den Nutzer transparent, d.h. beeinflusst nicht die Syntax der Weiterverarbeitung. Nativ? Dr. Roman Schneider Modul Wissens- und Contentmanagement 10 XML-Verarbeitung XMLType als CLOB Bei der unstrukturierten Speicherung werden die XML-Daten intern als Text in einem CLOB abgelegt (ideal für eher dokumentenzentriertes Arbeiten). Dazu wird zu jeder XMLType-Tabellenspalte intern eine CLOB-Spalte angelegt, die für den Benutzer unsichtbar ist. Die XMLType-Spalte enthält eine Referenz auf diese CLOB-Spalte. Vorteil: XML-Instanz wird nicht manipuliert, d.h. zeichengenau mit Whitespace, Zeilenumbrüchen etc. vorgehalten (instance fidelity) Vorteil: Performantes Lesen / Update kompletter Instanzen. Vorteil: Unterschiedliche XML-Strukturen in einem Datenfeld möglich Nachteil: Suboptimale Performanz beim Zugriff auf einzelne XML-Fragmente. CREATE TABLE tb_bib ( co_id NUMBER, co_datum DATE, co_literatur XMLTYPE) XMLTYPE COLUMN co_literatur STORE AS CLOB; Dr. Roman Schneider Modul Wissens- und Contentmanagement 11 XML-Verarbeitung XMLType objekt-relational Passendes XML-Schema muss verfügbar sein (=> einheitliche Struktur). Aufgrund der Informationen aus dem XML-Schema werden entsprechende objektrelationale Tabellen / Views erzeugt. Knotenstruktur der Instanz sowie die Beziehungen zwischen den Knoten bleiben erhalten (DOM fidelity). Vorteil: Abspeichern und Zugriff ist wesentlich performanter, da nicht das ganze XML-Dokument geschrieben/gelesen werden muss (piecewise update). Vorteil: Indizierung der OR-Tabellen sorgt für bessere Performanz. Vorteil: Benötigt weniger Speicherplatz, weil Element-/Attribut-Namen nicht jedesmal gespeichert werden und Whitespace wegfällt. Nachteil: XML-Instanz bleibt nicht intakt. CREATE TABLE tb_bib ( co_id NUMBER, co_datum DATE, co_literatur XMLTYPE) XMLTYPE COLUMN co_literatur STORE AS OBJECT RELATIONAL XMLSCHEMA "http://localhost/myXMLSchema.xsd" ELEMENT "literatur"; Dr. Roman Schneider Modul Wissens- und Contentmanagement 12 XML-Verarbeitung XMLType binary Speziell entworfenes Binärformat für XML mit platzsparender Speicherung; XMLDB Developers Guide: “Binary XML is compact, post-parse, XML Schema-aware XML.” Erlaubt die flexible Speicherung unterschiedlich strukturierter XML-Instanzen in gemeinsamer XMLTYPE-Spalte (wie CLOB, aber performanter). Kann mit oder ohne Angabe eines Schemas erfolgen. CREATE TABLE tb_bib ( co_id NUMBER, co_datum DATE, co_literatur XMLTYPE) XMLTYPE COLUMN co_literatur STORE AS BINARY XML XMLSCHEMA "http://localhost/myXMLSchema.xsd" ALLOW ANYSCHEMA ALLOW NONSCHEMA; Dr. Roman Schneider Modul Wissens- und Contentmanagement 13 XML-Verarbeitung Schema-Registrierung in der Datenbank Schema für XMLTypes muss der Datenbank bekannt sein. Bei Anlegung Steuerung möglich, ob Objekttypen und Tabellen (für objektrelationale Speicherung) umgehend angelegt werden sollen. Verwendung des Schemas kann (bei binary-Speicherung) aus Effizienzgründen temporär deaktiviert werden. Prüfung bei XML-Speicherung: BEGIN DBMS_XMLSCHEMA.registerSchema( SCHEMAURL => 'http://localhost/myXMLSchema.xsd', LOCAL => FALSE, GENTYPES => TRUE, GENTABLES => TRUE, FORCE => FALSE, OPTIONS => DBMS_XMLSCHEMA.REGISTER_BINARYXML, OWNER => USER); END; Dr. Roman Schneider Modul Wissens- und Contentmanagement 14 XML-Verarbeitung Objekt-relationale vs. Binary XML-Speicherung Dr. Roman Schneider Modul Wissens- und Contentmanagement 15 XML-Verarbeitung Einfügen von XML-Inhalten per SQL Um Daten in eine XMLType-Spalte einzufügen, muss der Konstruktor XMLType() verwendet werden. XMLTYPE() wandelt Textstrings in XMLTYPE um. Dabei können nur wohlgeformte (wenn Schema angegeben: nur gültige) XML-Daten eingefügt werden! INSERT INTO tb_bib (co_id, co_datum, co_literatur) VALUES (1, SYSDATE, XMLTYPE(' <literatur typ="monographie"> <autor><nachname>Schneider</nachname> <vorname>Roman</vorname></autor> <titel>Benutzeradaptive Systeme im Internet</titel> <jahr>2004</jahr> <ort>Mannheim</ort> </literatur> ')); Dr. Roman Schneider Modul Wissens- und Contentmanagement 16 XML-Verarbeitung Einfügen von XML-Inhalten per SQL-Loader Alternativ lassen sich XML-Dokumente direkt aus dem Dateisystem laden, für größere Bestände ist dann der SQL Loader das Werkzeug der Wahl. control=<steuerdatei> Name der Steuerdatei log=<protokolldatei> Name der Protokolldatei bad=<bad file> Name des bad file data=<datendatei> Name der Datendatei discard=<discard file> Name des discard file discardmax=n nach n Datensätzen im discard file wird abgebrochen skip=n überlese die ersten n Datensätze (hilfreich zum Wiederaufsetzen) load=n lade maximal n Datensätze errors=n breche nach n fehlerhaften Datensätzen ab direct=<modus> Verwende den direkten Pfad (Modus=true) oder nicht (Modus=false) Dr. Roman Schneider Modul Wissens- und Contentmanagement 17 XML-Verarbeitung Einfügen von XML-Inhalten per PL/SQL Kleinere XML-Bestände sind auch per PL/SQL (Procedural Language /Structured Query Language) ladbar: – Zunächst erzeugt man ein sogenanntes SQL Directory, d.h. den Zugang zu einem auf dem Server existierenden Verzeichnis/Ordner. – Anschließend lassen sich dort abgelegte Dateien öffnen und die XMLInhalte in die Beispieltabelle übernehmen: CREATE DIRECTORY "xmldir" AS 'c:\xml'; DECLARE datei BFILE := BFILENAME('xmldir', 'beispiel.xml'); inhalt CLOB := ''; BEGIN DBMS_LOB.fileOpen (datei, DBMS_LOB.file_readonly); DBMS_LOB.CREATETEMPORARY(inhalt, TRUE, 2); DBMS_LOB.loadFromFile (inhalt, datei, DBMS_LOB.getLength(datei),1,1); DBMS_LOB.fileClose (datei); INSERT INTO tb_bib VALUES (1, SYSDATE, XMLTYPE(inhalt)); COMMIT; END; Dr. Roman Schneider Modul Wissens- und Contentmanagement 18 XML-Verarbeitung Einfügen von XML-Inhalten per Web-Interface Oracle XE (die freie Express Edition) bringt für den gelegentlichen Upload ein einfaches Web-Frontend mit. Automatisierte Weiterverarbeitung bspw. durch Tabellen-Trigger und PL/SQL. Dr. Roman Schneider Modul Wissens- und Contentmanagement 19 XML-Verarbeitung Einfügen von XML-Inhalten aus Datenbanktabellen 1/5 Etwas anspruchsvoller gestaltet sich die Aufgabe, XML-Instanzen aus bereits bestehenden (relationalen) Datenbanktabellen zu generieren. => SQL/XML (SQLX)-Funktionen produzieren wohlgeformte XMLFragmente für den Datentyp XMLTYPE. Diese Funktionen können in den select-from-where-Block integriert werden (Beispiel folgt). SQLX relationale Datenbank Dr. Roman Schneider XML-“Sicht“ Modul Wissens- und Contentmanagement XMLDokument 20 XML-Verarbeitung Einfügen von XML-Inhalten aus Datenbanktabellen 2/5 Funktion xmlelement() – erzeugt ein XML-Element und erwartet als Parameter einen Elementnamen sowie optional mehrere Attributinhalte Funktion xmlforest() – Konstruktion einer Folge („Wald“) aus XML-Dokumenten Funktion xmlagg() – Aggregierungsfunktion für die Integration mehrerer Ergebniszeilen Funktion xmlconcat() – fügt mehrere XML-Fragmente zusammen Weitere Funktionen: – – – – xmlattributes() xmlroot() xmlcomment() xmlpi() Dr. Roman Schneider Modul Wissens- und Contentmanagement 21 XML-Verarbeitung Einfügen von XML-Inhalten aus Datenbanktabellen 3/5 Anwendungsfall: Bibliografie mit zwei Ausgangstabellen • In tb_titel liegen Publikationstyp, -titel, -jahr und -ort in entsprechend benannten Spalten; • Tabelle tb_autor speichert die Autorenangaben. Beide Tabellen sind mittels eindeutiger IDs (Spalte co_id) miteinander verknüpft. => SQL/XML-Funktionen sammeln, ordnen und formatieren sämtliche für eine XML-Instanz erforderlichen Inhalte. Dr. Roman Schneider Modul Wissens- und Contentmanagement 22 XML-Verarbeitung Einfügen von XML-Inhalten aus Datenbanktabellen 4/5 SELECT t1.co_id, XMLELEMENT ("literatur", XMLATTRIBUTES (t1.co_typ as "typ"), XMLFOREST(t1.co_titel as "titel", t1.co_jahr as "jahr", t1.co_ort as "ort"), XMLELEMENT ("autor", XMLAGG( XMLCONCAT( XMLELEMENT("nachname",t2.co_nachname), XMLELEMENT("vorname",t2.co_vorname))))) as "literatur" FROM tb_titel t1, tb_autor t2 WHERE t1.co_id=t2.co_id GROUP BY t1.co_typ,t1.co_titel,t1.co_jahr,t1.co_ort; Die Aggregierungsfunktion XMLAGG wird genutzt, um Veröffentlichungen mit mehreren beteiligten Autoren zu handhaben, d.h. um 1:n-Relationen zwischen Publikationstitel und Verfasser im XML-Baum durch aneinander gereihte AutorElemente (sibblings) wiederzugeben. Dr. Roman Schneider Modul Wissens- und Contentmanagement 23 XML-Verarbeitung Einfügen von XML-Inhalten aus Datenbanktabellen 5/5 CO_ID literatur ----------------------------1 <literatur typ=“monographie“><titel>Benutzeradaptive Systeme im Internet</titel><jahr>2004</jahr> <autor><nachname>Schneider</nachname><vorname>Roman</vorname></auto r></literatur> 2 <literatur typ=“nachschlagewerk“><titel>Bibliographie zur deutschen Grammatik</titel><jahr>2003</jahr><ort>Mannheim</ort> <autor><nachname>Frosch</nachname><vorname>Helmut</vorname></autor><a utor><nachname>Schneider</nachname><vorname>Roman</vorname></autor><a utor><nachname>Strecker</nachname><vorname>Bruno</vorname></autor><au tor><nachname>Eisenberg</nachname><vorname>Peter</vorname></autor></l iteratur> Das Ergebnis dieser Abfrage besteht aus jeweils einer eindeutige ID kombiniert mit einem Literatureintrag als wohlgeformter XML-Instanz. => Optionen zur Validierung? Dr. Roman Schneider Modul Wissens- und Contentmanagement 24 XML-Verarbeitung Validierung von XML-Instanzen (via XML-Schema) Ähnlich wie für die Erzeugung stellt das DBMS auch für den Strukturcheck von XML-Instanzen verschiedene Wege bereit. Zumeist kommen dabei XML-Schemata zum Einsatz (wg. Datentypen). In solchen Fällen kann der Anwender die Überprüfung recht einfach automatisieren, indem er beim Anlegen einer XMLTYPE-Spalte ein verbindliches Schema spezifiziert (s.o.). Die Funktion isSchemaValid() startet darüber hinaus explizit einen Validierungslauf (Rückgabewert „1“ wenn valide): SELECT x.co_literatur.isSchemaValid('http://localhost/myXMLSchema.xsd', 'literatur') FROM tb_bib x; Auf Kommandozeilenebene existiert mit „oraxml“ ein Frontend für Oracles XML-Parser, das Dokumente gegen ein im Wurzelelement referenziertes Schema validiert. Dr. Roman Schneider Modul Wissens- und Contentmanagement 25 XML-Verarbeitung Validierung von XML-Instanzen (via DTD) 1/2 Die Erfahrung zeigt, dass sich nicht alle Anwender auf Schemata verlegen wollen oder können (Übersichtlichkeit, ...). Wer für die Beschreibung seiner XML-Strukturen ohne bestimmte Features (Datentypen, XML-Syntax etc.) auskommt, wird in vielen Fällen weiterhin gerne mit “einfachen” Document Type Definitions (DTDs) arbeiten wollen. Ob eine DTD im Dateisystem oder in der DB liegt, ist für deren Nutzung zur XML-Validierung in der DB zweitrangig. Aus DBA-Sicht wäre sicherlich die zweite Variante vorzuziehen, bei der sowohl XMLInstanz als auch Strukturbeschreibung von den Vorteilen der DBMS-gestützen Speicherung profitieren – „all data in one place“. Idealerweise sollte jede XML-Instanz unmittelbar vor dem Anlegen eines neuen Datensatzes hinsichtlich ihrer Gültigkeit überprüft werden. Hierfür bietet sich ein => BEFORE INSERT-Trigger an Dr. Roman Schneider Modul Wissens- und Contentmanagement 26 XML-Verarbeitung Validierung von XML-Instanzen (via DTD) 2/2 Der Trigger macht dem Parser die DTD bekannt und nimmt die Validierung des Dokuments vor: CREATE TRIGGER literaturvalidierung BEFORE INSERT ON tb_bib FOR EACH ROW DECLARE parser xmlparser.parser; dtd_quelle CLOB; dtd_dokument xmldom.DOMDocumentType; BEGIN SELECT co_inhalt INTO dtd_quelle FROM tb_dtd WHERE co_name='literatur.dtd'; parser := xmlparser.newParser; xmlparser.setValidationMode(parser, false); xmlparser.parseDTDClob(parser, dtd-quelle , 'literatur'); dtd_dokument := xmlparser.getDoctype(parser); xmlparser.setValidationMode(parser, true); xmlparser.setDoctype(parser, dtd_dokument); xmlparser.parseClob(parser, :NEW.co_literatur.getClobVal()); xmlparser.freeParser(parser); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Validierungs-Fehler!'); END; Dr. Roman Schneider Modul Wissens- und Contentmanagement 27 XML-Verarbeitung Recherche mit SQL/XML 1/3 Ist ein XML-Dokument artgerecht gespeichert, stellt sich die Frage nach effizienter Recherche. Neben einfachen Abfragen zur Ausgabe ganzer Instanzen à la SELECT t.co_literatur.getClobVal() AS gesamtdokument FROM tb_bib t interessiert meist die Extraktion, Zählung etc. einzelner Elemente. Hierfür empfehlen sich XPath-basierte SQLX-Funktionen, die den präzisen Zugriff auf XML-Fragmente erlauben: existsNode() stellt fest, ob bestimmte Elemente existieren und liefert 0 oder 1 zurück extract() extrahiert XML-Fragmente als XMLTYPE extractValue() gibt den reinen Zeicheninhalt eines Knotens aus Üblicherweise konstruiert eine SQLX-Funktion für jede XML-Instanz ein DOM, unabhängig davon, ob die Instanz den gesuchten Wert enthält. Dr. Roman Schneider Modul Wissens- und Contentmanagement 28 XML-Verarbeitung Recherche mit SQL/XML 2/3 ExtractValue Liefert anhand eines XPath-Ausdrucks den Wert eines Knotens. Extract Extrahiert einen oder mehrere Äste eines XMLType-Objekts. ExistsNode Prüft, ob in einem XMLType-Objekt ein entsprechender Knoten vorliegt. GetRootElement Gibt das Root-Element der XMLType-Instanz zurück. GetSchemaURL Gibt die URL der registrierten XML-Schema-Definition zurück. Wurde kein XML-Schema registriert, so wird NULL zurück gegeben. XMLTransform Transformiert die übergebene XMLType-Instanz unter Einsatz einer XSLT-Datei (als XMLType) in HTML, Text etc. UpdateXML Ändert Fragmente/Werte in einem XMLType-Objekt. XMLSequence Ermöglicht die Verarbeitung mehrerer Knoten eines XMLType-Objekts. Dr. Roman Schneider Modul Wissens- und Contentmanagement 29 XML-Verarbeitung Recherche mit SQL/XML 3/3 Damit ein ein SQL-Statement wie SELECT co_id FROM tb_bib WHERE extractValue (co_literatur,'/literatur@typ') = 'monographie'; möglichst schnell zum Ziel führt, empfiehlt sich bei häufig wiederkehrenden XPath-Ausdrücken die Verwendung von Indizes. Zum Einsatz kommen hier funktionale Indizes ("functional indexes"), die analog zu den im RDBMS üblichen B-Tree-Indizes organisiert sind und von denen mehrere gleichzeitig für dieselbe Instanz existieren dürfen. CREATE INDEX idx_bib ON tb_bib (extractValue(co_literatur, '/literatur@typ')); Alternative: Spezieller Indextyp „XMLIndex“ (indiziert grundsätzlich die komplette XML-Instanz, aber Ausnahmen möglich). Der kostenorientierter Optimierer des DBMS entscheidet von Fall zu Fall, welcher Index beim Auswerten einer WHERE-Klausel zum Einsatz kommt. Dr. Roman Schneider Modul Wissens- und Contentmanagement 30 XML-Verarbeitung Update mit SQL/XML Für XML-Dokumente gilt wie für andere Formate: Nur in seltenen Fällen bleiben Datenbankinhalte statisch. Inhaltliche Korrekturen oder strukturelle Anpassungen erfordern Funktionen zum Ersetzen einzelner Fragmente: UpdateXML() InsertChildXML() InsertXMLBefore() AppendChildXML() DeleteXML() Folgender Befehl modifiziert alle jahr-Elemente, indem er den Wert 1 addiert: UPDATE tb_bib SET co_literatur= updateXML (co_literatur,'/literatur/jahr', '<jahr>'|| to_char(extractValue(co_literatur,'/literatur/jahr')+1) ||'</jahr>'); Dr. Roman Schneider Modul Wissens- und Contentmanagement 31 XML-Verarbeitung Transformation mit SQL/XML 1/2 Oft reichen einzelne Änderungen an XML-Elementen nicht aus. Der Datentransfer zwischen Softwaresystemen etwa erfordert nicht selten die komplette Umgestaltung der XML-Struktur, also die Übersetzung aus einer Markup-Sprache in eine andere. Auch die Layout-Aufbereitung erfordert zusätzliche Arbeitsschritte. In diese Kategorie fällt insbesondere die Transformation von XML nach HTML mit XSL (XML Stylesheet Language) bzw. XSLT. Zur Erinnerung: XML beschreibt eine Datenstruktur Aber: XML enthält keine Informationen über die Darstellung der Daten Dr. Roman Schneider Modul Wissens- und Contentmanagement 32 XML-Verarbeitung Transformation mit SQL/XML 2/2 Das DBMS enthält einen integrierten XSLT-Prozessor, den die Funktion XMLTransform() startet. Er arbeitet in einer virtuellen XSLT-Maschine. Der XSLT-Prozessor kompiliert Stylesheets als Bytecode, den er in einem internen Cache speichert. Wiederholte Transformationen unter Verwendung desselben Stylesheets lassen sich auf diese Weise beschleunigen. Idealerweise liegt das XSLT-Stylesheet als natives XML in einer DB-Tabelle. Beispiel: Tabelle tb_xsl mit den beiden Spalten co_name (zur eindeutigen Benennung) und co_inhalt (Stylesheet als XMLTYPE). XMLTransform() erhält als Parameter die Spaltennamen von XML-Instanz und Stylesheet und erzeugt "on the fly" die gewünschte Ausgabe: SELECT XMLTransform(t1.co_literatur, t2.co_inhalt) FROM tb_bib t1, tb_xsl t2 WHERE t1.co_id=1 AND t2.co_name='literatur.xsl'; Dr. Roman Schneider Modul Wissens- und Contentmanagement 33 XML-Verarbeitung Anwendungsfall: Datenbank Gesprochenes Deutsch (DGD) 1/5 Archiviert die bei Spracherhebungen erstellten Korpora von gesprochenem Deutsch Text-Ton-Alignment (Synchronisierung von Transkripten und Audio) Korpusübergreifender XML-Metadatenstandard Stellt komplexe Inhalte für die weitere wissenschaftliche Auswertung zur Verfügung Dr. Roman Schneider Modul Wissens- und Contentmanagement 34 XML-Verarbeitung Anwendungsfall: Datenbank Gesprochenes Deutsch (DGD) 2/5 Dr. Roman Schneider Modul Wissens- und Contentmanagement 35 XML-Verarbeitung Anwendungsfall: Datenbank Gesprochenes Deutsch (DGD) 3/5 Baum-Modell der Korpusdokumentation als Basis für Schemagenerierung Dr. Roman Schneider Modul Wissens- und Contentmanagement 36 XML-Verarbeitung Anwendungsfall: Datenbank Gesprochenes Deutsch (DGD) 4/5 Metadaten-Schema Dr. Roman Schneider Modul Wissens- und Contentmanagement 37 XML-Verarbeitung Anwendungsfall: Datenbank Gesprochenes Deutsch (DGD) 5/5 Dr. Roman Schneider Modul Wissens- und Contentmanagement 38 XML-Verarbeitung XML-Retrieval mit Oracle Text 1/14 Oracle Text ist eine in den Datenbankkern integrierte XML-fähige Volltextsuche (XML-)Dokumente lassen sich filtern, recherchieren und inhaltlich auswerten Funktionen für Text Retrieval, Text Mining und Knowledge Management Typische Anwendungsfälle: Verlags- bzw. Medienunternehmen sowie in Branchen mit umfangreichem elektronischen Dokumentationsbedarf kann mit (beinahe) allen gängigen Dokumentformaten umgehen: Filtertechnik deckt mehr als 150 Dateitypen ab, incl. ASCII, PDF, Word, HTML oder XML Unicode-Unterstützung Der prominenteste Indextyp hört auf den Namen CONTEXT Indextyp CTXCAT für Abfragen, die kürzere (XML-)Dokumente sowie relationale Daten betreffen Indextyp CTXRULE für die Klassifikation von (XML-)Dokumenten Dr. Roman Schneider Modul Wissens- und Contentmanagement 39 XML-Verarbeitung XML-Retrieval mit Oracle Text 2/14 Beispiel: Tabelle TB_DOKUMENTE mit den Spalten CO_ID (eindeutige IDs) CO_INHALT (VARCHAR2, CLOB/BLOB oder XMLTYPE - erlaubt ist, was sich für die Aufnahme von Fließtext eignet) Für die Suche verwendet man nicht die üblichen SQL-Operatoren wie LIKE oder =, sondern den Suchoperator CONTAINS SELECT CO_ID FROM TB_DOKUMENTE WHERE CONTAINS (CO_INHALT, 'gehen')>0; findet Dokumente, die "gehen" oder Zusammensetzungen wie "Zu-Fuß-Gehen" enthalten, richtigerweise aber nicht "Wohlergehen" oder "umgehend“ (=> anpassbarer LEXER) Dr. Roman Schneider Modul Wissens- und Contentmanagement 40 XML-Verarbeitung XML-Retrieval mit Oracle Text 3/14 • Eine Erweiterung des Suchausdrucks auf $gehen schließt darüber hinaus alle Beugungen, Ableitungen und Komposita ein. SELECT CO_ID FROM TB_DOKUMENTE WHERECONTAINS(CO_INHALT,‘$gehen')>0; findet "geht", "ging", "gegangen" et cetera • • • Ist die Schreibweise zweifelhaft, findet ein dem Wort vorangestelltes ? sämtliche ähnlichen Schreibungen (fuzzy search), Beziehungsweise ein vorangestelltes ! auch ähnlich klingende Wörter auf Basis des phonetischen SOUNDEX-Algorithmus. Der NEAR-Operator legt einen Höchstabstand zwischen Fundstellen fest: SELECT CO_ID FROM TB_DOKUMENTE WHERE CONTAINS(CO_INHALT,'NEAR((gehen, Büro),3)')>0; findet Dokumente, in denen "gehen" und "Büro" durch höchstens drei Wörter getrennt sind Dr. Roman Schneider Modul Wissens- und Contentmanagement 41 XML-Verarbeitung XML-Retrieval mit Oracle Text 4/14 Query Relaxation: Mehr oder weniger exaktes Finden erlaubt das sukzessive Abarbeiten mehrerer Suchanfragen gemäß einer vom Anwender definierten Reihenfolge (XML-Syntax!) zunächst kommt typischerweise die restriktivste Version zur Ausführung findet sie zu wenige Treffer, folgen Schritt für Schritt die weiteren Anfragen Folgendes Beispiel erweitert die Suche nach "gehen" zunächst um eine Wortstamm- und anschließend um eine Fuzzy-Suche, bis 20 passende Dokumente gefunden sind: SELECT CO_ID FROM TB_CLOB_1000 WHERE CONTAINS (CO_INHALT, '<query> <textquery lang="GERMAN" grammar="CONTEXT"> <progression> <seq>gehen</seq> <seq>$gehen</seq> <seq>?gehen</seq> </progression> </textquery> <score datatype="INTEGER" algorithm="COUNT"/> </query>',1)>0 AND ROWNUM<20; Dr. Roman Schneider Modul Wissens- und Contentmanagement 42 XML-Verarbeitung XML-Retrieval mit Oracle Text 5/14 Anlegen eines rudimentären CONTEXT Index: CREATE INDEX IDX_DOKUMENTE ON TB_DOKUMENTE(CO_INHALT) INDEXTYPE IS CTXSYS.CONTEXT; Indexierung findet in mehreren aufeinander aufbauenden Stufen statt ("IndexierungsPipeline"), => jeweils Feinjustierung möglich. Dr. Roman Schneider Modul Wissens- und Contentmanagement 43 XML-Verarbeitung XML-Retrieval mit Oracle Text 6/14 • „Preferences" und "Section Groups" parametrisieren jede Stufe z.B. lässt sich für den Datastore festlegen, wo sich der zu indexierende Text befindet: in der Regel eine Tabellenspalte, erlaubt sind aber auch lokale Dateien oder URLs • Die folgende Station, der Filter, übernimmt den Datenstream und wandelt die Inhalte sofern erforderlich in Text, HTML oder XML um • Dr. Roman Schneider Modul Wissens- und Contentmanagement 44 XML-Verarbeitung XML-Retrieval mit Oracle Text 7/14 Dritte Station ist der Sectioner, teilt die vom Filter gelieferten Texte in Bereiche auf. Mehrere Section Groups sind vordefiniert: • NEWS_SECTION_GROUP für Newsgroup-Inhalte • XML_SECTION_GROUP für Attributwerte und Elementinhalte von XML-Instanzen • PATH_SECTION_GROUP für XML, wenn XPath-Abfragen mit INPATH- und HASPATH geplant • AUTO_SECTION_GROUP mit der Option, ausgewählte Bereichsinformationen (stop sections) explizit aus dem Indexierungsprozess auszuschließen. • HTML_SECTION_GROUP für Webinhalte, wandelt HTML-Elemente in Bereichsgrenzen Dr. Roman Schneider Modul Wissens- und Contentmanagement 45 XML-Verarbeitung XML-Retrieval mit Oracle Text 8/14 PATH_SECTION_GROUP für XPath-Abfragen: SELECT CO_ID FROM TB_DOKUMENTE WHERE CONTAINS(CO_INHALT, 'hasPath(/dokument/absatz[@typ=“bsptyp"])')>0; findet alle Dokumente, die direkt unterhalb eines dokument-Elements ein absatzElement enthalten, dessen Attribut typ den Wert bsptyp hat SELECT CO_ID FROM TB_DOKUMENTE WHERE CONTAINS(CO_INHALT, '$gehen inPath (/dokument/absatz)') > 0; liefert alle Dokumente, in denen eine beliebig flektierte Form von "gehen" im Text des spezifizierten XML-Knotens vorkommt Auf diese Weise lässt sich die Mächtigkeit von XPath mit den linguistischen Features der Volltextrecherche kombinieren. Dr. Roman Schneider Modul Wissens- und Contentmanagement 46 XML-Verarbeitung XML-Retrieval mit Oracle Text 9/14 Erstellung einer selbstdefinierten Section Group, die eine kombinierte Recherche in HTMLÜberschriften (H1 bis H4) erlaub: BEGIN CTX_DDL.CREATE_SECTION_GROUP('MY_GROUP', 'HTML_SECTION_GROUP'); CTX_DDL.ADD_ZONE_SECTION('MY_GROUP', 'UEBERSCHRIFT', 'H1'); CTX_DDL.ADD_ZONE_SECTION('MY_GROUP', 'UEBERSCHRIFT', 'H2'); CTX_DDL.ADD_ZONE_SECTION('MY_GROUP', 'UEBERSCHRIFT', 'H3'); CTX_DDL.ADD_ZONE_SECTION('MY_GROUP', 'UEBERSCHRIFT', 'H4'); END; SELECT * FROM TB_DOKUMENTE WHERE CONTAINS(CO_INHALT, 'gehen WITHIN UEBERSCHRIFT')>0; • Kommentare, Scripts oder STYLE-Abschnitte lassen sich im Sectioner automatisch entfernen. Dr. Roman Schneider Modul Wissens- und Contentmanagement 47 XML-Verarbeitung XML-Retrieval mit Oracle Text 10/14 • Die Bereichsinhalte reicht der Sectioner anschließend als Plain Text weiter • Der Lexer extrahiert nun sämtliche Wörter (tokens) Wichtig: Unterstützung von Sprachen, in denen Leer- und Satzzeichen Wörter trennen, aber auch andere (zum Beispiel asiatische) Sprachfamilien • Die Datenbank-Engine erstellt abschließend - gegebenenfalls unter Zuhilfenahme der vom Sectioner ermittelten Bereichsgrenzen - einen invertierten Index • • Diese Wortliste ordnet jedem Token eine Liste der zugehörigen Dokumente zu Dr. Roman Schneider Modul Wissens- und Contentmanagement 48 XML-Verarbeitung XML-Retrieval mit Oracle Text 11/14 Diskriminationskraft der Terme BEGIN CTX_DDL.CREATE_STOPLIST('MY_STOPLIST'); CTX_DDL.ADD_STOPWORD('MY_STOPLIST','der'); CTX_DDL.ADD_STOPWORD('MY_STOPLIST','die'); CTX_DDL.ADD_STOPWORD('MY_STOPLIST','das'); END; / Dr. Roman Schneider Modul Wissens- und Contentmanagement Stoppwortliste zu seltene Terme - Ausschließen von Stoppwörtern (z.B. Funktionswörter wie Artikel, Hilfsverben, Pronomen, ...) zu häufige Terme Anpassung eines CONTEXT-Index (STOPLIST): abnehmende Worthäufigkeit 49 XML-Verarbeitung XML-Retrieval mit Oracle Text 12/14 Anpassung eines CONTEXT-Index (LEXER): - ALTERNATE_SPELLING: Berücksichtigung der im Deutschen geläufigen Umschreibung von Umlauten und ß als "ae", "ue, "oe" und "ss" - NEW_GERMAN_SPELLING: durch die Rechtschreibreform erlaubte Schreibvarianten - COMPOSITE: legt fest, ob Wortzusammensetzungen wie "Hauptbahnhofsgebäude" zerlegt oder als Ganzes indexiert werden - MIXED_CASE: regelt den Umgang mit Groß- und Kleinschreibung - Weitere Optionen: z.B. SKIPJOINS, PRINTJOINS, WHITESPACE oder BASE_LETTER BEGIN CTX_DDL.CREATE_PREFERENCE('MY_LEXER','BASIC_LEXER'); CTX_DDL.SET_ATTRIBUTE('MY_LEXER','ALTERNATE_SPELLING', 'GERMAN'); CTX_DDL.SET_ATTRIBUTE('MY_LEXER','NEW_GERMAN_SPELLING', 'YES'); CTX_DDL.SET_ATTRIBUTE('MY_LEXER','COMPOSITE', 'GERMAN'); CTX_DDL.SET_ATTRIBUTE('MY_LEXER','MIXED_CASE', 'NO'); END; / Dr. Roman Schneider Modul Wissens- und Contentmanagement 50 XML-Verarbeitung XML-Retrieval mit Oracle Text 13/14 Anpassung eines CONTEXT-Index (WORDLIST): - STEMMER: regelt die Expansionsregeln für die Wortstamm-/Flexionssuche, orientiert sich an den Eigenschaften der Dokumentensprache - FUZZY_MATCH: initiiert fehlertolerante Suche, unterstützt auch OCR-Dokumente - SUBSTRING-/PREFIX: beeinflussen Query-Performance für Anfragen mit Wildcards an einem Ende des Suchbegriffs - WILDCARD_MAXTERMS: legt die Obergrenze für Wildcard- Expansionen fest - Einfluss auf Platzbedarf und Erstellungs- beziehungsweise Aktualisierungszeit! BEGIN CTX_DDL.CREATE_PREFERENCE('MY_WORDLIST', 'BASIC_WORDLIST'); CTX_DDL.SET_ATTRIBUTE('MY_WORDLIST','STEMMER', 'GERMAN'); CTX_DDL.SET_ATTRIBUTE('MY_WORDLIST','FUZZY_MATCH', 'GERMAN'); CTX_DDL.SET_ATTRIBUTE('MY_WORDLIST','SUBSTRING_INDEX','TRUE'); CTX_DDL.SET_ATTRIBUTE('MY_WORDLIST','PREFIX_INDEX','TRUE'); CTX_DDL.SET_ATTRIBUTE('MY_WORDLIST','PREFIX_MIN_LENGTH', '2'); CTX_DDL.SET_ATTRIBUTE('MY_WORDLIST','PREFIX_MAX_LENGTH', '10'); CTX_DDL.SET_ATTRIBUTE('MY_WORDLIST','WILDCARD_MAXTERMS','7000'); END; / Dr. Roman Schneider Modul Wissens- und Contentmanagement 51 XML-Verarbeitung XML-Retrieval mit Oracle Text 14/14 Erstellung eines CONTEXT-Index mit Preferences: CREATE INDEX IDX_DOKUMENTE ON TB_DOKUMENTE (CO_INHALT) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS(' DATASTORE CTXSYS.DEFAULT_DATASTORE FILTER CTXSYS.NULL_FILTER SECTION GROUP MY_GROUP STOPLIST MY_STOPLIST LEXER MY_LEXER WORDLIST MY_WORDLIST'); Dr. Roman Schneider Modul Wissens- und Contentmanagement 52 XML-Verarbeitung Semantische Suchfunktionalitäten für XML-Instanzen Anbindung von Thesauri für die semantische Suche möglich. ctx_thes.create_relation ('MY_THES', 'Stürmer', 'BT', 'Spieler'); select text from TB_DOKUMENTE where contains(CO_INHALT, 'NT(Spieler,10) inPath (/dokument/absatz)') > 0; Der Stürmer lieferte eine Glanzleistung ab. Dr. Roman Schneider Modul Wissens- und Contentmanagement 53