1 Ukládání a dotazování nad XML daty, XQuery Obsah XML Databáze .................................................................................................................. 2 Co je to XML databáze ............................................................................................... 2 Proč XML databáze .................................................................................................... 2 Kdy nepoužít XML databázi ........................................................................................ 2 XML a relační databáze ............................................................................................... 3 Nativní XML databáze ................................................................................................ 3 Indexování XML dokumentů ................................................................................................ 3 Efektivní ukládání a vyhledávání ................................................................................... 3 Indexování pro vyhodnocování XPath výrazů .................................................................. 4 Vyhodnocování XPath dotazů ....................................................................................... 4 Optimalizace XPath výrazů .......................................................................................... 4 Efektivita vyhodnocování XPath výrazů ......................................................................... 5 Co je efektivnější? ...................................................................................................... 5 XQuery ............................................................................................................................. 5 Charakteristika ........................................................................................................... 5 Charakteristika (2) ...................................................................................................... 5 Kde se XQuery použije (a nepoužije) ............................................................................. 6 Příklad - zdrojový dokument ........................................................................................ 6 Příklad - jednoduchý dotaz XPath ................................................................................. 6 Příklad - spuštění v Saxon 9.0j ..................................................................................... 7 Příklad - výsledek ....................................................................................................... 7 XQuery konstrukce ............................................................................................................. 8 FLWOR .................................................................................................................... 8 FLWOR - jednoduchý příklad ....................................................................................... 8 Implementace XQuery ......................................................................................................... 8 SAXON od verzí 7.x .................................................................................................. 8 Nativní XML databáze ................................................................................................ 9 Rozhraní pro práci s XML databázemi ................................................................................... 9 Rozhraní pro práci s XML databázemi ........................................................................... 9 Rozhraní XML:DB ..................................................................................................... 9 Vrstvy XML:DB API .................................................................................................. 9 Ukázka XML:DB programu ........................................................................................ 10 Použití XUpdate v databázích s XML:DB ..................................................................... 11 eXist ............................................................................................................................... 11 eXist ....................................................................................................................... 11 eXist: instalace a spuštění ........................................................................................... 11 eXist: použití přes webové rozhraní ............................................................................. 11 eXist: vložení dokumentu do kolekce ........................................................................... 12 eXist: dotazování - zadání dotazu ................................................................................ 13 eXist: dotazování - sumarizovaný výsledek dotazu .......................................................... 15 eXist: dotazování - prohlížení jednotlivých výsledků dotazu .............................................. 15 XQuery 3.0 ...................................................................................................................... 17 Charakteristika ......................................................................................................... 17 Nové rysy jazyka Query 3.0 ....................................................................................... 17 Ukládání a dotazování nad XML daty, XQuery 2 BaseX ............................................................................................................................. 17 BaseX ..................................................................................................................... 17 XML Databáze Co je to XML databáze XML databáze je prakticky kolekce XML dokumentů uložených v nějakém úložišti. Tímto úložištěm může být například • souborový systém (nebo jiné perzistentní úložiště) • relační databáze • objektová databáze • hierarchická nebo postrelační databáze • nativní XML databáze V přeneseném slova smyslu se pojmem XML databáze označují systémy řízení báze dat, které umožňují ukládat kolekce XML dokumentů (podobně jako se pojmem relační databáze nepesně označují systémy řízení báze dat pracující s relačním modelem). Někdy se také význam pojmu XML databáze omezuje pouze na nativní XML databáze. Proč XML databáze • XML je univerzální formát pro výměnu a reprezentaci informací. • Transformace do jiných formátů je snadná. • Ideální pro ukládání dokumentů. • Univerzální formát pro datové modelování. • Snadná a přirozená reprezentace objektů (agregace, dědičnost, asociace) - viz XML Schema. Typickým případem kdy je vhodné použít XML databázi je situace, kdy pořizujeme nebo získáváme data přímo ve formátu XML a potřebujeme vzniklé dokumenty ukládat. Kdy nepoužít XML databázi • Když vyhovuje jiný datový model (většinou relační). • U aplikací se specifickými požadavky (výkon). • Když potřebujeme vlastnosti, které zatím běžně dostupné XML databáze neposkytují XML databáze jsou zatím v plenkách • Nedosahují robusnosti relačních databázových systémů (transakce, souběžný přístup, škálovatelnost), i když mnohé tyto vlastnosti jsou již nabízeny - viz např. přehled na Wikipedii: Native XML Databases [http://en.wikipedia.org/wiki/XML_database#Native_XML_databases]. Ukládání a dotazování nad XML daty, XQuery 3 • Chybí plná podpora standardů. • Metody pro indexování a optimalizaci vyhodnocování dotazů se teprve vyvíjí. XML databáze nejsou a nikdy nebudou následníkem relačních databází; tvoří k nim alternativu vhodnou pro určité typy dat a aplikací. XML a relační databáze XML dokumenty je možné ukládat v relačních databázích pomocí • polí typu TEXT nebo BLOB • specializovaných schémat pro konkrétní aplikace • univerzálních schémat bez indexování struktury • univerzálních schémat s indexováním struktury Mnoho existujících relačních SŘBD poskytuje většinou proprietární podporu pro ukládání XML (rozšíření SQL). Při indexování XML dokumentů nalézá uplatnění mnoho algoritmů a technik z relačních SŘBD. Nativní XML databáze Existuje řada nativních XML databází, mezi nejznámější patří • Tamino [http://www.softwareag.com/tamino/News/tamino_41.htm], což je zřejmě nejznámější komerční nativní XML databáze. • BaseX [http://www.inf.uni-konstanz.de/dbis/basex/index] je volně dostupná nativní XML databáze vyvíjená na platformě Java 6 týmem Univerzity Konstanz. Je jednoduchá pro instalaci a vhodná pro interaktivní práci s XML daty a XQuery! • eXist [http://exist-db.org/], což je open source podporující mimo jiné XQuery [http://www.w3.org/ XML/Query], XUpdate [http://xmldb-org.sourceforge.net/xupdate/], XML:DB API [http://xmldborg.sourceforge.net/xapi/] a XML-RPC. Jde dle mého názoru o nejlepší existující open source databázi. Je šířena pod licencí GNU LGPL [http://www.gnu.org/copyleft/lesser.html]. • Apache Xindice [http://xml.apache.org/xindice/], cože je open source nativní XML databáze od Apache Software Foundation [http://www.apache.org/]. Podporuje XPath [http://www.w3.org/ TR/xpath], XUpdate [http://xmldb-org.sourceforge.net/xupdate/], XML:DB API [http://xmldborg.sourceforge.net/xapi/] a XML-RPC. Není však nadále seriózně vyvíjená a podporovaná. Indexování XML dokumentů Efektivní ukládání a vyhledávání Jak již bylo zmíněno, kolekce XML dokumentů se dají ukládat různým způsobem, které se liší zejména efektivitou různých operací. Ve všech zmíněných případech lze však aplikovat pomocné indexační struktury pro zvýšení jejich efektivity. Indexování XML dokumentů umožňuje Ukládání a dotazování nad XML daty, XQuery 4 • efektivní vyhledávání v kolekcích XML dokumentů, • efektivní provádění XML transformací, • efektivní aktualizaci dokumentů, • efektivní navigaci v rámci dokumentu. Nejčastěji je cílem indexování efektivní vyhodnocování XPath dotazů. Indexování pro vyhodnocování XPath výrazů • Indexování textových (hodnotových) informací • hodnoty textových uzlů; • hodnoty atributů; • jména elementů a atributů. • Indexování strukturálních vztahů (osy XPath) • Vyhodnocení relace je na ose/není na ose (např. je uzel x potomkem uzlu y?); • Které uzly leží na dané ose (vrať mi všechny potomky uzlu x). Pro indexování textových informací se používají invertované soubory (B+ strom, hešovací tabulky) nebo plnotextové indexy (fulltext). Pro indexování strukturálních vztahů byla vyvinuta řada metod, každá z nich má však nějaká slabá místa. Obvykle jsou tyto metody založeny na nějakém číslovacím schématu. Vyhodnocování XPath dotazů Pro vyhodnocení XPath dotazů je nutné • vyhodnotit všechny predikáty a testy uzlů, • vyhodnotit všechny strukturální vztahy, • spojit (join) výsledky. Pořadí operací může výrazně ovlivnit efektivitu zpracování. Optimalizace XPath výrazů • Zjednodušování a transformace dotazů • s využitím znalosti struktury dokumentu; • s využitím znalosti složitosti jednotlivých operací; • s využitím statistických informací; • eliminiace zbytečných predikátů. • Výběr vhodného pořadí pro zpracování. • Výběr vhodné metody pro vyhodnocení. Ukládání a dotazování nad XML daty, XQuery 5 V současné době jsou bohužel schopnosti optimalizátorů v XML databázích omezené a nepříliš účinné. Efektivita vyhodnocování XPath výrazů Různě zapsané XPath/XQuery dotazy se stejným významem se mohou vyhodnotit různě efektivně. Dokonalý optimalizátor dotazů by měl toto eliminovat. Jenomže • dokonalý optimalizátor (zatím?) neexistuje, • mnoho implementací ani žádný nemá (XSLT procesory), • optimizer mnohdy nemá k dispozici všechny informace. Jak psát efektivní XPath dotazy? • Pokud to není nezbytně nutné, efektivitu neřešte a dejte přednost přehlednosti. • Efektivita jednotlivých operací silně závisí na konkrétní implementaci. • Proto je pro dosažení efektivity vhodné znát způsob vyhodnocování XPath dotazů konkrétním XPath procesorem. • Alternativou může být experimentální metoda. Co je efektivnější? • /people/person nebo //person • //person[@id=1]/name nebo //name[parent::*/@id=1] • //person[number(@id)=$a] nebo //person[@id=$a] • { for $p in //person[@id=$a] return $p } nebo { for $p in //person where $p/@id=$a return $p } XQuery Charakteristika • Jazyk pro specifikaci dotazů k vyhledání a extrakci uzlů XML (elementy, atributy) z dokumentů a konstrukci výstupního XML dokumentu. Charakteristika (2) • V současnosti (a zdá se i budoucnosti) je XQuery základním dotazovacím jazykem nad XML dokumenty. • Definován konsorciem W3C, stane se specifikací - momentálně ve stavu Last Call Working Draft, viz http://www.w3.org/XML/Query. • Založen na XPath 2.0 datovém modelu, operátorech a funkcích • Podporují ho hlavní producenti databázových strojů (IBM, MS, Oracle a další) Ukládání a dotazování nad XML daty, XQuery 6 Kde se XQuery použije (a nepoužije) XQuery se typicky použije např. pro: • dotazy, kde je složitější extrakční (selekční) část a jednodušší konstrukční část • v opačném případě je lépe použít XSLT • nebo dokonce zpracování obecnějším programovacím prostředím - např. manipulaci s (DOM) objektovým stromem dokumentu. Příklad - zdrojový dokument Ukázka zdrojového dokumentu, XQuery dotazů nad nimi a jejich výsledku. Příklad 1. Zdrojový dokument Petr Novák 1969-05-14 novak@myfriends.com Very good friend Jaroslav Nováèek 1968-06-14 novacek@myfriends.com Another good friend Jan Horák 1970-02-01 horak@mycompany.com Just colleague Erich Polák 1980-02-28 erich@myfriends.com Good friend Příklad - jednoduchý dotaz XPath Ukázka XQuery dotazu nad výše uvedeným zdrojovým dokumentem. Úloha: "extrakce všech příjmení v adresáři". Ukládání a dotazování nad XML daty, XQuery 7 Dotaz je v podstatě XPath výrazem - vybere tedy všechny elementy lastname. Příklad 2. XQuery doc('myaddresses.xml')/addressbook/person/lastname Příklad - spuštění v Saxon 9.0j XSLT procesor Saxon je od verzí 8.x rovněž XQuery procesorem. K vykonání XQuery dotazu je třeba: • instalovat Saxon, např. 9.0.0.4j ("j" značí javovou implementaci - kromě toho existuje i .NET) rozbalením do adresáře - např. c:\devel\saxon9-0-0-4j [http://www.google.com/ search?q=c:\devel\saxon9-0-0-4j] [http://cs.wikipedia.org/wiki/Speci %C3%A1ln%C3%AD:Search?search=c:\devel\saxon9-0-0-4j] • přepnout se do tohoto adresáře: cd c:\devel\saxon9-0-0-4j [http://www.google.com/ search?q=c:\devel\saxon9-0-0-4j] [http://cs.wikipedia.org/wiki/Speci %C3%A1ln%C3%AD:Search?search=c:\devel\saxon9-0-0-4j] [http://www.google.com/search? q=cd ] [http://cs.wikipedia.org/wiki/Speci%C3%A1ln%C3%AD:Search?search=cd ] • uložit výše uvedený dotaz např. do souboru lastnames.xq [http:// www.google.com/search?q=lastnames.xq] [http://cs.wikipedia.org/wiki/ Speci%C3%A1ln%C3%AD:Search?search=lastnames.xq]. • výše uvedený dokument s "addressbook" uložíme do myaddresses.xml [http:// www.google.com/search?q=myaddresses.xml] [http://cs.wikipedia.org/ wiki/Speci%C3%A1ln%C3%AD:Search?search=myaddresses.xml] ve stejném adresáři. • z příkazové řádky spustit: java -classpath saxon9.jar net.sf.saxon.Query o result.xml lastnames.xq [http://www.google.com/search?q=java -classpath saxon9.jar net.sf.saxon.Query -o result.xml lastnames.xq] [http://cs.wikipedia.org/wiki/Speci %C3%A1ln%C3%AD:Search?search=java -classpath saxon9.jar net.sf.saxon.Query -o result.xml lastnames.xq] Příklad - výsledek Uvedený XQuery dotaz vrátí do souboru result.xml [http://www.google.com/search? q=result.xml] [http://cs.wikipedia.org/wiki/Speci%C3%A1ln%C3%AD:Search? search=result.xml] nad zmíněným dokumentem toto: Příklad 3. Výsledek aplikace dotazu Novák Nováček Horák Polák Ukládání a dotazování nad XML daty, XQuery 8 XQuery konstrukce FLWOR FLWOR je zkrácené označení pro strukturu XQuery dotazů. Je to akronym z: (F)or Úvodní část dotazu specifikuje cyklus vč. řídicí proměnné, do níž jsou postupně přiřazovány jednotlivé hodnoty vybrané XPath výrazem za klíčovým slovem "in". (L)et V této sekci lze provést přiřazení do dalších proměnných použitelných následně. (W)here Specifikuje selekční podmínku, tzn. které uzly (hodnoty) vybrané ve "for" budou skutečně použity. V podmínce lze použít i proměnné vázané v sekci "let". (O)rder Takto vybrané uzly (hodnoty) lze výrazem v této sekci uspořádat. (R)eturn Co bude vráceno, zkonstruováno ze získaných uzlů (hodnot). FLWOR - jednoduchý příklad Selekci uzlů lze specifikovat buďto přímo v XPath výrazu ve "for" nebo až v selekčním "where". "Vrať datum narození Poláka." Příklad 4. FLWOR for $person in doc('myaddresses.xml')/addressbook/person where $person/lastname='Polák' return $person/date-of-birth Spuštění vrátí: 1980-02-28 Implementace XQuery SAXON od verzí 7.x • instalovat (rozbalit) Saxon od verze 7.x (lze i 8.x, 9.x) rozbalením do libovolného adresáře • přepnout se do tohoto adresáře a • z příkazové řádky spustit: java -classpath saxon9.jar net.sf.saxon.Query o result.xml queryfile.xq [http://www.google.com/search?q=java -classpath saxon9.jar net.sf.saxon.Query -o result.xml queryfile.xq] [http://cs.wikipedia.org/wiki/Speci %C3%A1ln%C3%AD:Search?search=java -classpath saxon9.jar net.sf.saxon.Query -o result.xml queryfile.xq] Ukládání a dotazování nad XML daty, XQuery 9 • Existuje i stejná verze pro .NET (čili jako .DLL a .EXE soubory) Nativní XML databáze Nativní XML databázové systémy často podporují dotazování přes XQuery. Patří mezi ně např.: • Berkeley DB XML [http://www.sleepycat.com/products/index.shtml] • eXist [http://exist.sourceforge.net/] Rozhraní pro práci s XML databázemi Rozhraní pro práci s XML databázemi • XML:DB [http://xmldb.org] • XUpdate [???] („spící“), resp. nyní XQuery Update Facility [http://www.w3.org/TR/xquery-update-10/] (součást XQuery aktivit) • XML Query API for Java [http://www.jcp.org/aboutJava/communityprocess/edr/jsr225/] (XQJ) Rozhraní XML:DB • Specifikováno konsorciem XML:DB [http://xmldb.org] • Podobná koncepce jako JDBC [http://java.sun.com/products/jdbc/] • Rozhraní je specifikováno na poměrně abstraktní úrovni, implementační detaily jsou skryty. • Základní objekty: • Driver - podobně jako JDBC Driver - abstrahuje přístup ke konkrétnímu DBS, implementuje rozhraní Database • DatabaseManager - řídí zavádění a správu jednotlivých ovladačů (Driver) databázových systémů • Collection - kolekce XML dokumentů v databázi. Konceptuálně srovnatelné s relační tabulkou (či celou databází). Kolekce totiž mohou být libovolně vnořené. • Services - rozhraní konkrétních služeb. Bez nich by XML:DB takřka nemělo smysl - teprve služby definují, co databáze „umí“. Typickou službou je např. XPathQueryService na vyhledávání dokumentů a jejich částí přes XPath. Další službou je např. XUpdateQueryService. • Resource - zhruba odpovídá JDBC resource. Obecně „nějaký“ zdroj - nemusí být jen XML, ale i binární. Je-li XML, pak např. SAX, DOM, XML text... Vrstvy XML:DB API Rozhraní XML:DB je pro pohodlí programátora členěno do úrovní. Vždy si jednu z nich vybereme a využíváme její nabídky: • XML:DB Core Level 0 - musí implementovat všechny DBS. Obsahuje základní rozhraní pro kolekce (collections), zdroje (resources), and služby (services). Ukládání a dotazování nad XML daty, XQuery 10 • XML:DB Core Level 1 - navíc obsahuje XPathQueryService. Ukázka XML:DB programu Příklad 5. Příklad programu využívajícího XML:DB import org.xmldb.api.base.*; import org.xmldb.api.modules.*; import org.xmldb.api.*; public class Query { public static void main(String[] args) throws Exception { Collection col = null; try { String driver = null; String prefix = null; if ( ( args.length == 1 ) && args[0].equals("dbxml") ) { driver = "org.dbxml.client.xmldb.DatabaseImpl"; prefix = "xmldb:dbxml:///db/"; } else { driver = "org.xmldb.api.reference.DatabaseImpl"; prefix = "xmldb:ref:///"; } Class c = Class.forName(driver); Database database = (Database) c.newInstance(); if ( ! database.getConformanceLevel().equals("1") ) { System.out.println("This program requires a Core Level 1 XML:DB " + System.exit(1); } DatabaseManager.registerDatabase(database); col = DatabaseManager.getCollection(prefix + "addresses"); String xpath = "/address[@id = 1]"; XPathQueryService service = (XPathQueryService) col.getService("XPathQu ResourceSet resultSet = service.query(xpath); ResourceIterator results = resultSet.getIterator(); while (results.hasMoreResources()) { Resource res = results.nextResource(); System.out.println((String) res.getContent()); } } catch (XMLDBException e) { System.err.println("XML:DB Exception occurred " + e.errorCode + " " + e } finally { if (col != null) { col.close(); } } } } Ukládání a dotazování nad XML daty, XQuery 11 Použití XUpdate v databázích s XML:DB Příklad 6. Příklad modifikace pomocí XUpdate Herman Tento XUpdate dotaz nahradí příjmení za „Herman“. eXist eXist eXist je podobně jako Xindice open-source databáze podporující XML:DB. Je možné ji provozovat jako: • samostatně běžící (standalone) server, přístupný soketovým spojením (XML-RPC, HTTP) • jako in-process (embedded) -server běžící v témže běhu JVM jako aplikace, která jej používá • jako webová aplikace - .war archív, který se instaluje (deploy) na servletový kontejner (např. Tomcat, Jetty, Bajie...) • eXist má Jetty server přibalen v instalačním balíku, viz eXist download [???]. eXist: instalace a spuštění Je možno instalovat na Win NT/2000, Linuxu... Postupujeme přesně podle instrukcí v eXist Quickstart [http://exist-db.org/quickstart.html]. Doporučuji (odzkoušeno na Win 2000 Pro): • spustit java -jar eXist-0.9.1-install.jar [http://www.google.com/search?q=java -jar eXist-0.9.1-install.jar] [http://cs.wikipedia.org/wiki/Speci%C3%A1ln %C3%AD:Search?search=java -jar eXist-0.9.1-install.jar] • řídit se instalačními pokyny, instalovat např. do \devel\eXist [http:// www.google.com/search?q=\devel\eXist] [http://cs.wikipedia.org/wiki/ Speci%C3%A1ln%C3%AD:Search?search=\devel\eXist]. • přepnout se do instalačního adresáře, otevřít Command Shell/Prompt a spustit eXist přes Jetty webový server: bin\startup.bat [http://www.google.com/search?q=bin\startup.bat] [http://cs.wikipedia.org/wiki/Speci%C3%A1ln%C3%AD:Search?search=bin\startup.bat]. • eXist ohlásí, že se spustil. Případné chybové hlášky loggeru ignorovat. eXist: použití přes webové rozhraní Pokud se v konfiguracích nic neměnilo, je služba eXist dostupná přes URL podobné tomuto: http:// kleopatra.fi.muni.cz:8080/exist/. (tj. port 8080, cesta /exist) Ukládání a dotazování nad XML daty, XQuery 12 Nyní můžeme vytvořit kolekci, přidat soubor, dotazovat se... eXist: vložení dokumentu do kolekce Vytvoříme kolekci mydocs a do ní přidáme dokument databases.xml [http:// www.google.com/search?q=databases.xml] [http://cs.wikipedia.org/wiki/ Speci%C3%A1ln%C3%AD:Search?search=databases.xml] (tyto slidy): Ukládání a dotazování nad XML daty, XQuery 13 eXist: dotazování - zadání dotazu Zadáme XPath dotaz, specifikujeme rozsah (ve které koleci hledat), uvedeme, kolik vyhovujících dokumentů v odpovědi vrátit. Ukládání a dotazování nad XML daty, XQuery 14 Ukládání a dotazování nad XML daty, XQuery 15 eXist: dotazování - sumarizovaný výsledek dotazu eXist sdělí, ve kterých kolekcích které dokumenty vyhovují dotazu: eXist: dotazování - prohlížení jednotlivých výsledků dotazu eXist pro každý vyhovující dokument vrátí uzly, které dotazu vyhovují Ukládání a dotazování nad XML daty, XQuery 16 Ukládání a dotazování nad XML daty, XQuery 17 XQuery 3.0 Charakteristika • Celá řada nových rysů, funkcí, ošetření výjimek apod. • W3C Doporučení ve stádiu WD (prosinec 2010) Nové rysy jazyka Query 3.0 XQuery se typicky použije např. pro: • group by clause in FLWOR Expressions (3.9.7 Group By Clause). • tumbling window and sliding window in FLWOR Expressions (3.9.4 Window Clause). • count clause in FLWOR Expressions (3.9.6 Count Clause). • allowing empty in 3.9.2 For Clause, for functionality similar to outer joins in SQL. • try/catch expressions (3.14 Try/Catch Expressions). • Dynamic function invocation (3.2.2 Dynamic Function Invocation). • Inline functions (3.1.7 Inline Functions). • Private functions (4.18 Function Declaration). • Nondeterministic functions (4.18 Function Declaration) • Switch expressions (3.12 Switch Expression) • Computed namespace constructors (3.8.3.7 Computed Namespace Constructors). • Output declarations (2.2.4 Serialization). • Annotations (4.15 Annotations). Annotation assertions in function tests. BaseX BaseX • BaseX je podobně jako eXist open-source databáze podporující XQuery. • Jde o open-source projekt dostupný na http://basex.org/.