1 / 27

Introduction to XQuery and eXist

Introduction to XQuery and eXist. Week 17 DSA. XPath. Hierarchical file systems have been navigable with path expression since Unix /abc/cde/../../efg i.e. ? Problem Only child, parent and root can be accessed in one step Only one node addressable. XPath.

hector
Download Presentation

Introduction to XQuery and eXist

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introduction to XQuery and eXist Week 17 DSA

  2. XPath . • Hierarchical file systems have been navigable with path expression since Unix • /abc/cde/../../efg i.e. ? • Problem • Only child, parent and root can be accessed in one step • Only one node addressable DSA - XQuery

  3. XPath .. • Solution – extend the path language • select multiple items • /abc/cde/../../efg/* • //x - all x nodes anywhere in the tree • select a subset of items by appending predicate (filter) • //x[@size>1000] • functions in predicate • //x[ends-with(@name,’.jpeg’)] • multiple filters • //x[@owner=‘fred’]//images[ends-with(@name,’.jpeg’)] • select items by position • /abc[2] short for /abc[position() = 2] DSA - XQuery

  4. XPath … • Core data type in XPath 2.0 is a sequence of items • Items are atomic values or XML elements • Sequence is flat • deep-equal('fred',('fred')) is true • deep-equal((‘fred’, ‘fred’), (‘fred’)) is false • deep-equal(('fred', ('bill','joe')),('fred', 'bill','joe')) is true • () is the empty sequence • count((‘fred’,() )) is 1 • Equality between sequences defined as non-empty intersection • (‘fred’,’joe’) = ‘joe’ is true • (‘fred’,’joe’) = (‘joe’,’bill’) is true • (‘fred’,’joe’) eq ‘joe’ is false DSA - XQuery

  5. XQuery . • Problem • Need to be able to construct a tree as well as select nodes in an existing tree • Need for more complex searches a la SQL • Solution 1 – XML addition to existing languages • PHP + Simple XML • XML structures not compatible with language • Solution 2 – XSLT • Push (declarative, pattern-matching) or pull processing • XML- based • Two versions • 1.0 most common, in Browsers, Xalan • 2.0 e.g. Saxon • Solution 2 – XQuery • Functional • Pull only • Non XML • XQuery 1.0 and XSLT 2.0 share the same XPath 2.0 data model and function library DSA - XQuery

  6. eXist Native XML Database • Open source • Wolfgang Meier is the chief architect • Written in Java • Deployable in different ways • Embedded in a Java application • Part of a Cocoon pipeline • As web application in Apache/Tomcat • With embedded Jetty HTTPserver (as on stocks) • Multiple Interfaces • REST – to Java servlet • SOAP • XML:RPC DSA - XQuery

  7. Native XML database • Well-formed XML documents can be added to the database • They are stored in an efficient, searchable B+ tree structure • Documents (files) are organised into collections in a filestore • Non-XML resources (XQuery, CSS, JPEG ..), etc can be stored as binary DSA - XQuery

  8. Distillery Example • My Sample Distillery data • Use the eXist demo server • Login as guest/guest • Create a folder • Upload XML files • Test queries in the Sandbox • Create XQuery scripts in a text editor • Upload XQuery script • Execute DSA - XQuery

  9. Simple Xquery – list1.xql for $d in //Distillery return <div> <h2>{$d/Name}</h2> <p>{$d/WhiskyDescription}</p> </div> DSA - XQuery

  10. Executing an XQuery eXist: Server Client Browser User clicks link Get a.xql parameters servlet fetch a.xql parameters a.xql eXist DB html XQuery Engine render DSA - XQuery

  11. Simple XQuery – list2.xql xquery version "1.0"; <table border='2'> <tr> <th>Name</th><th>Address</th> </tr> {for $w in //Distillery return <tr> <td>{data($w/Name)}</td> <td>{data($w/Address)}</td> </tr> } </table> DSA - XQuery

  12. XQuery explained xquery version "1.0"; <table border='2'> <tr> <th>Name</th><th>Address</th> </tr> { for $w in //Distillery return <tr> <td>{data($w/Name)}</td> <td>{data($w/Address)}</td> </tr> } </table> DSA - XQuery

  13. XQuery .. • Nesting XML and XQuery • XML to XQuery • { … } • XQuery to XML <tag> … </tag> • Must be well-formed XML – single root - <div> and <span> handy • Constructed structures • XML element <Position latitude=’51’ longitude=‘-2.5’ /> or element Position { attribute latitude ’51’, attribute longitude ‘2.5’ } • Sequence • ('fred', <tag a='4'/>, 5) DSA - XQuery

  14. XQuery .. • control constructs are expressions and hence composable • if (cond) then exp else exp • for ..let.. where .. order by .. return – FLWOR • function call • variable value ($d) • ‘Atomisation’ sometimes needed in output • Element to characters • $d/Name • <Name>Glenfiddich</Name> • data($d/Name) • Glenfiddich DSA - XQuery

  15. XQuery … • Functions and Modules • Typed arguments and return • Recursion • XPath functions • eXist functions • Database management • HTTP interface • .. • Functional language • let $x := 5 binds the value 5 to the variable $x • Can’t write iterative code – what’s the output? • let $y := 1 • return • for $x in (1 to 5) • let $y := $y * 2 • return $y DSA - XQuery

  16. XQuery FLWOR expression • FLWOR for $x in sequence let $a := expression, $b := expression where condition order by $var return expression • Returns a Sequence of nodes • Compare with SQL select columns from tables where condition order by • Returns a Relation (table) DSA - XQuery

  17. Search Query • Enter a name or part name • Match against the Distillery name • List the matches DSA - XQuery

  18. List 3 let $name := request:request-parameter("name","") return <table border='2'> <tr><th>Name</th><th>Address</th></tr> {for $d in //Distillery[contains(Name,$name)] return <tr><td>{data($d/Name)}</td> <td>{data($d/Address)}</td> </tr> } </table> DSA - XQuery

  19. An XQuery sticky form • The script here has several shifts between XML to XQuery • Whole interface in one script • Equivalent to PHP + MySQL. DSA - XQuery

  20. let $name := request:request-parameter("name","") return <html> <form method="get" action=""> <label>Enter Name or part of Name</label> <input type="text" name="name" size="10"/> </form> <table border='2'> <tr><th>Name</th><th>Address</th></tr> { for $d in //Distillery[contains(Name,$name)] return <tr> <td>{data($d/Name)}</td> <td>{data($d/Address)}</td> </tr> } </table> </html> list4.xql DSA - XQuery

  21. Generate a kml overlay • Output is kml • Need to specify the mime type so that the browser will link to Google Earth (if set up correctly) • Or create a Google Map link: • http://maps.google.com/maps?q=http://demo.exist-db.org/rest//db/chriswallace/whisky/distkml.xql DSA - XQuery

  22. Kml declare option exist:serialize "method=xhtml indent=yes media-type=application/vnd.google-earth.kml+xml"; <Document> <name>Distilleries of Scotland 2</name> {for $d in //Distillery return <Placemark> <name>{data($d/Name)}</name> <description>{data($d/WhiskyDescription)}</description> <Point> <coordinates> {data($d/Position/@longitude)}, {data($d/Position/@latitude)},0 </coordinates> </Point> </Placemark> } </Document> distkml.xql DSA - XQuery

  23. Tools for XQuery on eXist • Use a text editor (Notepad, PFE32 or Dreamweaver) • Use the admin interface with guest/guest login to create a directory and load all the files – including the XQuery files • To run a script, just click on the script in the directory listing – this will run the script (but with no parameters – you can add these in the Browser • This will show you the URL to execute it – you can then use this to link from any HTML outside the eXist database. • Use the sandbox to test small bits of XQuery and XPath DSA - XQuery

  24. eXist on your own machine • Simple install from the exist-db site • Use the Java client to • load files • move, copy, rename files • edit files in situ (but no Save-as) • execute queries • backup DSA - XQuery

  25. Example 2 – see blog • Periodic Table of Visualizations • This collection of diagram types is presented very cleverly but its not very accessible. • I copied the XHTML for the page and then loaded it into an eXist database – it is not well-formed XML but its good enough to upload. • The links from name to example diagram are embedded in Javascript. • Here is the result DSA - XQuery

  26. Exercise • Some XPath examples to do in the tutorial • Then continue with last week’s workshop, developing your own XML model for your chosen subject area. • Next week we look at XSLT DSA - XQuery

  27. Exercise • Some XPath examples to do in the tutorial • Then continue with last week’s workshop, developing your own XML model for your chosen subject area. • I will talk to each of you to see what subjet you have chosen. • Next week we look at XSLT DSA - XQuery

More Related