All pastes #972955 Raw Edit

Unbenannt

public text v1 · immutable
·published 2008-04-05 20:52 UTC
rendered paste body
Ein paar Kommentare zur Relevanz der einzelnen Vorlesungskapitel (entspricht weitgehend den Infos aus der letzten Vorlesung, s. Table of Contents: 
http://www.inf.uni-konstanz.de/dbis/teaching/ws0708/xml/Inhalt.pdf
). Wichtig: die Zusammenfassung dient nur als Richtlinie; v.a. solltet Ihr Euch auch die Übungen nochmal ansehen:

1.1. irrelevant
2.2-2.4. die wichtigsten Konzepte sollten bewusst sein, Details irrel.
3.5-3.7... ebenso: kein Detailwissen verlangt
4.8-4.11: relevant
5.12-5.13: irrelevant
5.14: relevant
5.15: XPath Accelerator & Staircase Join relevant
5.16-5.17: Konzepte sollten verstanden werden, techn. Details irrelevant
5.18: irrelevant (..happy? ;)
5.19-6.23: once more: Konzepte, keine Implementierungsdetails Native XML Processing/Info Retrieval/XQuery Fulltext: kein Detailfragen



Übungsklausur:


A

1) /descend::titel[following-sibling::mitarbeiter/assistent]

2) /descendant::titel[count(following-sibling::mitarbeiter/assistent) >= 2]

3) /descendant::node()/vorlesung[mitarbeiter/*/@id="seifert"]/preceding::node()/vorlesung

4) /descendant::vorlesung[last()]

5) /descendant::dozent[@id="scholl"]/parent::*/parent::vorlesung

	
Welche Vorlesungen werden vom Dozent mi der id "scholl" betreut

/descendant::vorlesung[mitarbeiter/dozent/@id="scholl"]



B

1)

pre	size	kind	prop

0	9	element	a
1	3	element	b
2	2	element	c
3	0	element	d
4	0	element	e
5	4	element	f
6	0	element	g
7	2	element	h
8	0	element	i
9	0	element	j


2)

ancestor: pre(v') < pre(v) & size(v') > size(v) & pre(v) - pre(v') >= size(v')

descendant: pre(v') > pre(v) & size(v') < size(v) & pre(v') - pre(v) <= size(v)

following: pre(v') > pre(v) & pre(v') - pre(v)  size(v')

preceding: pre(v') < pre(v) & size(v')


D

1)

Pruning:

Beim Pruning werden diejenigen Kontextknoten ignoriert, die in der Region anderer Kontextknoten liegen. 
zB wenn bei (c1,c2)/descendant::node() c2 auch descendant von c1 ist, so reicht die Berechnung von c1/descendant::node() und man spart sich redundante Ergebnismengen

Partitioning:

Partioning teilt die den Bereich so ein das nur die für die Anfrage relevanten Knoten erfasst werden. zB werden bei der Anfrage (c1,c2)/descendant::node() alle Knoten entfernt die einen kleinere pre-Wert haben wie c1, solange bis c2 erreicht ist.

Skipping:

Skipping überspringt Knoten, die aufgrund ihrer pre/post Werte nicht im Bereich der Knotextknoten liegen können.
zB: Bei (c1,c2)/descendant::node() kann im bereich zwischen pre(c2) - pre(c1), jeder Knoten übersprungen werden für den gilt c1.post < node.post.

 
1)

Beim Pruning werden diejenigen Kontextknoten c2 ignoriert, die vom Bereich eines anderen Kontextknoten c1 abgedeckt werden.
Da die aber jeder Knoten seine eigenen Kinder besitzt, können sich diese Bereiche nie überlappen, somit funktioniert Puning hier nicht.

Beim Skipping werden diejenigen Kn 



Übung 3 XPath

1) Print all countries which are stored in the XML document

	descendant::country/@name


2) How many countries can be found?

	count(descendant::country)

	231


3) Print the names of all Chinese cities

	descendant::country[./@name = "China"]/descendant-or-self::city/name/text()


4) How many people live in Bangladesh?

	descendant::country[./@name = Bangladesh]/@population


5) In which countries live more than 10 million people?

	descendant::country[./@population > 10000000]/@name


6) Find the first 3 French cities which are stored in the document

	descendant::country[./@name = "France"]/descendant-or-self::city[position() <= 3]/name/text()


7) Print all countries in which more than 60% of the population speak German

	descendant::ethnicgroups[. = "German"][./@percentage > 60]/ancestor::country/@name


8) Print the average number of inhabitants of all cities in the document

	sum(descendant::city/population) div count(descendant::city)


9) Print the names of all cities that have more than 20 characters

	descendant::city/name[string-length(.) > 20]


10) How many tag names in the document have less than 3 characters?

	count(descendant-or-self::*[string-length(name()) < 3])



Übung 4 XQuery


Exercise 1:

1) <A>100</A> + <B><C>1</C><C>1</C></B>

XQuery wertet "<B><C>1</C><C>1</C></B>" als rhs und "<A>100</A>" als lhs.
Deswegen wird "<B><C>1</C><C>1</C></B>" als 11 und "<A>100</A>" als 100 interpretiert.
lhs+rhs = 111


2) (1, 2) > (3, 2, 1)

true, da XQuery immer dann true zurück gibt, wenn der Vergleich zwischen zwei Objekte der verglichenen Sequenzen true ergibt.
Hier: 2 > 1 -> true 


3) ( ) != 1

Es existiert kein Element für das gilt rhs = lhs -> false


4) <a><a><a/></a></a>/descendant-or-self::a

XQuery geht in documentorder durch. Listet zuerst die descendandts und dann self


5) <xml><findme/></xml>[//findme]

Im Prädikat fehlt der Zugriff auf die document node, deswegen kommt ein Fehler.
Richt: <xml><findme/></xml>[.//findme]


Exercise 2:


1) Which countries can be found that have Jewish and Russian ethnic groups?


for $j in descendant::ethnicgroups
where $j = 'Russian' and $j/parent::country/@id =
(for $i in descendant::ethnicgroups
where $i = 'Jewish'
return $i/parent::country/@id)
return $j/parent::country/@name

oder

for $y in descendant::country
let $x := $y/ethnicgroups
where $x = "Russian" and $x = "Jewish"
return $y/@name


2) Create an alphabetically sorted list of all country names

for $y in descendant::country/@name
order by $y 
return $y


3) Print the names and founding dates (@established attribute) of all organizations that have more than 180 members

for $y in descendant::organization
where count($y/member) > 180
return $y/@name | $y/@established

oder

for $y in descendant::organization
where count($y/member) > 180
return ($y/@name , $y/@established)


4) Create a list of all countries with the following syntax (whitespaces don’t matter):
<results>
<result name="Albania"/><result name="Andorra"/>...
<results>

<results>{
for $y in descendant::country
return <result>{$y/@name}</result>
}</results>


5) Guess you know that already, but... What’s the name of the country with the largest
population?

for $i in descendant::country
where $i/@population = max(descendant::country/@population)
return $i/@name

oder für bessere Performance:

let $y := max(descendant::country/@population)
for $i in descendant::country
where $i/@population = $y 
return $i/@name


Assignment 9


Exercise 1: Starcase Join

The Pre/Post Encoding and the Staircase Join allow efficient access to the four major
XPath axes. Some additional work has to be done when other axes are evaluated:


· explain why the Pruning algorithm can’t be applied to the child axis




· analyze how the following-sibling axis can be evaluated without the Parent
value


Exercise 3:

· /child::jamie/child::jerry/child::jeremie[text() = "joe”]/../..

	/descendant::jeremie[./text() = "joe"]

· /descendant-or-self::node()/child::james

	/descendant::james

· /child::node()/parent::node()

	/self::node()

· /parent::node()/ancestor-or-self::node()

	/ancestor::node()

· /descendant::jason/preceding::jasper

	/descendant::jasper

· /child::jim/preceding-sibling::jack

	/child::jack


Assignment 10



Exercise 1:

The Pre/Post encoding was initially developed to be stored in a relational database. XPath
queries can be rewritten into SQL queries. Please write down SQL expressions for the
following queries:
XPath queries can also be expressed via so-called window queries. Have a look into the
tutorial slides and formulate these two requests as window queries.


· /child::jungle/following-sibling::fever


SELECT DISTINCT t2.*
FROM 	(SELECT DISTINCT t1.*
	FROM table t1 AND context c1
	WHERE c1.pre < t1.pre AND c1.post < t1.post AND t1.kind='element' AND t1.par = c1.pre AND t1.tag = 'jungle') AS c2, table t2
WHERE c2.pre < t2.pre AND c2.post < t2.post AND t2.kind='element' AND t.tag='fever' AND c2.par = t2.par
ORDER BY t2.pre
 

SELECT DISTINCT t1.*
FROM table t1, table t2, context c
WHERE t1 INSIDE window(following-sibling::fever, t2)
AND t2 INSIDE window(child::jungle, c)
ORDER BY t1.pre


· /descendant-or-self::abraka[child::blabla]


SELECT DISTINCT c2.*
FROM	(SELECT DISTINCT t1.*
	FROM table t1 AND context c1
	WHERE c1.pre <= t1.pre AND c1.post <= t1.post AND t1.kind='element' AND t1.tag='abraka') AS c2, table t2
WHERE c2.pre > t2.pre AND c2.post > t2.post AND  t2.kind='element' AND t2.tag='blabla' 
ORDER BY c2.pre


SELECT DISTINCT t2.*
FROM table t1, table t2, context c
WHERE t1 INSIDE window(child::blabla, t2) 
AND t2 INSIDE window(descendant-or-self::abraka, c)
ORDER BY t2.pre



Exercise 2:
 
1:
 
delete nodes /node()/@state
 
alternativ:
 
delete nodes
(for $x in */descendant-or-self::node()
let $y := $x/@state
return $y)
 
2:
 
insert node <phone></phone> as last into /node()/address
 
3:
 
for $x in */address
let $y := $x/city
let $substring := substring($y, 7, string-length())
return replace node $y with <city>{$substring}</city>
 
des /node()/@state
 
alternativ:
 
delete nodes
(for $x in */descendant-or-self::node()
let $y := $x/@state
return $y)
 
2:
 
insert node <phone></phone> as last into /node()/address
 
3:
 
for $x in */address
let $y := $x/city
let $substring := substring($y, 7, string-length())
return replace node $y with <city>{$substring}</city>