XML in Datenbanken XQuery und eXist 10a G. Görz, J. Schneeberger Lehrstuhl Informatik 8 (KI) [email protected] [email protected] 1 Literatur • Anders Møller & Michael I. Schwartzbach, 2006 Addison-Wesley 2 XQuery 3 Datenbanken und Relationen • Unter einer Datenbank (DB) verstehen Informatiker (fast immer) eine „relationale“ Datenbank. • Eine relationale Datenbank besteht aus – Relationen (= Tabellen) – und Einträgen (Records, Tupel) in diesen Relationen • Jeder Eintrag einer Tabelle wird durch einen eindeutigen Schlüssel markiert. 4 Tabelle/Relation vs. Baum 5 Bäume sind keine Relationen • Bäume, die Relationen entsprechen, – haben die feste Tiefe 2 – haben eine beliebige Anzahl von Kinderknoten, deren Reihenfolge nicht relevant ist (kann beliebig umgeordnet werden) – alle Knoten der untersten Ebene haben die selbe Anzahl und Struktur von Kindern (Spalten können beliebig umgeordnet werden) • Die meisten Bäume entsprechen nicht dieser Spezifikation. – Äste in Bäumen sind geordnet – Es können sich beliebige unterschiedliche Teilbäume an einem Knoten befinden. 6 Eine Beispiel Datenbank 7 In XML ... 8 <students> <student id="100026"> <name>Joe Average</name> <age>21</age> <major>Biology</major> <results> <result course="Math 101" grade="C-"/> <result course="Biology 101" grade="C+"/> <result course="Statistics 101" grade="D"/> </results> </student> <student id="100078"> <name>Jack Doe</name> <age>18</age> <major>Physics</major> <major>XML Science</major> <results> <result course="Math 101" grade="A"/> <result course="XML 101" grade="A-"/> <result course="Physics 101" grade="B+"/> <result course="XML 102" grade="A"/> </results> </student> </students> Vorteile von Datenbanken • Transaktionierung von Operationen • Steuerung der Zugriffsberechtigungen • Informationsextraktion durch Anfragen – SQL = structured query language • Die Anfragemöglichkeit soll auch für XMLDaten bereit gestellt werden. – Warum reicht XPath nicht? 9 Warum Anfragen? • • • • Um Teile eines Dokuments zu extrahieren Um einen dynamischen Index zu erzeugen Zur kontextabhängigen Suche Zur Erzeugung neuer Dokumente aus einer Kombination bestehender • Zur automatischen Generierung von Dokumenten • Um Informationen zu kombinieren • Zur Suche nach Auffälligkeiten in den Teilen 10 XQuery Design Anforderungen • Must have at least one XML syntax and at least one human-readable syntax • Must be declarative • Must be namespace aware • Must coordinate with XML Schema • Must support simple and complex datatypes • Must combine information from multiple documents • Must be able to transform and create XML trees 11 [http://www.w3.org/TR/xquery-requirements/] XQuery und XPath • XQuery 1.0 ist eine echte Obermenge von XPath 2.0 • Jeder XPath 2.0-Ausdruck ist ebenfalls ein XQuery 1.0-Ausdruck (Query) • XQuery 1.0 kann zusätzlich: – Informationen aus verschiedenen Quellen verbinden – neue XML-Fragmente erzeugen 12 XQuery und XSLT • XQuery und XSLT sind beides spezielle Sprachen, um XML Daten aus unterschiedlichen Quellen zu kombinieren • XQuery und XSLT sind sehr unterschiedlich im Design (aus historischen Gründen) • XQuery wurde mit SQL als Vorbild entworfen. • XSLT wurde als Alternative zu CSS entworfen. • Aus einer technischen Sicht kann XSLT wohl XQuery emulieren und umgekehrt. 13 XSLT und XQuery XSLT 2.0 XQuery 1.0 Functions and Operators XPath 2.0 Data Model XML Schema [M. Kay] 14 XSLT und XQuery XQuery 1.0 XSLT 2.0 XPath 2.0 XSLT 1.0 XPath 1.0 XML Schema 15 Die Sprache XQuery 16 Übersicht • Deklarationen • Datentypen • XQuery Ausdrücke – Konstruktoren – FLWOR – Funktionen • Beispiel 17 Xquery-Prolog • Xquery-Ausdrücke werden relativ zu einem Kontext evaluiert (wie XPath). • Der Kontext wird explizit durch den Prolog vorgegeben. • Dabei werden verschiedene Parameter für den Xquery-Prozessor spezifiziert. 18 xquery version "1.0"; declare xmlspace preserve; declare xmlspace strip; declare default element namespace URI; declare default function namespace URI; import schema at URI; declare namespace NCName = URI; Implizite Deklarationen declare namespace xml = "http://www.w3.org/XML/1998/namespace"; declare namespace xs = "http://www.w3.org/2001/XMLSchema"; declare namespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; declare namespace fn = "http://www.w3.org/2005/11/xpath-functions"; declare namespace xdt = "http://www.w3.org/2005/11/xpath-datatypes"; declare namespace local ="http://www.w3.org/2005/11/xquery-local-functions"; 19 Xpath-Ausdrücke • Xpath-Ausdrücke sind auch XqueryAusdrücke. • Der Xquery-Prolog spezifiziert den notwendigen Xpath-Kontext. • Der initiale Kontext, Position (position) und Umfang (size) sind undefiniert. 20 Atomare Werte und primitive Datentypen • Dieselben atomaren Werte wie in XPath 2.0 • Viele Primitive 21 xs:string("XML is fun") xs:boolean("true") xs:decimal("3.1415") xs:float("6.02214199E23") xs:dateTime("1999-05-31T13:20:00-05:00") xs:time("13:20:00-05:00") xs:date("1999-05-31") xs:gYearMonth("1999-05") xs:gYear("1999") xs:hexBinary("48656c6c6f0a") xs:base64Binary("SGVsbG8K") xs:anyURI("http://www.brics.dk/ixwt/") xs:QName("rcp:recipe") Datentypen • Atomare Werte – Instanzen eines einfachen Typs – XQuery besitzt eigene und von XML Schema vererbte Datentypen – Beispiele • • • • • xs:integer xs:string xs:date xs:boolean xdt:untypedAtomic 22 [Markus Mauch: http://www.ipd.uni-karlsruhe.de/~oosem/S2D2/] Datentypen • Knoten – XML-Dokument: Baum bestehend aus Knoten – Knotentypen • • • • • • • element attribute text document-node comment processing-instruction namespace – Elementknoten • Einfacher und komplexer Inhalt • Textueller Wert und Typ 23 <?xml version="1.0"?> <greetings> <!-- Welcome Message --> <welcome> Hello XQuery World </welcome> </greetings> [Markus Mauch: http://www.ipd.uni-karlsruhe.de/~oosem/S2D2/] Xquery-Ausdrücke • Xquery-Ausdrücke können neue XML-Knoten erzeugen. • Xquery-Ausdrücke können beschreiben: – – – – Elemente Character data Kommentare Processing instructions • Jeder Knoten wird mit einer eindeutigen Id erzeugt. • Konstruktoren sind entweder direkt (direct) oder berechnet (computed) 24 Direkte Konstruktoren • Verwenden Standard-XML-Syntax • Der Ausdruck <foo><bar/>baz</foo> erzeugt das entsprechende XML-Fragment. • Der Ausdruck <foo/> is <foo/> ist false. 25 Namensräume in Konstruktoren declare default element namespace "http://businesscard.org"; <card> <name>John Doe</name> <title>CEO, Widget Inc.</title> <email>[email protected]</email> <phone>(202) 555-1414</phone> declare namespace b = "http://businesscard.org"; <logo uri="widget.gif"/> <b:card> </card> <b:name>John Doe</b:name> <b:title>CEO, Widget Inc.</b:title> <b:email>[email protected]</b:email> <b:phone>(202) 555-1414</b:phone> <b:logo uri="widget.gif"/> <card xmlns="http://businesscard.org"> </b:card> <name>John Doe</name> <title>CEO, Widget Inc.</title> <email>[email protected]</email> <phone>(202) 555-1414</phone> <logo uri="widget.gif"/> 26 </card> Eingebettete Ausdrücke <foo>1 2 3 4 5</foo> <foo>{1, 2, 3, 4, 5}</foo> <foo>{1, "2", 3, 4, 5}</foo> <foo>{1 to 5}</foo> <foo>1 {1+1} {" "} {"3"} {" "} {4 to 5}</foo> <foo bar="1 2 3 4 5"/> <foo bar="{1, 2, 3, 4, 5}"/> <foo bar="1 {2 to 4} 5"/> 27 Explizite Konstruktoren <card xmlns="http://businesscard.org"> <name>John Doe</name> <title>CEO, Widget Inc.</title> <email>[email protected]</email> <phone>(202) 555-1414</phone> <logo uri="widget.gif"/> </card> 28 element card { namespace { "http://businesscard.org" }, element name { text { "John Doe" } }, element title { text { "CEO, Widget Inc." } } , element email { text { "[email protected]" } }, element phone { text { "(202) 555-1414" } }, element logo { attribute uri { "widget.gif" } } } Berechnete Tag-Namen (QNames) element { "card" } { namespace { "http://businesscard.org" }, element { "name" } { text { "John Doe" } }, element { "title" } { text { "CEO, Widget Inc." } }, element { "email" } { text { "[email protected]" } }, element { "phone" } { text { "(202) 555-1414" } }, element { "logo" } { attribute { "uri" } { "widget.gif" } } } 29 Berechnete Tag-Namen (QNames) element { if ($lang="Danish") then "kort" else "card" } { namespace { "http://businesscard.org" }, element { if ($lang="Danish") then "navn" else "name" } { text { "John Doe" } }, element { if ($lang="Danish") then "titel" else "title" } { text { "CEO, Widget Inc." } }, element { "email" } { text { "[email protected]" } }, element { if ($lang="Danish") then "telefon" else "phone"} { text { "(202) 456-1414" } }, element { "logo" } { attribute { "uri" } { "widget.gif" } } } 30 FLWORAusdrücke • Allgemeine Xquery-Anfragen • for – let – where – order- return (FLWOR) <doubles> { for $s in fn:doc("students.xml")//student let $m := $s/major where fn:count($m) ge 2 order by $s/@id return <double> { $s/name/text() } </double> } </doubles> 31 for und let (1/4) for $x in (1, 2, 3, 4) let $y := ("a", "b", "c") return ($x, $y) 1, a, b, c, 2, a, b, c, 3, a, b, c, 4, a, b, c 32 for und let (2/4) let $x in (1, 2, 3, 4) for $y := ("a", "b", "c") return ($x, $y) 1, 2, 3, 4, a, 1, 2, 3, 4, b, 1, 2, 3, 4, c 33 for und let (3/4) for $x in (1, 2, 3, 4) for $y := ("a", "b", "c") return ($x, $y) 1, a, 1, b, 1, c, 2, a, 2, b, 2, c, 3, a, 3, b, 3, c, 4, a, 4, b, 4, c 34 for und let (4/4) let $x in (1, 2, 3, 4) let $y := ("a", "b", "c") return ($x, $y) 1, 2, 3, 4, a, b, c 35 Joins declare namespace rcp = "http://www.brics.dk/ixwt/recipes"; for $r in fn:doc("recipes.xml")//rcp:recipe for $i in $r//rcp:ingredient/@name for $s in fn:doc("fridge.xml")//stuff[text()=$i] return $r/rcp:title/text() <fridge> <stuff>eggs</stuff> <stuff>olive oil</stuff> <stuff>ketchup</stuff> <stuff>unrecognizable moldy thing</stuff> </fridge> <recipes xmlns:rcp="..."> <rcp:recipe> <rcp:ingredient>egg</rcp:ingredient> <rcp:ingredient>butter</rcp:ingredient> </rcp:recipe> : 36 </recipes> Invertierte Relation declare namespace rcp = "http://www.brics.dk/ixwt/recipes"; <ingredients> { for $i in distinct-values( fn:doc("recipes.xml")//rcp:ingredient/@name ) return <ingredient name="{$i}"> { for $r in fn:doc("recipes.xml")//rcp:recipe where $r//rcp:ingredient[@name=$i] return <title>$r/rcp:title/text()</title> } </ingredient> } </ingredients> 37 Sortieren der Ergebnisse declare namespace rcp = "http://www.brics.dk/ixwt/recipes"; <ingredients> { for $i in distinct-values( fn:doc("recipes.xml")//rcp:ingredient/@name ) order by $i return <ingredient name="{$i}"> { for $r in fn:doc("recipes.xml")//rcp:recipe where $r//rcp:ingredient[@name=$i] order by $r/rcp:title/text() return <title>$r/rcp:title/text()</title> } </ingredient> } </ingredients> 38 Komplizierteres Sortieren for $s in document("students.xml")//student order by fn:count($s/results/result[fn:contains(@grade,"A")]) descending, fn:count($s/major) descending, xs:integer($s/age/text()) ascending return $s/name/text() 39 Funktionen declare function local:grade($g) { if ($g="A") then 4.0 else if ($g="A-") then 3.7 else if ($g="B+") then 3.3 else if ($g="B") then else if ($g="B-") then 2.7 else if ($g="C+") then else if ($g="C") then 2.0 else if ($g="C-") then else if ($g="D+") then 1.3 else if ($g="D") then else if ($g="D-") then 0.7 else 0 }; 3.0 2.3 1.7 1.0 declare function local:gpa($s) { fn:avg(for $g in $s/results/result/@grade return local:grade($g)) }; 40 <gpas> { for $s in fn:doc("students.xml")//student return <gpa id="{$s/@id}" gpa="{local:gpa($s)}"/> } </gpas> Typisierte und untypisierte Funktionen 41 Sequenz-Typen 2 instance of xs:integer 2 instance of item() 2 instance of xs:integer? () instance of empty() () instance of xs:integer* (1,2,3,4) instance of xs:integer* (1,2,3,4) instance of xs:integer+ <foo/> instance of item() <foo/> instance of node() <foo/> instance of element() <foo/> instance of element(foo) <foo bar="baz"/> instance of element(foo) <foo bar="baz"/>/@bar instance of attribute() <foo bar="baz"/>/@bar instance of attribute(bar) fn:doc("recipes.xml")//rcp:ingredient instance of element()+ fn:doc("recipes.xml")//rcp:ingredient instance of element(rcp:ingredient)+ 42 XML und Datenbanken • Wie können XML und Datenbanken verbunden werden? • Ansätze: – Extraktion von XML (views) für Relationen – Verwendung von SQL, um XML zu erzeugen – „shred XML into relational databases” 43 Automatische XML-Erzeugung 44 Automatische XML-Erzeugung 45 Automatische XML-Erzeugung 46 Automatische XML Erzeugung 47 XML schreddern • Jedes Element wird durch eine Relation dargestellt • Jeder Element-Knoten erhält eine eindeutige Id • Jeder Element Knoten verweist auf seinen Elternknoten • Die möglichen Attribute werden als Felder (der Relation) dargestellt. Abwesende Felder haben den Wert null. • Knoteninhalte, die nur aus Zeichen bestehen werden als Felder dargestellt. 48 XQuery Processing Model ! Formalized & normative: – Normalization of expressions into a smaller “core” grammar (SQ5) – Static typing (SQ6) ! Formalized & non-normative: – Dynamic evalution (DQ1) ! Formalized & informative: – Schema import (SI1) 49 [Jerome Simeon] eXist 50 Quellen • Chris Wallace, University of the West of England, Bristol, UK • Yin-Fu Huang, Shing-Hang Wang 51 Why not an RDBMS? • Documents – – – – Unit of editing, ownership, communication Complex composite structures Ordering and other complex relationships Linked by shared values 52 eXist Native XML Database • • • Open source Java European team of developers led by Wolfgang Meier(Darmstadt) Documents (files) are organised in collections (folders) in a file store – XML Documents stored in an efficient, B+ tree structure with indexes – Non-XML resources (XQuery, CSS, JPEG ..), etc can be stored as binary • Deployable in different ways – Embedded in a Java application – With embedded Jetty HTTPserver • Multiple Interfaces – REST – to Java servlet – SOAP – XML:RPC • Support for XQuery – – – – Function library extensions Language extensions (free-text matching and update) Schema validation supported Database is not schema-aware – no type information available 53 Architecture Overview 54 Database Features • Data Storage – Native XML data store based on B+-trees and paged files. Document nodes are stored in a DOM tree. • Collections – Documents are managed in hierarchical collections, similar to storing files in a file system • Updates – Document-level and node-level updates. • Authorization Mechanism – Unix-like access permissions for users/groups at collection- and document-level. 55 Database Features • Multi-User Access – Concurrent read/write access supported. Database manages concurrency at the level of the basic database operations. • Deployment – eXist may be deployed as a stand-alone database server, as an embedded Java library or as part of a web application (running in the servlet engine). • Backup/Restore – Backup/restore functionality is provided via Java admin client or Ant scripts. Allows full restore of a database including user/group permissions. • XML Standards – XPath, Xquery, XUpdate, XSL/XSLT. • Network Protocols – HTTP/REST, XML-RPC, SOAP, WebDAV 56 Numbering Schemes • The major benefit of Numbering Schemes is that relationships can be determined efficient. • K-ary Tree 57 Numbering Schemes • Instead the number of children a node may have is recomputed for every level of the tree. – Two nodes x and y of a tree, size(x) = size(y) if level(x) = level(y) 58 Index and Data Organization • eXist uses four index files at the core of the native XML storage backend: – collections.dbx - manages the collection hierarchy – dom.dbx - collects nodes in a paged file and associates unique node identifiers to the actual nodes – elements.dbx - indexes elements and attributes – words.dbx - keeps track of word occurrences and is used by the fulltext search extensions • All based on B+-trees 59 collections.dbx • • Manages the collection hierarchy and maps collection names to collection objects. An important point to note is that the indexes for elements, attributes and keywords are organized by collection and no by document XML collection collection collection XML 60 dom.dbx • • The XML data store(dom.dbx) represents the central component of eXist's native storage architecture. All document nodes are stored according to the W3C's DOM (Document Object Model). • The data store is backed by a multi-root B+-Tree in the same file. • Associate the unique node identifiers of top-level elements in a given document to the node’s storage address in the data pages. 61 dom.dbx • However, the query engine will process most types of XPath without accessing dom.dbx. 62 elements.dbx • • • Element and Attribute names are mapped to unique node identifiers in file elements.dbx. Each entry in the B+-tree index consists of a key <collection-id, name-id> And each key correspond an array containing an list of <document-id, node-id> Attribute or Element 63 word.dbx • • • words.dbx corresponds to an inverted index as found. with the set of documents in which it has been found and the exact position where it occurred Using <collection-id, keyword> pair for key, like element.dbx Each entry in the value list points to a text or attribute node where the keyword occurred. <collection-id, keyword> Keyword occurred Keyword occurred Like node-id 64 Query Language Implementation • First decompose a given path expression into a chain of basic steps • Example Query – /PLAY//SPEECH[SPEAKER=’HAMLET’] • <1> Load the root elements "PLAY" for all documents in the input document set. • <2> The set of "SPEECH" element is retrieved for the input documents via an index lookup from file elements.dbx. • <3> Ancestor-descendant join algorithm is applied to the two sets (use <document-id, node-id>). And repeat. • <4> While value need to be compared (like "HAMLET”), it must retrieved value from dom.dbx. 65 Fulltext Search • The fulltext index is required by eXist's fulltext extensions. • "|=" operators. – node-set |= 'string of keywords' • selects context nodes containing any of the keywords in the right-hand argument. • The fulltext index is stored in file words.dbx. 66 Performance XPath Query eXist eXist+ extensions /movie[.//genre='Drama']//credit[@role='directors'] 3.44 1.14 /movie[genres/genre='Western']/title 0.79 /movie[languages/language='English']/title 1.45 /movie[.//credit/@charactername='Receptionist'] 3.12 /movie[contains(.//comment, 'predictable')] /movie[.//credit='Gable, Clark'] Xindice Jaxen 10.62 21.86 0.23 1.39 7.58 0.97 34.18 8.5 0.21 27.04 51.48 2.79 0.2 25.75 31.49 4.47 0.35 0.38 33.72 /movie[.//languages/language='English']/title[starts-with(.,'42nd Street')] 1.63 0.32 17.47 32.64 /movie[languages/language='English' and cred-its/credit='Sinatra, Frank'] 5.16 0.58 0.11 13.26 19.07.2011 MM & DB Lab. 67