XML data na disku jako databáze Kamil Toman
Cíl ● Návrh systému pro práci s perzistentními XML daty, zpracování možných přístupů při implementaci databázových operací. ● Vytvoření experimentální databázové aplikace.
XML data ● Existující rozsáhlé soubory XML dat – Z různých zdrojů – Kolekce dokumentů – dokumenty odpovídající stejnému DTD ● Model dat – ohodnocený, orientovaný strom – Uzly – elementy, atributy, textové uzly – Hrany – modelují vztah otec-syn jednotlivých uzlů ● Potřeba XML dotazovacího jazyka
XML dotazovací jazyky ● XPath – navigace ve struktuře dokumentu – Obecná konstrukce: osa::test [ predikát [... ] ]... – Zobecněné cesty jmen ● /hra//název – Korelované cesty jmen ● /hra[.//název/text()=„Hamlet“]/obsazení – Složitější dotazy využívající metadata ● „or“) ]/řádek
XML dotazovací jazyky ● XQuery – komplexní XML DJ, podobnost s SQL – Funkcionální návrh, pro adresaci využívá jazyk XPath – Pracuje s n-ticemi, používá konstruktory, iterátory, proměnné, uživatelské funkce včetně rekurzivních – { for $a in document( zdroj/bib.xml )//kniha, $b in document( půjčovna.xml )//kniha where $a/název = $b/název return {$a/název} {$b/cena} }
Vyhodnocení XML dotazů ● Obecné „navigační metody“: – Shora-dolů, zdola-nahoru, hybridní – Využití hodnotových nebo strukturálních indexů – Využití DTD
Vyhodnocení shora dolů ● /play//speech[speaker=“Hamlet“]/line ● Nalezení všech elementů play hnízděných v kořenovém elementu, ● v podstromu play nalezení elementů speech ● Vybrání jen těch, které obsahují potomka speaker, jehož obsahem je text „Hamlet“ ● Přechodem z vybraných elementů speech nalezneme hnízděné elementy line
Vyhodnocení zdola nahoru ● Nalezení všech elementů s textem „Hamlet“ ● Ověření názvu speaker ● Průchodem ke koření ověření příslušnosti k cestě /play//speech ● Nalezení elementu line průchodem shora dolů
Hybridní vyhodnocení ● Vyhodnocení levé části dotazu shora dolů /play//speech/speaker ● Vyhodnocení pravé části zdola nahoru line/parent::speaker ● Vyhodnocení průniku obou množin a dopočítání restrikce na textovou hodnotu „Hamlet“ ● Dohledání příslušných elementů line
Vyhodnocení XML dotazů ● Strukturální spojení – Nový typ operace využívající strukturálního očíslování k zjištění vztahu předek-potomek – Lze jej používat jen omezeně, např. pro vyhodnocení zobecněných cest jmen: ● Nalezení počátečních množin v některém z indexů ● Postupné slučování nalezených uzlů podle vztahu odvozeného z identifikátorů jednotlivých uzlů
Strukturální vyhodnocení ●
Strukturální očíslování uzlů ● Efektivnější konstrukce jsou často založeny na speciálním kódování vztahů uzlů XML dokumentu – Prefixové očíslování Nevýhoda: dlouhé identifikátory – Intervalové očíslování Nevýhoda: obtížnost aktualizace
Příklad ● Jan Novák
Dietzovo očíslování
Intervalové očíslování
k-ární úplný strom
k-ární strom - alternativa
Strukturální prefixové schéma
Uložení XML dat ● Potřeba se přizpůsobit tomu, jak budeme k datům přistupovat – Uložení v relačním nebo objektově-relačních systému ● Výhody – využití současných technologií ● Nevýhody – absence XML dotazovacího jazyka, obtížnost a nízká efektivita vyhodnocení složitějších strukturálních dotazů – Přímé uložení ● Výhody – lepší zachycení struktury dat, vyšší efektivita při použití XML dotazovacího jazyka ● Nevýhody – potřeba vývoje nového typu datového úložiště
Způsoby indexování ● DataGuide XML stromu T je takový strom D, že každá cesta jmen ve zdrojovém stromu T má právě jednu instanci v D a každá cesta jmen v D je také cestou jmen v T.
Příklad - DataGuide
Index SphinX
Adaptivní index - APEX
Implementované řešení - SXQDB ● Nativní XML úložiště – Perzistentní DOM ● Dovoluje přístup k libovolným uzlům ● Poskytuje strukturální informaci z DTD ● K přístupu k uzlům využívá B-stromy ● Aktualizace – předpokládá se duální očíslování uzlů ● Modul pro zpracování dotazů ● Podporuje základní konstrukce XQuery ● Zjednodušené vyhodnocování s důrazem na zpracování výrazů XPath
Závěr – Zvolené řešení umožňuje vyhodnocení všech základních konstrukcí XQuery – Přístup k jednotlivým uzlům XML stromu je efektivní – Úložiště lze doplnit indexy pro urychlení zpracování dotazů – Možnosti rozšíření: komplexnější modul pro vyhodnocování dotazů, logický optimalizátor
Srovnání s dalšími XML DB ● Srovnávací DB - kolekce XML dokumentů představující souborné dílo Shakespeara – Velikost: 7,9MB – Počet elementů: ~ – Počet hodnot elementů: ~
Srovnání s dalšími XML DB ● Serializace celé kolekce: Q1: { / } ● Výsledky: – XMLCollection >30min(* 502,042s) – SXQ-DB11,924s – eXists ,050s
Srovnání s dalšími XML DB ● Serializace jednotlivého dokumentu: Q2: { document('src/hamlet.xml') } ● Výsledky: – XMLCollection502,099s – SXQ-DB0,435s – eXists ,105s
Srovnání s dalšími XML DB ● Nalezení elementu SPEECH, který nemá potomka STAGEDIR a zároveň obsahuje podelement SPEAKER s textem „Hamlet“ v dokumentu Hamlet: Q3: { document('src/hamlet.xml') }//SPEECH[ not(exists(.//STAGEDIR)) and SPEAKER/text() = „Hamlet“] } Výsledky: – XMLCollection380,099s – SXQ-DB0,166s – eXists ,643s
Srovnání s dalšími XML DB ● Nalezení elementu PERSONA, který je v podstromu elementu PERSONAE, který má otcovský element PLAY v dokumentu HAMLET Q4: { document('src/hamlet.xml') /PLAY/PERSONAE//PERSONA } ● Výsledky: – XMLCollection2,356s – SXQ-DB0,011s – eXists ,073s
Srovnání s dalšími XML DB ● Nalezení elementu SPEECH, který obsahuje podelement LINE s textem obsahujícím řetězec „Quarrelsome“ v dokumentu „As You Like It“: Q5: { document('src/as_you.xml')//SPEECH[ contains(LINE/text(), „Quarrelsome“)] } ● Výsledky: – XMLCollection-- – SXQ-DB0,063s – eXists ,214s (* 0,040s)
Srovnání s dalšími XML DB ● Nalezení elementu SPEECH, který obsahuje podelement LINE s textem obsahujícím řetězec „Quarrelsome“ v celé kolekci: Q6: { //SPEECH[contains( LINE/text(),„Quarrelsome“)] } ● Výsledky: – XMLCollection-- – SXQ-DB3,847s – eXists ,809s (* 0,107s)