introduction to xquery and exist
DESCRIPTION
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. - PowerPoint PPT PresentationTRANSCRIPT
Introduction to XQuery and eXist
Week 17
DSA
DSA - XQuery 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 //Distilleryreturn <div> <h2>{$d/Name}</h2> <p>{$d/WhiskyDescription}</p> </div>
DSA - XQuery 10
Executing an XQuery
eXist DB
a.xql
XQuery Engine
parameters
html
Client Browser eXist: Server
Get a.xqlparameters
servlet
fetch a.xql
render
User clickslink
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 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>
XQuery explained
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
• FLWORfor $x in sequencelet $a := expression, $b := expressionwhere conditionorder by $varreturn expression
– Returns a Sequence of nodes• Compare with SQL
select columnsfrom tableswhere conditionorder 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