Általános lekérdezési feladatok Az XML értékeinek szűrése, kiválasztása: navigálás, kiválasztás, információ kinyerése XML dokumentumok összefésülése, aggregálás: Összekapcsolás, aggregálás Adott sémájú XML dokumentum átalakítása másik sémájú dokumentummá: XML konstrukció A programozási felülettel a hogyant specifikáljuk. A lekérdező nyelven nem a hogyant, hanem a mit specifikáljuk. 1
Az XML lekérdező nyelvei XPath 2.0: Általános nyelv a navigálásra, kiválasztásra, információs kinyerésre Az XSLT, XQuery, XML Schema, alapját képezi. XSLT 2.0: XML XML, HTML, Text Átalakító script nyelv. Az XML-t például HTML formájúvá alakítja, hogy böngészővel meg lehessen jeleníteni. XQuery 1.0: XML XML Az XPath-nál bővebb lekérdező nyelv. 2
XPath adatmodell Az XML lekérdezései az XML fa bejárását határozzák meg. XPath kifejezéseit az XML fa alapján kell kiértékelni. Az XML fa csúcsai a következő csúcstípusúak lehetnek: Dokumentum Elem Attribútum Szöveg Instrukció Megjegyzés Névtér 3
Csúcsok Egy csúcsnak lehet neve, vagy értéke, vagy mindkettő egy Elem csúcsnak neve van, de értéke nincs; egy Szöveg csúcsnak nincs neve, de karaktersorozatú értéke van; egy Attribútum csúcsnak neve és értéke is van. 4
Csúcsok azonosítói Minden csúcsnak van egy egyedi csúcsazonosítója, ami nem módosítható. 5
Dokumentum sorrend A csúcsok közti rendezést a dokumentum sorrend definiálja, mely a pre-order bejárásnak felel meg. Egy szülő csúcs megelőzi a gyerekeit és attribútumait. A testvér csúcsok közül az attribútumok jönnek előbb és csak utána a más típusúak. Az attribútumok sorrendje implementáció függő. 6
Példák XPath lekérdezésekre <irodalom> <könyv ár= 55 > <kiadó>addison-wesley</kiadó> <>Serge Abiteboul</> <><kernév>rick</kernév> <veznév>hull</veznév> </> <>Victor Vianu</> <cím>foundations of Databases</cím> <év>1995</év> </könyv> <könyv> <kiadó>freeman</kiadó> <>Jeffrey D. Ullman</> <cím>principles of Database and Knowledge Base Systems</cím> <év>1998</év> </könyv> </irodalom> 7
Az XML-fa Gyökér irodalom ár könyv könyv kiadó cím év kiadó cím év kernév veznév 8
/irodalom/könyv/év Gyökér irodalom ár könyv könyv kiadó cím év kiadó cím év kernév veznév /irodalom/könyv/év Eredmény: <év>1995</év> <év>1998</év> /irodalom/cikk/év eredménye üres, mert nincs cikk. 9
// Gyökér irodalom ár könyv könyv kiadó cím év kiadó cím év kernév veznév // Eredmény: <>Serge Abiteboul</> <><kernév>rick</kernév> <veznév>hull</veznév> </> <>Victor Vianu</> <>Jeffrey D. Ullman</> 10
/irodalom//kernév Gyökér irodalom ár könyv könyv kiadó cím év kiadó cím év kernév veznév /irodalom//kernév Eredmény: <kernév>rick</kernév> 11
/irodalom/könyv//text() Gyökér irodalom ár könyv könyv kiadó cím év kiadó cím év kernév veznév text() = visszaadja a szövegcsúcs értékét node() = visszaadja csúcsot name() = visszadja a jelölő nevét /irodalom/könyv//text() Eredmény: Serge Abiteboul Victor Vianu Jeffrey D. Ullman 12
///* Gyökér irodalom ár könyv könyv kiadó cím év kiadó cím év kernév veznév ///* Eredmény: <kernév>rick</kernév> <veznév>hull</veznév> A * tetszőleges elemre illeszkedik, de szövegre, attribútumra nem. 13
/irodalom/könyv/@ár Gyökér irodalom ár könyv könyv kiadó cím év kiadó cím év kernév veznév /irodalom/könyv/@ár Eredmény: 55 14
/irodalom/könyv/[kernév] Gyökér irodalom ár könyv könyv kiadó cím év kiadó cím év kernév veznév /irodalom/könyv/[kernév] Eredmény: <> <kernév>rick</kernév> <veznév>hull</veznév> </> [kernév] igaz, ha a elemnek van kernév gyereke. 15
További példák predikátumokra /irodalom/könyv[@ár < 60] az ára kisebb mint 60 /irodalom/könyv[/kernév = "Rick"] egyik jének kerneve Rick /irodalom/könyv[/text()] van szöveggel megadott je /irodalom/könyv[2] a 2. könyv Pozícionáló kifejezés Aritmetikai összehasonlítás Egzisztenciális kifejezés 16
Lekérdezések eredményeinek kombinálása A következő halmazműveleteket lehet használni: Egyesítés:, union Metszet: intersect Kivonás: except Ezek a műveletek eltávolítják a többszörös előfordulásokat. 17
Tengelyek b Aktuális csúcs Elem csúcs Attribútum csúcs Gyökér bli - Szöveg 18
A child tengely b Az attribútumnak van szülője, de ő nem gyereke semelyik csúcsnak! 19
A parent tengely b 20
Az attribute tengely b 21
A descendant tengely b A leszármazott, illetve felmenő a gyerek, illetve a szülő tranzitív lezárása. 22
A descendant-or-self tengely b 23
Az ancestor tengely b 24
Az ancestor-or-self tengely b 25
A following tengely b 26
A following-sibling tengely b 27
A preceding tengely b 28
A preceding-sibling tengely b 29
XPath tengelyei (Axes) child (alapértelmezett tengely) Gyerek csúcsok. parent Szülő csúcsok. attribute Attribútum csúcsok. descendant Leszármazott csúcsok, az aktuális csúcsot nem beleértve. descendant-or-self Leszármazott csúcsok, az aktuális csúcsot is beleértve. ancestor Felmenő ősök, az aktuális csúcsot nem beleértve. ancestor-or-self Felmenő ősök, az aktuális csúcsot is beleértve. following A dokumentum sorrend szerint következő csúcsok. following-sibling A dokumentum sorrend szerint következő testvérek. preceding A dokumentum sorrend szerint megelőző csúcsok. preceding-sibling A dokumentum sorrend szerint megelőző testvérek. self Az aktuális kontextus csúcs. 30
Rövidítések Teljes alak root(.) /descendant-or-self::node()/ self::node() parent::node() child:: attribute:: [position() = szám] Rövidítve / //... @ [szám] 31
Példák rövidítésekre Hosszú alak /child::irodalom/child::könyv /child::irodalom/child::könyv/ attribute::ár /self::node()/descendant-orself::node()/child::cím /descendant-or-self::node()/ child::/parent::node() Rövid alak /irodalom/könyv /irodalom/könyv/@ár /.//cím (ugyanaz mint a //cím) ///.. 32
Kontextus csúcsok Az útvonalakat egy vagy több kontextus csúcsból indítjuk el. Egy XPath lépés: cs 0 /lépés cs 0 jelöli a kontextus csúcsok sorozatát, ahonnan a navigációs lépést végrehajtuk. 33
Lépéssorozat Egy XPath navigációs kifejezés egy vagy több egymás utáni lépésből áll (lépés i (i>=1) ). A lépés 1 a cs 0 kontextus csúcsokból indul és cs 1 csúcsokba érkezik. Ezután cs 1 lesz a lépés 2 új kontextus csúcssorozata, és így tovább. Egy többlépéses XPath útvonal tehát így néz ki: cs 0 /lépés 1 /lépés 2 / ((cs 0 /lépés 1 )/lépés 2 )/ cs 1 34
Egy XPath lépés szintaxisa Egy lépés a következő fomájú: ax::nt[p 1 ] [p n ] ahol 1. az ax egy tengely (axis), amely azt határozza meg, hogy milyen irányba kell a kontextus csúcsokból a navigációt végrehajtani, 2. a nt egy csúcsteszt (node test), amelyet arra használunk, hogy csak bizonyos nevű vagy típusú csúcsokhoz navigáljunk, 3. A p i egy opcionális predikátum, amely segítségével tovább lehet szűrni, hogy milyen csúcsokhoz akarunk a lépéssel eljutni. A predikátumlista a predikátumok konjunkcióját jelenti. 35
Az XQuery lekérdező nyelv Az XQuery egy deklaratív XML lekérdező nyelv. Azt a szerepet játssza, mint az SQL a relációs adatbázisok esetében. Az XQuery rendelkezik programozási nyelvre és adatbázisnyelvre jellemző tulajdonságokkal is. Programozási nyelvi jellemzők: iteráció, változók (for in, let in) rekurzív, felhasználói függvények reguláris kifejezések, típusok listák, tömbök Adatbázisos jellemzők: szűrés csoportosítás, összekapcsolás (joins) 36
Az XQuery nyelvtana XQuery Expr :=Literal Variable FunctionCalls PathExpr ComparisonExpr ArithmeticExpr LogicExpr FLWRExpr ConditionalExpr QuantifiedExpr TypeSwitchExpr InstanceofExpr CastExpr UnionExpr IntersectExceptExpr ConstructorExpr ValidateExpr Ebből a FLWRExpr kifejezésekkel foglalkozunk. A PathExpr tetszőleges XPath kifejezés, azaz XPath XQuery 37
FLOWR Expressions A FLOWR kifejezés a következőkből áll. iteráció (for); változók definiálása, lekötése (let); eredmény rendezése (order); predikátum alkalmazása (where); az eredmény konstrukciója (return). Egy példa (let nélkül): for $f in collection( filmek')/film where $f / év >= 2005 return <film>{ $f / cím / text()}, "rendezte" {$f / rendező / veznév / text()} </film> 38
Dokumentumok és kollekciók megadása Az XQuery számára az input a következő módon adható meg: doc() - az XML dokumentum URI-jét adjuk meg, és visszaadja a dokumentumfának a gyökerét; collection() egy olyan XML URI-jét veszi át, amely további XML fájlok URI-jét tartalmazza. Így egy XML adatbázist tudunk lekérdezni az XQuery segtségével. 39
A FLOWR kifejezések Szintaxis: for $v in e1 [ where e3 ] [ order by... ] return e2 let $v := e1 [ where e3 ] [ order by... ] return e2 A for és let részekből több is lehet: let $x:=1 let $y:=2 return $x+$y 40
for $x in expr1 return expr2 Jelentése: az $x változó felveszi az expr1 által visszaadott értékeket minden felvett értékre kiértékeljük az expr2 kifejezést az eredményeket konkatenáljuk for $x in doc("irodalom.xml")/irodalom/könyv return <eredmény> { $x } </eredmény> A lekérdezés eredmény: <eredmény> <könyv>...</könyv></eredmény> <eredmény> <könyv>...</könyv></eredmény> at kulcsszóval lehet számolni az iterációkat: for $x at $i in doc("irodalom.xml")/könyvesbolt/könyv/cím return <könyv>{$i}. {data($x)}</könyv> 41
let $x := expr1 return expr2 Jelentése: az $x változó az expr1 eredményét veszi fel kiértékeli és visszaadja az expr2 eredményét let $x := doc("irodalom.xml")/irodalom/könyv return <eredmény> { $x } </eredmény> A lekérdezés eredménye: <eredmény> <könyv>...</könyv> <könyv>...</könyv> </eredmény> 42
where where hasonló az SQL where feltételéhez. Milyen filmeket rendezett Fellini: for $f in collection(" filmek")/ film where $f/ rendező / veznév = Fellini return $f/ cím Az XPath útvonalra vonatkozó szabályok: Ha az útvonal nem létezik, akkor feltétel HAMIS! Ha az útvonal kifejezés több csúcsot eredményez, akkor a feltétel IGAZ, ha LEGALÁBB EGY csúcsra igaz. 43
Konstruktorok for $k in doc( irodalom.xml )//könyv where $k//kernév = Kálmán and $k//veznév = Mikszáth return <könyv> { $k/cím, $k/ár } </könyv> A lekérdezés eredménye: <könyv><cím>noszty fiú</cím><ár>845</ár></könyv> <könyv><cím>gavallérok</cím><ár>530</ár> </könyv> 44
Összekapcsolás (Join) Hasonlítsuk össze a Libri és az Alexandra árait! <árgép>{ for $a in doc( alexandra.xml )/könyv, $l in doc( libri.xml )/könyv where $a/@isbn = $l/@isbn return <könyv> { $a/cím } <alexandra_ár>{ $a/ár }</alexandra_ár>, <libri_ár>{ $l/ár }</libri_ár> </könyv> }</árgép> 45
Csoportosítás Nincs GROUP BY az XQuery nyelvben. Adjuk meg a PANEM kiadó inek összes művét: <eredmény>{ for $s in distinctvalues(doc( irodalom.xml )/irodalom/könyv[kiado= PANEM ]/) return <>{ $s, for $c in document( irodalom.xml )/irodalom/könyv[=$a]/cím return { $c } }</> }</eredmény> 46
Aggregálás Hány könyvet adtak ki a k évente? (A nulla ne jelenjen meg.) for $s in distinct-values(doc("http://www.libri.hu")/irodalom/könyv/), $é in distinct-values(doc("http://www.libri.hu")/irodalom/könyv/@év) let $k := doc("http://www.libri.hu")/irodalom/könyv[=$s and @év=$é] return if exists($k) then <eredmény> { $s, <év> $é </év>, <összesen> count($k) </összesen> } </eredmény> else ( ) 47
Rendezés: order by A for $v in e1 return e2 FLWOR kifejezésben az e1 sorrendje határozza meg az eredmény elemeinek sorrendjét. Ha más sorrendet akarunk megadni, akkor a következőt használhatjuk: for $v in e1 order by e3 [ascending descending] [empty greatest least] return e2 A nullértékek esetén az [empty greatest least] mondja meg, hogy a nullérték a lista végén vagy elején legyen. 48
Példa rendezésre Listázzuk ki rendezve a PANEM kiadó 2001 utáni könyveit. <eredmény>{ for $könyv in /irodalom/könyv where $könyv/@évr > 2001 and $irodalom/kiadó= PANEM order by $könyv/cím return <könyv> <cím> {$könyv/cím } </cím>, for $ in $könyv/ return <> {$ } </> </könyv> }</eredmény> 49
Néhány fontosabb függvény Az XQuery beépített függvényei segítségével bonyolultabb számításokat is el lehet végezni. Új függvények is definiálhatók. Függvény Példa count count((0,4,2)) 3 max max((0,4,2)) 4 subsequence subsequence((1,3,5,7),2,3) (3,5,7) empty exists empty((0,4,2)) false() exists((0,4,2)) true() distinct-values distinct-values((4,4,2,4)) (4,2) to (1 to 10)[. mod 2 eq 1] (1,3,5,7,9) 50
Összefoglalás Az XML adatbázisok egyre nagyobb szerepet kapnak. Kutatásuk, gyakorlati alkalmazásuk egyre fontosabb. Nem szorítják ki a relációs adatbázis-kezelőket. XML, DTD, XPath, XQuery Az XML adatbázis-kezelők rendelkeznek a szokásos adatbáziskezelői jellemzőkkel: Adatmodell (félig-strukturált) Lekérdező nyelvek Indexelés Tranzakció-kezelés Jogosultságok kezelése Ajánlott oldalak: Interaktív XML, DTD, XSLT: http://xmlzoo.net/ Interaktív XPath: http://www.mizar.dk/xpath/ Interaktív XQuery: http://demo.exist-db.org/exist/sandbox/ KÖSZÖNÖM A FIGYELMET! 51