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 20130422 Slide 1 of 46
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 20130422 Slide 1 of 46 The XML Context XML was
XML and XQuery 20130422 Slide 1 of 46
XML and XQuery 20130422 Slide 2 of 46
XML and XQuery 20130422 Slide 3 of 46
XML and XQuery 20130422 Slide 4 of 46
<department dept_name="Biology"> <building >Watson </building > <budget >90000 </budget > </ department >
XML and XQuery 20130422 Slide 5 of 46
<department dept_name="Biology"> <building >Watson </building > <budget >90000 </budget > </ department > department dept name Biology building Watson budget 90000
XML and XQuery 20130422 Slide 6 of 46
<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 20130422 Slide 7 of 46
<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 20130422 Slide 8 of 46
<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 20130422 Slide 9 of 46
<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 20130422 Slide 10 of 46
XML and XQuery 20130422 Slide 11 of 46
XML and XQuery 20130422 Slide 12 of 46
XML and XQuery 20130422 Slide 13 of 46
XML and XQuery 20130422 Slide 14 of 46
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 20130422 Slide 15 of 46
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 20130422 Slide 16 of 46
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 20130422 Slide 17 of 46
doc("/db/ university / university_flat .xml") /*/ department[budget <’90000 ’]/ building /..
doc("/db/ university / university_flat .xml")// building
XML and XQuery 20130422 Slide 18 of 46
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 20130422 Slide 19 of 46
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 20130422 Slide 20 of 46
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 20130422 Slide 21 of 46
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 20130422 Slide 22 of 46
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 20130422 Slide 23 of 46
let ✩depts := doc("/db/ university / university_flat .xml")/ university_flat /department return element answer {attribute n_depts {count (✩ depts )} }
XML and XQuery 20130422 Slide 24 of 46
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 20130422 Slide 25 of 46
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 20130422 Slide 26 of 46
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 20130422 Slide 27 of 46
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 20130422 Slide 28 of 46
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 20130422 Slide 29 of 46
tokenize("ab1 c2drm","\s+")
XML and XQuery 20130422 Slide 30 of 46
tokenize("ab1 c2drm","\s+")
tokenize(normalize -space("ab1 c2drm"),"\s+")
XML and XQuery 20130422 Slide 31 of 46
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 20130422 Slide 32 of 46
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 20130422 Slide 33 of 46
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 20130422 Slide 34 of 46
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 20130422 Slide 35 of 46
(: 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 20130422 Slide 36 of 46
XML and XQuery 20130422 Slide 37 of 46
<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 20130422 Slide 38 of 46
<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 20130422 Slide 39 of 46
<!DOCTYPE name [ ... declarations ... ]>
XML and XQuery 20130422 Slide 40 of 46
<!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 20130422 Slide 41 of 46
<!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 20130422 Slide 42 of 46
<!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 20130422 Slide 43 of 46
XML and XQuery 20130422 Slide 44 of 46
XML and XQuery 20130422 Slide 45 of 46
XML and XQuery 20130422 Slide 46 of 46