XML database practicum
We gebruiken de Mondial database die we eerder al bevraagd hebben via het Oracle DBMS. De relationele database is te bevragen met een formulier op het web. Alle hierover gegevens vind je op de Mondial pagina.
Mondial is ook beschikbaar in XML. Je kan het Europese deel van Mondial bevragen via de open source gratis eXist XML database.
De Mondial DTD en XML files (ook die alleen voor Europa), vindt je op de Mondial pagina.
Het practicum is nogal simpel. We maken exact de zelfde vragen als we eerder deden in SQL, maar nu gebruiken we XPath en XQuery.
Hoe maak ik het huiswerk?
Stap 1: Download deze HTML file en open hem in een fijne
editor. Jedit bijvoorbeeld.
Stap 2: maak nu 1-voor-1 de vragen
Gebruik veel commentaar Commentaar zet je tussen smileys
Vul je antwoord in in deze HTML file. Zet steeds je XPath/XQuery query tussen de pre class='q' tags, en indenteer je query mooi. Het beste kan je de query copieeren uit de Exist Xquery Sandbox webinterface.
Daaronder copieer je de eerste paar regels van de uitkomst van de query en zet dat tussen de pre class='tabel' tags. Dus zoals in dit voorbeeld hieronder. Let op! XML tags worden niet getoond in je browser. Als je perse een XML tag wilt zien moet je de < entity gebruiken.
- Geef een lijst van alle namen van landen.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
/mondial/country/name
(: /mondial/country/name/text() geeft alleen de waardes (de text
knopen onder de name knopen),
en dat wil ik niet :)
(: ik heb ook /mondial//country//name geprobeerd maardat geeft veel
te veel terug, ook de namen van provincies enzo :)
1
<name>Albania
2
Greece
3
Macedonia
4
Serbia
Nog wat tips
Je kan gewoon XPath expressies in de sandbox typen. Dus
/mondial/country[1] laat je de xml van het eerste
land zien. Echter als je om attributen vraagt, als in
/mondial/country/@capital, dan zien je niks in je
sandbox. Dit komt omdat exists altijd XML wil terugeven als
antwoord. Er zijn nu verschillende trucs. De XPath functie
string(XPath-expressie) geeft de "atomized value"
van de XPath expressie terug. Dit verwacht echter altijd 1 XML
element, en niet een hele hoop. Experimenteer met de volgende
statements:
(: dit geeft een fouitmelding, want string wil maar 1 item :)
string(/mondial/country/@capital)
(: dus dit gaat goed, maar dan heb je alleen de eerste :)
string(/mondial/country[1]/@capital)
(: wacht effe: een for-loop erover heen :)
for $x in /mondial/country/@capital return string($x)
(: als je een XPath expressie tussen accolades zet, wordt de atomized waarde
ervan uitgeprint :)
for $i in /mondial/country/@capital
return
<antwoord hoofdstad='{$i}'/>
Het kan ook op deze manier:
for $i in /mondial/country/@capital
return
<antwoord>{$i}<
De belangrijke les is dat als je een XPath expressie binnen een XQuery expressie tussen accolades zet, er dan in het antwoord de waarde van die expressie wordt afgedrukt.
Maak een simpele maar heldere CSS die duidelijk de verschillende onderdelen van elke vraag laat zien.
Wat oefen vragen met hints
Probeer achtereenvolgens de volgende vragen in de exist sandbox. Vind de werking van de XPath functions uit via de XPath functie reference.
/mondial/sea
/mondial/sea/name
/mondial/sea/name/text()
/mondial/sea/@id
for $x in /mondial/sea/@id return string($x)
for $x in /mondial/sea/@id return
<output gek='{$x}'>
hier ga k nog wat sxchrijven
</output>
/mondial/sea[@id="sea-Skagerrak" ]
tokenize(/mondial/sea[@id="sea-Skagerrak" ]/@country,' ')
count(tokenize(/mondial/sea[@id="sea-Skagerrak" ]/@country,' '))
/mondial/country[@car_code = tokenize(/mondial/sea[@id="sea-Skagerrak" ]/@country,' ')]
for $x in /mondial/sea return tokenize($x/@country,' ')
distinct-values(for $x in /mondial/sea return tokenize($x/@country,' '))
Succes!
De vragen
- Geef all codes van landen.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef een alfabetisch geordende lijst van codes van de landen.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef een lijst van landen samen met hun bevolkingsaantal, aflopend geordend op bevolkingsaantal. (Land met meeste mensen bovenaan)
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Hoeveel landen zitten er in de database?
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Wat is de totale oppervlakte van alle landen in de DB?
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Wat is het kleinste land? Hoeveel inwoners heeft het?
LET OP: In SQL (en ook in MySQL) kan je LIMIT 1 achter je query zetten om slechts 1 resultaat terug te krijgen. Binnen de Oracle datbase kan dit niet en moet je dat op een andere manier doen.
De SQL-query
select name from country LIMIT 10
moet je in Oracle schrijven als select * from
(select name from country)
where rownum <11.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef alle landen met minder dan 100000 inwoners samen met hun inwoneraantal. Orden ze naar aflopend inwoneraantal.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef alle landen met minder dan 100000 inwoners en een area groter dan 100. Laat alleen de landen zien. Orden ze alfabetisch.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Zelfde als vorige vraag, maar zorg nu dat er "Land" bovenaan de tabel komt te staan.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef de landen met een inwoner aantal tussen de honderduizend en 1 miljoen.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef alle landen in wiens hoofdstad "dam" voorkomt.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef alle landen wiens hoofdstad met een Z begint.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Wat is de gemiddelde oppervlakte van landen wiens hoofdstad met een A begint?
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Join de tabellen is_member en country
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Welke landen zijn er lid van een organisatie? Geef elk land slechts 1 keer. Let op: alleen als een land een echt lid is moet je hem geven.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Welke landen zijn er lid van een organisatie? Geef elk land slechts 1 keer. Geef nu de hoofdsteden van die landen.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Bepaal voor elk land (code) van hoeveel organisaties ze lid zijn. Maak een lijst van landcode, aantal lidmaatschappen. Orden die met het land met de meeste lidmaatschappen bovenaan.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Zelfde als net, maar geef nu de namen van de landen samen met de codes
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef de namen van de organisaties waarvan Nederland lid is.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef voor elke organisatie de som van de populaties van de landen die er lid van zijn, samen met de organisatie-code. Orden aflopend.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef de land-codes en het aantal organisaties waarvan die landen lid zijn.
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef alle landen (codes zijn genoeg) die lid zijn van meer dan 60 organisaties? (Hint: gebruik de query uit de vorige vraag)
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Welke landen met een oppervlakte van meer dan 500.000 vierkante kilometer zijn lid van meer dan 60 organisaties?
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Geef de landnamen van landen die lid zijn van dezelfde organisaties als Duitsland (Germany).
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|
- Is er een organisatie waarvan alle landen , op 1 of andere manier, mee verbonden zijn?
| Score | Exact hetzelfde | Equivalent |
| Vul hooguit één 1 in. | | |
|---|