Xpath to XQueryOther StuffXpath: WildcardXpath: Attribute NodesXpath: PredicatesXpath: More PredicatesSlide 7Xpath: SummaryComments on XPath?XQueryFLWR (“Flower”) ExpressionsSlide 12Slide 13Slide 14XQuery: NestingSlide 16Slide 17Slide 18Slide 19Slide 20FOR v.s. LETSlide 22Collections in XQuerySlide 24Sorting in XQueryIf-Then-ElseExistential QuantifiersUniversal QuantifiersOther Stuff in XQueryXpath to XQueryFebruary 23rd, 2004Other Stuf•HW 3 is out.•Instructions for Phase 3 are out.•Today: finish Xpath, start and finish Xquery.•From Wednesday: dbms internals.Xpath: WildcardResult: <first-name> Rick </first-name> <last-name> Hull </last-name>* Matches any element//author/*//author/*Xpath: Attribute NodesResult: “55”@price means that price is an attribute/bib/book/@price/bib/book/@priceXpath: PredicatesResult: <author> <first-name> Rick </first-name> <last-name> Hull </last-name> </author>/bib/book/author[firstname]/bib/book/author[firstname]Xpath: More PredicatesResult: <lastname> … </lastname> <lastname> … </lastname> /bib/book/author[firstname][address[//zip][city]]/lastname/bib/book/author[firstname][address[//zip][city]]/lastnameXpath: More Predicates/bib/book[@price < “60”]/bib/book[@price < “60”]/bib/book[author/@age < “25”]/bib/book[author/@age < “25”]/bib/book[author/text()]/bib/book[author/text()]Xpath: Summarybib matches a bib element* matches any element/ matches the root element/bib matches a bib element under rootbib/paper matches a paper in bibbib//paper matches a paper in bib, at any depth//paper matches a paper at any depthpaper|book matches a paper or a book@pricematches a price attributebib/book/@price matches price attribute in book, in bibbib/book/[@price<“55”]/author/lastname matches…Comments on XPath?•What’s good about it?•What can’t it do that you want it to do?•How does it compare, say, to SQL?XQuery•Based on Quilt, which is based on XML-QL•Uses XPath to express more complex queriesFLWR (“Flower”) ExpressionsFOR ... LET... WHERE...RETURN...FOR ... LET... WHERE...RETURN...XQueryFind all book titles published after 1995:FOR $x IN document("bib.xml")/bib/bookWHERE $x/year > 1995RETURN { $x/title }FOR $x IN document("bib.xml")/bib/bookWHERE $x/year > 1995RETURN { $x/title }Result: <title> abc </title> <title> def </title> <title> ghi </title>XQueryFind book titles by the coauthors of “Database Theory”:FOR $x IN bib/book[title/text() = “Database Theory”]/author $y IN bib/book[author/text() = $x/text()]/titleRETURN <answer> { $y/text() } </answer>FOR $x IN bib/book[title/text() = “Database Theory”]/author $y IN bib/book[author/text() = $x/text()]/titleRETURN <answer> { $y/text() } </answer>Result: <answer> abc </ answer > < answer > def </ answer > < answer > ghi </ answer >The answer willcontain duplicates !XQuerySame as before, but eliminate duplicates:FOR $x IN bib/book[title/text() = “Database Theory”]/author $y IN distinct(bib/book[author/text() = $x/text()]/title)RETURN <answer> { $y/text() } </answer>FOR $x IN bib/book[title/text() = “Database Theory”]/author $y IN distinct(bib/book[author/text() = $x/text()]/title)RETURN <answer> { $y/text() } </answer>Result: <answer> abc </ answer > < answer > def </ answer > < answer > ghi </ answer >distinct = a function that eliminates duplicatesXQuery: NestingFor each author of a book by Morgan Kaufmann, list all books she published: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>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>XQuery<result> <author>Jones</author> <title> abc </title> <title> def </title> </result> <result> <author> Smith </author> <title> ghi </title> </result><result> <author>Jones</author> <title> abc </title> <title> def </title> </result> <result> <author> Smith </author> <title> ghi </title> </result>Result:XQuery•FOR $x in expr -- binds $x to each value in the list expr•LET $x = expr -- binds $x to the entire list expr–Useful for common subexpressions and for aggregationsXQuerycount = a (aggregate) function that returns the number of elms<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><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>XQueryFind books whose price is larger than average:LET $a=avg(document("bib.xml")/bib/book/price)FOR $b in document("bib.xml")/bib/bookWHERE $b/price > $aRETURN { $b }LET $a=avg(document("bib.xml")/bib/book/price)FOR $b in document("bib.xml")/bib/bookWHERE $b/price > $aRETURN { $b }Let’s try to write this in SQL…XQuerySummary:•FOR-LET-WHERE-RETURN = FLWRFOR/LET ClausesWHERE ClauseRETURN ClauseList of tuplesList of tuplesInstance of Xquery data modelFOR v.s. LETFOR•Binds node variables iterationLET•Binds collection variables one valueFOR v.s. LETFOR $x IN document("bib.xml")/bib/bookRETURN <result> { $x } </result>FOR $x IN document("bib.xml")/bib/bookRETURN <result> { $x } </result>Returns: <result> <book>...</book></result> <result> <book>...</book></result> <result> <book>...</book></result> ...LET $x IN document("bib.xml")/bib/bookRETURN <result> { $x } </result>LET $x IN document("bib.xml")/bib/bookRETURN <result> { $x } </result>Returns: <result> <book>...</book> <book>...</book> <book>...</book> ...</result>Collections in XQuery•Ordered and unordered collections–/bib/book/author = an ordered collection–Distinct(/bib/book/author) = an unordered collection•LET $a = /bib/book $a is a collection•$b/author a collection (several authors...)RETURN <result> { $b/author } </result>RETURN <result> { $b/author } </result>Returns: <result> <author>...</author>
View Full Document