340 likes | 474 Views
XML Spletne tehnologije. Primerjava relacijskih in XML podatkov. { row : { name : “John”, phone : 3634 }, row : { name : “Sue”, phone : 6343 }, row : { name : “Dick”, phone : 6363 } }. row. row. row. phone. phone. phone. name. name. name. “Sue”. “John”. 3634. 6343.
E N D
XML Spletne tehnologije
Primerjava relacijskih in XML podatkov { row: { name: “John”, phone: 3634 }, row: { name: “Sue”, phone: 6343 }, row: { name: “Dick”, phone: 6363 } } row row row phone phone phone name name name “Sue” “John” 3634 6343 “Dick” 6363 Relacija … vXML
Primerjava relacijskih in XML podatkov • Relacija je v osnovi drevo, ki ima: • Neomejeno število vozlišč na prvem nivoju(poljubno število vrstic) • Vozlišča prvega nivoja imajo natančno določeno stopnjo oz. število potomcev (natančno določeno število polj) • XML podatkovna struktura je v osnovi poljubno drevo, ki ima: • Neomejeno število vozlišč na vseh nivojih • Poljubno število nivojev • Spremenljivo število potomcev posameznih vozlišč • Spremenljivo dolžino poti
Poizvedovalni jezik za XML • Mora biti visoko nivojski “SQL za XML” • Mora biti skladen zXSchema: • Delovati mora tudi v primerih, ko informacij o shemi ni. • Podpirati mora enostavne in kompleksne (gnezdene) podatkovne tipe. • Podpirati mora univerzalne in eksistencialne kvantifikatorje ter agregacijo. • Omogočati mora izvajanje operacij nad sekvencami in hierarhičnimi strukturami dokumentov. • Omogočati mora pretvorbo in izdelavo XML struktur.
XQuery • Vplivi: XML-QL, Lorel, Quilt, YATL • Prebere sekvenco XML fragmentov ali pa atomarne vrednosti in vrne sekvenco XML fragmentov ali atomarne vrednost. • Vhodi/izhod so objekti, ki so definirani z XML-Query podatkovnim modelom in ne z nizi iz XML sintakse.
XQuery: Pregled • Izrazi za pot (Path expressions) • Konstruktorji (Element constructors) • FLWOR izrazi (For-Let-Where-Order-Returnexpressions): • FOR, LET, WHERE, ORDER, RETURN stavek • Vključujejo tudi nekatere druge izraze, kot so na primer pogojni izrazi, izpisi, kvantifikatorji itd. • Generalizacija SELECT, FROM, HAVING, WHERE stavkov iz SQL • Kontekstno odvisni izrazi: • Element (trenutno vozlišče), • Pozicija (v nizu, ki ga obdelujemo), • Velikost (niza, ki ga obdelujemo), • Vključujejo tudi imenske prostore , spremenljivke, funkcije, datume itd.
XQuery: Izraz za pot (Path Expressions) • Primer: • Bib/paper • Bib/book/publisher • Bib/paper/author/lastname • V XML dokumentu je vrednost poti pmnožica objektov, ki so dostopni po tej poti
Bib &o1 paper paper book references &o12 &o24 &o29 references references author page author year author title http title title publisher author author author &o43 &25 &o44 &o45 &o46 &o52 &96 1997 &o51 &o50 &o49 &o47 &o48 first last firstname lastname lastname firstname &o70 &o71 &243 &206 “Serge” “Abiteboul” “Victor” 122 133 “Vianu” XQuery: Primer poti Doc = Bib/paper = <&o12,&o29> Bib/book/publisher = <&o51> Bib/paper/author/lastname= <&o71,&206> Zaporedje elementov je pomembno
XQuery: Konstruktorji (Element Construction) • Z XQuery izrazi lahko sestavimo nove vrednosti in strukture. • Primer: če pogledamo poti, ki smo jih definirali na prejšnjem diapozitivu: • Vsaka pot opredeljuje nov niz elementov • Tvorimo lahko nove poljubne strukture
XQuery: FLWOR izrazi • FOR-LET-WHERE-ORDERBY-RETURN = FLWOR FOR/LET stavek Seznam n-teric WHERE stavek Seznam n-teric ORDERBY/RETURN stavek Instanca (primerek) XQuery podatkovnega modela
XQuery: FOR vs. LET… • FOR $x IN list-expr • Poveže $x s posameznimi vrednostmi v seznamu. • LET $x = list-expr • Poveže $x s celotnim seznamom • Uporaben je za gnezdenje izrazov in agregacijo
XQuery: FOR vs. LET… • FOR obdela vsak element vhodnega zaporedja in rezultate združi v izhodno zaporedje • V običajnih primerih obstaja en izhodni element za vsak vhodni… • Primer: • Vhod (vhodno zaporedje): 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 • Izhod (izhodno zaporedje): 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 for $n in (1 to 10) return $n * $n
XQuery: FOR vs. LET… • Z XQuery LET stavkom deklariramo spremenljivko in ji priredimo vrednost • Primer: • Vsako pojavitev reference na spremenljivko zamenjamo z vrednostjo spremenljivke • Rezultat je ekvivalenten spodnjemu izrazu: let $maxCredit:= 3000 let $overdrawnCustomers := //customer[overdraft > $maxCredit] return count($overdrawnCustomers) count(//customer[overdraft > 3000])
XQuery: FOR vs.LET Izhod: <result> <book>...</book></result> <result> <book>...</book></result> <result> <book>...</book></result> ... FOR$x IN document("bib.xml")/bib/book RETURN <result> $x </result> FOR vrne seznam kjer je $x združen z vsakim elementom book znotraj datoteke bib.xml Izhod: LET$x IN document("bib.xml")/bib/book RETURN <result> $x </result> <result> <book>...</book> <book>...</book> <book>...</book> ... </result> LET vrne rezultat kjer je $x združen s celotnim seznamom elementov book iz datoteke bib.xml.
XQuery: Primer (1) • Poišči vse naslove knjig, ki so bile izdane po letu 1995: Izhod: FOR $x IN document("bib.xml")/bib/book WHERE $x/year > 1995 RETURN $x/title <title> abc</title> <title> def </title> <title> ghi </title>
XQuery: Primer (2) … • Za vsakega avtorja knjige, ki jo je izdala založba Morgan Kaufmann, izpišite vse njegove izdane knjige FOR $a IN distinct(document("bib.xml") /bib/book[publisher=“Morgan Kaufmann”]/author) RETURN <result> $a, FOR $t IN /bib/book[author=$a]/title RETURN $t </result> distinctje funkcija, ki izloči duplikate (vhodni podatki se najprej pretvorijo v atomarne vrednosti, nato se izločijo duplikati)
XQuery: Primer (2) Izhod: <result> <author>Jones</author> <title> abc </title> <title> def </title> </result> <result> <author> Smith </author> <title> ghi </title> </result> Ugnezdena struktura elementov rezultata je določena z ugnezdeno strukturo poizvedbe FOR $t IN /bib/book[author=$a]/title
XQuery: WHERE • WHERE stavek opravlja podobno vlogo kot v SQL • določa selekcijski pogoj (filter) • je opcijski • pojavi se lahko samo enkrat in sicer takoj po FOR ali LET stavku for $genre in //genre/choice for $video in //video for $actorRefs in $video/actorRef for $actor in //actor where $video/genre = $genre and $actor/@id = $actorRefs return concat($genre, ": ", $actor)
XQuery: Primer (3) • Izpišite vse založnike, ki so izdali več kot 100 knjig: <big_publishers> FOR $p IN distinct(document("bib.xml")//publisher) LET $b := document("bib.xml")/book[publisher = $p] WHERE count($b) > 100 RETURN $p </big_publishers> Za vsakega založnika p V b shrani seznam objavljenih knjig p-ja Preštej število knjig v bin vrni p, če je število knjig > 100 countje funkcija, ki vrne število elementov
XQuery: Primer (4) • Izpišite vse knjige, ki imajo višjo ceno od povprečne: LET $a=avg(document("bib.xml")/bib/book/price) FOR $b in document("bib.xml")/bib/book WHERE $b/price > $a RETURN $b
XQuery: Zbirke (Collections) … • Urejena zbirka • /bib/book/author • Neurejena zbirka • distinct(/bib/book/author) LET $a = /bib/book $aje stavek, ki iterira skozi vse knjige v zbirki tudi zbirka (več avtorjev…) $b/author Izhod: <result> <author>...</author> <author>...</author> <author>...</author> ... </result> RETURN <result> $b/author </result> Stavek vrne eno zbirko!
XQuery: Zbirke (Collections) … • Zbirke v izrazih: Izraz je veljaven samo v primeru, da imata oba niza največ en element Atomatizacija seznam n cen $b/price seznam n številk ?? $b/price* 0.7 seznam n x m številk ?? $b/price* $b/quantity /book1/authoreq“Kennedy“ Primerjava vrednosti Splošna primerjava /book1/author= “Kennedy“
XQuery: ORDERBY • Orderbystavek uredi rezultate poizvedbe • Primer: Video posnetke uredi oz. izpiši naraščajoče glede ne leto nastanka, znotraj posameznega leta pa padajoče glede na oceno gledalcev. FOR$x in //video ORDERBY$x/year ascending, number($x/user-rating) descending RETURN $x/title
XQuery: RETURN • Vsak XQuery FLWOR izraz vsebuje return stavek • Return stoji vedno na koncu izraza • S stavkom določimo strukturo oz. zgradbo rezultata (Kaj vse bo vključeno v rezultat?) Izpišite vse igralce, ki igrajo v komedijah. FOR$vin //video[genre="comedy"] RETURN //actor[@id = $v/actorRef]
XQuery: Urejanje <publisher_list> FOR $p IN distinct(document("bib.xml")//publisher) ORDERBY $p RETURN <publisher> <name> $p/text() </name>, FOR $b IN document("bib.xml")//book[publisher = $p] ORDERBY $b/priceDESCENDING RETURN <book> $b/title, $b/price </book> </publisher> </publisher_list>
XQuery: If-Then-Else FOR $h IN //holding ORDERBY $h/title RETURN <holding> $h/title, IF $h/@type = "Journal" THEN $h/editor ELSE $h/author </holding>
XQuery: Eksistenčni kvantifikator… • Eksistenčni kvantifikator je XQuery SOME operator. • Ali podanemu pogoju zadošča vsaj eno vozlišče znotraj množice vozlišč? • Ali obstaja vsaj ena cena, ki je višja od 1000? some $price in document("data/items.xml")//reserve_price satisfies $price > 1000 • Vrni vrednost, če obstaja vsaj ena cena, ki je višja od 1000.
XQuery: Eksistenčni kvantifikator FOR $b IN //book WHERE SOME$p IN $b//para SATISFIES contains($p, "sailing") AND contains($p, "windsurfing") RETURN $b/title
XQuery: Univerzalni kvantifikator • Univerzalni kvantifikator je XQuery EVERY operator • Ali podanemu pogoju zadoščajo vsa vozlišča znotraj podane množice vozlišč? FOR $b IN //book WHERE EVERY$p IN $b//para SATISFIES contains($p, "sailing") RETURN $b/title
XQuery: Razno • Before in After: • Urejanje vhodnih podatkov. • Filter: • Omejevanje izhodnega drevesa. • Rekurzivne funkcije, • Imenski prostori (Namespaces) • Reference, povezave … • …
XML-Query Podatkovni model • Opis XML podatkov v obliki drevesa Node::= DocNode| ElemNode|ValueNode| AttrNode| NSNode|PINode|CommentNode|InfoItemNode| RefNode http://www.w3.org/TR/query-datamodel/2/2001
XML-Query Podatkovni model • Elementarno vozlišče (poenostavljena definicja) elemNode : (QNameValue, {AttrNode },[ ElemNode | ValueNode])ElemNode Daj mi značko, nabor atributov, seznam elementov/vrednosti in jaz ti bom vrnil element QNameValueje naziv značke
XML-Query Podatkovni model <bookprice = “55” currency = “USD”> <title> Foundations … </title> <author> Abiteboul </author> <author> Hull </author> <author> Vianu </author> <year> 1995 </year> </book> book1= elemNode(book, {price2, currency3}, [title4, author5, author6, author7, year8]) price2 = attrNode(…) /* next */currency3 = attrNode(…)title4 = elemNode(title, string9)…
Dodatno gradivo: • Dodatne informacije so dostopne na spodnjih povezavah: • http://www.w3.org/TR/xquery • Specifikacije • http://www.w3.org/XML/Query#products • Implementacije • http://xml.coverpages.org/xmlQuery.html • XQuery (povzetki in povezave) • http://www.xmlstarterkit.com/ • Software AG’s XML server s podporo XQuery • http://www.xquery.com • Tutoriali • http://www.saxonica.com • Odprtokodna XQuery implementacija