end of xml february 19 th, 2003. flwr (“flower”) expressions for... let... where... return......

25
End of XML February 19 th , 2003

Upload: emery-hart

Post on 30-Dec-2015

215 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

End of XML

February 19th, 2003

Page 2: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

FLWR (“Flower”) Expressions

FOR ...

LET...

WHERE...

RETURN...

FOR ...

LET...

WHERE...

RETURN...

Page 3: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

XQuery

Find 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()]/title

RETURN <answer> { $y/text() } </answer>

FOR $x IN bib/book[title/text() = “Database Theory”]/author $y IN bib/book[author/text() = $x/text()]/title

RETURN <answer> { $y/text() } </answer>

Result: <answer> abc </ answer > < answer > def </ answer > < answer > ghi </ answer >

The answer willcontain duplicates !

Page 4: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

XQuery

Same 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 duplicates

Page 5: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

SQL and XQuery Side-by-sideProduct(pid, name, maker)Company(cid, name, city)

Find all products made in Seattle

SELECT x.nameFROM Product x, Company yWHERE x.maker=y.cid and y.city=“Seattle”

SELECT x.nameFROM Product x, Company yWHERE x.maker=y.cid and y.city=“Seattle”

FOR $x in /db/Product/row $y in /db/Company/rowWHERE $x/maker/text()=$y/cid/text() and $y/city/text() = “Seattle”RETURN { $x/name }

FOR $x in /db/Product/row $y in /db/Company/rowWHERE $x/maker/text()=$y/cid/text() and $y/city/text() = “Seattle”RETURN { $x/name }

SQL XQuery

FOR $y in /db/Company/row[city/text()=“Seattle”] $x in /db/Product/row[maker/text()=$y/cid/text()]RETURN { $x/name }

FOR $y in /db/Company/row[city/text()=“Seattle”] $x in /db/Product/row[maker/text()=$y/cid/text()]RETURN { $x/name }

CoolXQuery

Page 6: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

XQuery: 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>

Page 7: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

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:

Page 8: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

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

aggregations

Page 9: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

XQuery

count = 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>

Page 10: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

XQuery

Find books whose price is larger than average:

LET $a=avg(document("bib.xml")/bib/book/price)

FOR $b in document("bib.xml")/bib/book

WHERE $b/price > $a

RETURN { $b }

LET $a=avg(document("bib.xml")/bib/book/price)

FOR $b in document("bib.xml")/bib/book

WHERE $b/price > $a

RETURN { $b }

Let’s try to write this in SQL…

Page 11: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

XQuery

Summary:

• FOR-LET-WHERE-RETURN = FLWR

FOR/LET Clauses

WHERE Clause

RETURN Clause

List of tuples

List of tuples

Instance of Xquery data model

Page 12: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

FOR v.s. LET

FOR

• Binds node variables iteration

LET

• Binds collection variables one value

Page 13: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

FOR v.s. LET

FOR $x IN document("bib.xml")/bib/book

RETURN <result> { $x } </result>

FOR $x IN document("bib.xml")/bib/book

RETURN <result> { $x } </result>

Returns: <result> <book>...</book></result> <result> <book>...</book></result> <result> <book>...</book></result> ...

LET $x IN document("bib.xml")/bib/book

RETURN <result> { $x } </result>

LET $x IN document("bib.xml")/bib/book

RETURN <result> { $x } </result>

Returns: <result> <book>...</book> <book>...</book> <book>...</book> ...</result>

Page 14: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

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> <author>...</author> <author>...</author> ...</result>

Page 15: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

Collections in XQuery

What about collections in expressions ?

• $b/price list of n prices

• $b/price * 0.7 list of n numbers

• $b/price * $b/quantity list of n x m numbers ??

• $b/price * ($b/quant1 + $b/quant2) $b/price * $b/quant1 + $b/price * $b/quant2 !!

Page 16: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

Sorting in XQuery

<publisher_list> FOR $p IN distinct(document("bib.xml")//publisher) RETURN <publisher> <name> { $p/text() } </name> , FOR $b IN document("bib.xml")//book[publisher = $p] RETURN <book> { $b/title , $b/price } </book> SORTBY(price DESCENDING) </publisher> SORTBY(name) </publisher_list>

<publisher_list> FOR $p IN distinct(document("bib.xml")//publisher) RETURN <publisher> <name> { $p/text() } </name> , FOR $b IN document("bib.xml")//book[publisher = $p] RETURN <book> { $b/title , $b/price } </book> SORTBY(price DESCENDING) </publisher> SORTBY(name) </publisher_list>

Page 17: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

If-Then-Else

FOR $h IN //holding RETURN <holding> { $h/title, IF $h/@type = "Journal" THEN $h/editor ELSE $h/author } </holding> SORTBY (title)

FOR $h IN //holding RETURN <holding> { $h/title, IF $h/@type = "Journal" THEN $h/editor ELSE $h/author } </holding> SORTBY (title)

Page 18: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

Existential Quantifiers

FOR $b IN //book

WHERE SOME $p IN $b//para SATISFIES

contains($p, "sailing")

AND contains($p, "windsurfing")

RETURN { $b/title }

FOR $b IN //book

WHERE SOME $p IN $b//para SATISFIES

contains($p, "sailing")

AND contains($p, "windsurfing")

RETURN { $b/title }

Page 19: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

Universal Quantifiers

FOR $b IN //book

WHERE EVERY $p IN $b//para SATISFIES

contains($p, "sailing")

RETURN { $b/title }

FOR $b IN //book

WHERE EVERY $p IN $b//para SATISFIES

contains($p, "sailing")

RETURN { $b/title }

Page 20: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

The Role of XML Data

• XML is designed for data exchange, not to replace relational or E/R data

• Sources of XML data:– Created manually with text editors: not really data– Generated automatically from relational data (will

discuss next)– Text files, replacing older data formats: Web server

logs, scientific data (biological, astronomical)– Stored/processed in native XML engines: very few

applications need that today

Page 21: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

XML from/to Relational Data

• XML publishing:– relational data XML

• XML storage:– XML relational data

Page 22: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

XML Publishing

• Exporting the data is easy: we do this already for HTML

• Translating XQuery SQL is hard

XML publishing systems:• Research: Experanto (IBM/DB2), SilkRoute (AT&T

Labs and UW)– XQuery SQL

• Commercial: SQL Server, Oracle– only Xpath SQL and with restrictions

Page 23: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

XML Publishing

How do we choose the output structure ?

• Determined by agreement

• Or dictated by committees– XML dialects (called applications) = DTDs

• XML Data is often nested, irregular, etc

• No normal forms for XML

Page 24: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

XML Storage

• Most often the XML data is small– E.g. a SOAP message– Parsed directly into the application (DOM API)

• Sometimes XML data is large– need to store/process it in a database

• The XML storage problem:– How do we choose the schema of the database ?

Page 25: End of XML February 19 th, 2003. FLWR (“Flower”) Expressions FOR... LET... WHERE... RETURN... FOR... LET... WHERE... RETURN

XML Storage

Two solutions:

• Schema derived from DTD

• Storing XML as a graph: “Edge relation”