XML and XQuery
5DV120 — Database System Principles Ume˚ a University Department of Computing Science Stephen J. Hegner hegner@cs.umu.se http://www.cs.umu.se/~hegner
XML and XQuery 20151114 Slide 1 of 54
XML and XQuery 5DV120 Database System Principles Ume a University - - PowerPoint PPT Presentation
XML and XQuery 5DV120 Database System Principles Ume a University Department of Computing Science Stephen J. Hegner hegner@cs.umu.se http://www.cs.umu.se/~hegner XML and XQuery 20151114 Slide 1 of 54 The XML Context XML was
XML and XQuery 20151114 Slide 1 of 54
XML and XQuery 20151114 Slide 2 of 54
XML and XQuery 20151114 Slide 3 of 54
XML and XQuery 20151114 Slide 4 of 54
<department dept_name="Biology"> <building >Watson </building > <budget >90000 </budget > </ department >
XML and XQuery 20151114 Slide 5 of 54
<department dept_name="Biology"> <building >Watson </building > <budget >90000 </budget > </ department > department dept name Biology building Watson budget 90000
XML and XQuery 20151114 Slide 6 of 54
<department dept_name="Biology"> <building >Watson </building > <budget >90000 </budget > </department > <department > <dept_name >Biology </dept_name > <building >Watson </building > <budget >90000 </budget > </ department >
<department dept_name="Biology" budget="90000"> <building >Watson </building > </ department >
XML and XQuery 20151114 Slide 7 of 54
<department dept_name="Biology"> <building >Watson </building > <budget >90000 </budget > </department > <department dept_name="Biology"> <budget >90000 </budget > <building >Watson </building > </ department >
<department dept_name="Biology" budget="90000"> <building >Watson </building > </department > <department budget="90000" dept_name="Biology"> <building >Watson </building > </ department >
XML and XQuery 20151114 Slide 8 of 54
<department dept_name="Biology"> <building >Watson </building > <budget >90000 </budget > <instructor iid="76766"> <name >Crick </name > <salary >72000 </salary > <teaches > ... </teaches > <teaches > ... </teaches > </instructor > <course cid="BIO -101"> <title >Intro. to Biology </title > <credits >4</credits > <section > ... </section > <section > ... </section > </course > <course cid="BIO -301"> ... </course > <student > <sid >98988 </sid > <name >Tanaka </name > <tot_cred >120 </tot_cred > <takes > ... </takes > <takes > ... </takes > <advisor > <iid >76766 </iid > </advisor > </student > </ department >
XML and XQuery 20151114 Slide 9 of 54
<university_flat > <!-- The university database
textbook in XML
<department dept_name="Biology"> ... </ department > ... <department dept_name=" Basketweaving "> ... </department > <instructor > ... </ instructor > ... <instructor > ... </ instructor > ... </ university_flat >
XML and XQuery 20151114 Slide 10 of 54
XML and XQuery 20151114 Slide 11 of 54
XML and XQuery 20151114 Slide 12 of 54
XML and XQuery 20151114 Slide 13 of 54
Please do not try to change the permissions on your user directory.
XML and XQuery 20151114 Slide 14 of 54
XML and XQuery 20151114 Slide 15 of 54
XML and XQuery 20151114 Slide 16 of 54
doc("/db/ university / university_flat .xml")
doc("/db/ university / university_flat .xml")/ university_flat
doc("/db/ university / university_flat .xml")/ university_flat /department
XML and XQuery 20151114 Slide 17 of 54
doc("/db/ university / university_flat .xml")/ university_flat /department doc("/db/ university / university_flat .xml")/*/ department
doc("/db/ university / university_flat .xml")/*/ department / @dept_name
However, the eXist-db query evaluator displays only well-formed XML
XML and XQuery 20151114 Slide 18 of 54
doc("/db/ university / university_flat .xml") /*/ department[ @dept_name =’Biology ’]/ building doc("/db/ university / university_flat .xml") /*/ department[ @dept_name =’Biology ’ or @dept_name=’Music ’]
doc("/db/ university/ university_flat .xml")/*/ department [ @dept_name ]/ building
doc("/db/ university/ university_flat .xml")/*/ department [budget <90000]
doc("/db/ university / university_flat .xml") /*/ department[budget <90000]/ building
XML and XQuery 20151114 Slide 19 of 54
doc("/db/ university / university_flat .xml") /*/ department[budget <’90000 ’]/ building /..
doc("/db/ university / university_flat .xml")// building
XML and XQuery 20151114 Slide 20 of 54
doc("/db/ university / university_flat .xml")/*/ department for ✩x in doc("/db/ university / university_flat .xml")/*/ department return ✩x
for $dept in doc("/db/university / university_flat .xml")/*/ department
return ✩dept
XML and XQuery 20151114 Slide 21 of 54
doc("/db/ university / university_flat .xml") /*/ department[ @dept_name =’Biology ’]/ building for $dept in doc("/db/university / university_flat .xml")/*/ department where ✩dept[ @dept_name="Biology"] return ✩dept/building
for $dept in doc("/db/ university / university_flat .xml")/*/ department where ✩dept/building=<building >Watson </building > return element foo { ✩dept/ @dept_name }
for ✩dept in doc("/db/ university / university_flat .xml") /*/ department[building=’Watson ’] return <foo > {✩ dept/ @dept_name} </foo >
XML and XQuery 20151114 Slide 22 of 54
for ✩dept in doc("/db/ university / university_flat .xml")/*/ department where ✩dept[ @dept_name="Biology"] return element foo { ✩dept/building , ✩dept/budget } for ✩dept in doc("/db/ university / university_flat .xml")/*/ department where ✩dept[ @dept_name="Biology"] return <foo > {✩ dept/building} {✩ dept/budget} </foo >
for ✩dept in doc("/db/ university / university_flat .xml")/*/ department where ✩dept[ @dept_name="Biology"] return element foo { attribute greeting {"hello"}, ✩dept/building , ✩dept/budget }
for ✩dept in doc("/db/ university / university_flat .xml")/*/ department where ✩dept[ @dept_name="Biology"] return element foo { attribute greeting {"hello"}, element Gruss {"Hallo"}, ✩dept/building , ✩dept/budget }
XML and XQuery 20151114 Slide 23 of 54
for ✩dept in doc("/db/ university / university_flat .xml")/*/ department for ✩instr in doc("/db/ university / university_flat .xml")/*/ instructor where ✩dept/ @dept_name = ✩instr/dept_name return element instr_bldg { ✩instr/name , ✩dept/building }
for ✩dept in doc("/db/ university / university_flat .xml")/*/ department for ✩instr in doc("/db/ university / university_flat .xml")/*/ instructor where ✩dept/ @dept_name = ✩instr/dept_name return <instr_bldg > {✩ instr/name} {✩ dept/building} </instr_bldg >
XML and XQuery 20151114 Slide 24 of 54
for ✩dept in doc("/db/ university/ university_flat .xml") // instructor [name=" Srinivasan"]/ dept_name return element colleagues { doc("/db/ university / university_flat .xml")// instructor [dept_name =✩ dept] }
for ✩dept in doc("/db/ university/ university_flat .xml") // instructor [name=" Srinivasan"]/ dept_name return element colleagues { doc("/db/ university / university_flat .xml")// instructor [dept_name =✩ dept] except doc("/db/ university / university_flat .xml")// instructor [name=" Srinivasan"] }
XML and XQuery 20151114 Slide 25 of 54
let ✩depts := doc("/db/ university / university_flat .xml")/ university_flat /department return element answer {attribute n_depts {count (✩ depts )} }
XML and XQuery 20151114 Slide 26 of 54
for $dept in doc("/db/ university / university_flat .xml")// department let ✩instrs := doc("/db/ university / university_flat .xml") // instructor [dept_name =✩ dept/ @dept_name]
return element dept_summary { attribute dept_name {✩ dept/ @dept_name}, attribute instr_count {count (✩ instrs )}, attribute salary_max {max (✩ instrs/salary )}, attribute salary_min {min (✩ instrs/salary )}, attribute salary_avg {avg (✩ instrs/salary )}, attribute salary_sum {sum (✩ instrs/salary )} }
XML and XQuery 20151114 Slide 27 of 54
for $bldg in doc("/db/ university / university_flat .xml")/*/ department /building where ✩bldg /../ @dept_name = "Comp.Sci." return update replace ✩bldg with <building >MIT -huset </building >
for $bldg in doc("/db/ university / university_flat .xml")/*/ department /building where ✩bldg /../ @dept_name = "Comp.Sci." return update value ✩bldg with "MIT -huset"
XML and XQuery 20151114 Slide 28 of 54
for ✩bldg in doc("/db/ university / university_flat .xml")/*/ department /building where ✩bldg /../ @dept_name = "Comp.Sci." return if (✩ bldg = element building {"Taylor"}) then update value ✩bldg with "MIT -huset" else if (✩ bldg = element building {"MIT -huset"}) then update replace ✩bldg with element building {"Taylor"} else ()
XML and XQuery 20151114 Slide 29 of 54
for ✩top in doc("/db/ university / university_flat .xml")/ university_flat return update insert <foo >bar </foo > into ✩top
for ✩cs in doc("/db/ university / university_flat .xml") /*/ department[ @dept_name ="Comp.Sci."] return update insert <foo >bar </foo > following ✩cs
for ✩cs in doc("/db/ university / university_flat .xml") /*/ department[ @dept_name ="Comp.Sci."] return update insert attribute language {"Swedish"} into ✩cs
XML and XQuery 20151114 Slide 30 of 54
for ✩foo in doc("/db/ university / university_flat .xml")/ university_flat /foo return update delete ✩foo
for ✩cs in doc("/db/ university / university_flat .xml") /*/ department[ @dept_name ="Comp.Sci."] return update delete ✩cs/@language
XML and XQuery 20151114 Slide 31 of 54
let ✩x := ((1, 2), (3, (4, 5))) return ✩x
let ✩x := (1, 2, 3, 4, 5) return if (3 = ✩x) then "yes" else "no"
let ✩x := (1, 2, 3, 4, 5) let ✩y := (5, 6, 7, 8) return (if ✩x = ✩y) then "yes" else "no"
XML and XQuery 20151114 Slide 32 of 54
let ✩x := (1, 4, 9, 16, 25) return ✩x[3]
index -of( ("a", "b", "c", "d"), "a") (: returns 1 :) index -of( ("a", "b", "c", "d"), "e") (: returns () :) index -of( ("a", "b", "c", "a"), "a") (: returns (1, 4) :) index -of( (<a>x</a>, <b>x</b>, <c>y</c>), <d>x</d>) (: returns (1, 2) :)
XML and XQuery 20151114 Slide 33 of 54
tokenize("ab1 c2drm","\s+")
XML and XQuery 20151114 Slide 34 of 54
tokenize("ab1 c2drm","\s+")
tokenize(normalize -space("ab1 c2drm"),"\s+")
XML and XQuery 20151114 Slide 35 of 54
let ✩x := tokenize(normalize -space("ab1c2drm"),"\s+") let ✩y := tokenize(normalize -space("c2drmef"),"\s+") return distinct -values ((✩x,✩y))
let ✩x := tokenize(normalize -space("ab1c2drm"),"\s+") let ✩y := tokenize(normalize -space("c2drmef"),"\s+") return distinct -values (✩x[.=✩y])
let ✩x := tokenize(normalize -space("ab1c2drm"),"\s+") let ✩y := tokenize(normalize -space("c2drmef"),"\s+") return distinct -values (✩x[not (.=✩y)])
XML and XQuery 20151114 Slide 36 of 54
let ✩x := tokenize(normalize -space("ab1c2drm"),"\s+") let ✩y := tokenize(normalize -space("c2drmef"),"\s+") return (✩x,✩y)
let ✩x := tokenize(normalize -space("ab1c2drm"),"\s+") let ✩y := tokenize(normalize -space("c2drmef"),"\s+") let ✩u := ( for ✩z in ✩y where (every ✩w in ✩x satisfies (✩z != ✩w)) return ✩z) return (✩x,✩u)
XML and XQuery 20151114 Slide 37 of 54
let ✩x := tokenize(normalize -space("ab1c2drm"),"\s+") let ✩y := tokenize(normalize -space("c2drmef"),"\s+") for ✩z in ✩x where (some ✩w in ✩y satisfies (✩z = ✩w)) return ✩z
let ✩x := tokenize(normalize -space("ab1c2drm"),"\s+") let ✩y := tokenize(normalize -space("c2drmef"),"\s+") for ✩z in ✩x where (every ✩w in ✩y satisfies (✩z != ✩w)) return ✩z
XML and XQuery 20151114 Slide 38 of 54
let ✩x := (1, 2, 3, 4, 5, 6, 7, 8) let ✩y := (3, 4, 5) for ✩z in ✩x where (every ✩w in ✩y satisfies (✩z < ✩w)) return ✩z
let ✩x := (1, 2, 3, 4, 5, 6, 7, 8) let ✩y := (3, 4, 5) for ✩z in ✩x where (some ✩w in ✩y satisfies (✩z < ✩w)) return $z
XML and XQuery 20151114 Slide 39 of 54
declare function local:square (✩x as xs:int) as xs:int {✩x*✩x};
declare function local:sqdiff (✩x as xs:int , ✩y as xs:int) as xs:int { local:square (✩x) - local:square (✩y)};
declare function local:first (✩x as xs:anyAtomicType *) xs:anyAtomicType {✩x[1]};
XML and XQuery 20151114 Slide 40 of 54
declare function local:fibonacci (✩x as xs:int) as xs:int {if (✩x<2) then ✩x else local:fibonacci ((✩x)-1) + local:fibonacci ((✩x) -2)};
local:fibonacci(✩x - 1) and local:fibonacci((✩x)-1) will.
declare function local:square (✩x) {✩x*✩x};
declare function local:increment -list (✩ list) {for ✩x in ✩list return ✩x + 1};
XML and XQuery 20151114 Slide 41 of 54
let ✩list := (2, 4, 6, 7, 9) for ✩x in ✩list return sum (✩x*✩x)
let ✩list := (2, 4, 6, 7, 9) return sum(for ✩x in ✩list return ✩x*✩x)
declare function local:square (✩x) {✩x*✩x}; let ✩list := (2, 4, 6, 7, 9) ✩list ! local:square (.)
declare function local:square (✩x) {✩x*✩x}; let ✩list := (2, 4, 6, 7, 9) return sum (✩ list ! local:square (.))
XML and XQuery 20151114 Slide 42 of 54
(: This is a comment which is split
two
element bar { let ✩x := (1, 2, 3, 4, 5, 6, 7, 8) let ✩y := (3, 4, 5) for ✩z in ✩x where (some ✩w in ✩y satisfies (✩z < ✩w)) return element foo {$z} }
XML and XQuery 20151114 Slide 43 of 54
XML and XQuery 20151114 Slide 44 of 54
<university_flat xmlns="http: // www.yale.edu" xmlns:umu="http: // www.umu.se" xmlns:hsv="http: // www.hsv.se" > <department > <!-- This department name belongs to the default namespace
<!-- XML data statements
</department > <umu:department > <!-- This department name belongs to the umu namespace
<!-- XML data statements
</ umu:department > <hsv:department > <!-- This department name belongs to the hsv namespace
<!-- XML data statements
</ hsv:department > </ university_flat >
All names beginning with xml are potentially reserved and should not be
XML and XQuery 20151114 Slide 45 of 54
<university_flat xmlns="http: // www.yale.edu" xmlns:umu="http: // www.umu.se" xmlns:hsv="http: // www.hsv.se" > <department > <!-- This department name belongs to the default namespace
<!-- XML data statements
</department > <umu:department > <!-- This department name belongs to the umu namespace
<!-- XML data statements
</ umu:department > <hsv:department > <!-- This department name belongs to the hsv namespace
<!-- XML data statements
</ hsv:department > </ university_flat >
XML and XQuery 20151114 Slide 46 of 54
XML and XQuery 20151114 Slide 47 of 54
<!DOCTYPE name [ ... declarations ... ]>
XML and XQuery 20151114 Slide 48 of 54
<!DOCTYPE university [ ... <!ELEMENT university_flat ( department*,instructor *,course*,classroom*, section*,teaches*,student*,takes*,advisor*, time_slot*,prereq *)> <!ELEMENT department (building ,budget)> <!ELEMENT building (# PCDATA)> <!ELEMENT budget (# PCDATA)> <!ATTLIST department dept_name ID #REQUIRED > <!ELEMENT instructor (name ,dept_name ,salary)> <!ATTLIST instructor iid ID #REQUIRED > <!ELEMENT name (# PCDATA)> <!ELEMENT salary (# PCDATA)> ... ]>
XML and XQuery 20151114 Slide 49 of 54
<!DOCTYPE university [ ... <!ELEMENT university_flat ( department*,instructor *,course*,classroom*, section*,teaches*,student*,takes*,advisor*, time_slot*,prereq *)> <!ELEMENT department (building ,budget)> <!ELEMENT building (# PCDATA)> <!ELEMENT budget (# PCDATA)> <!ATTLIST department dept_name ID #REQUIRED > <!ELEMENT instructor (name ,dept_name ,salary)> <!ATTLIST instructor iid ID #REQUIRED > <!ELEMENT name (# PCDATA)> <!ELEMENT salary (# PCDATA)> ... ]>
XML and XQuery 20151114 Slide 50 of 54
<!DOCTYPE university2 [ ... <!ELEMENT university_flat ( department*,instructor *,course*,classroom*, section*,teaches*,student*,takes*,advisor*, time_slot*,prereq *)> <!ELEMENT department (building ,budget)> <!ATTLIST department dept_name ID #REQUIRED > <!ELEMENT instructor (name ,salary)> <!ATTLIST instructor iid ID #REQUIRED dept_name IDREF #REQUIRED > ... ]>
XML and XQuery 20151114 Slide 51 of 54
XML and XQuery 20151114 Slide 52 of 54
XML and XQuery 20151114 Slide 53 of 54
XML and XQuery 20151114 Slide 54 of 54