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.


  1. 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

  1. Geef all codes van landen.
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
       
     
     
    
  2. Geef een alfabetisch geordende lijst van codes van de landen.
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
        
    
      
  3. 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.
     
    
       
    
      
  4. Hoeveel landen zitten er in de database?
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
         
    
      
  5. Wat is de totale oppervlakte van alle landen in de DB?
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
         
    
      
  6. 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.
    
         
    
      
  7. 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.
    
         
    
      
  8. 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.
    
         
    
      
  9. 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.
    
         
    
      
  10. Geef de landen met een inwoner aantal tussen de honderduizend en 1 miljoen.
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
         
    
      
  11. Geef alle landen in wiens hoofdstad "dam" voorkomt.
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
         
    
      
  12. Geef alle landen wiens hoofdstad met een Z begint.
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
         
    
      
  13. Wat is de gemiddelde oppervlakte van landen wiens hoofdstad met een A begint?
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
         
    
      
  14. Join de tabellen is_member en country
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
         
    
      
  15. 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.
    
         
    
      
  16. 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.
    
         
    
      
  17. 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.
    
         
    
      
  18. Zelfde als net, maar geef nu de namen van de landen samen met de codes
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
         
    
      
  19. Geef de namen van de organisaties waarvan Nederland lid is.
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
         
    
      
  20. 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.
    
         
    
      
  21. Geef de land-codes en het aantal organisaties waarvan die landen lid zijn.
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
         
    
      
  22. 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.
    
         
    
      
  23. 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.
    
         
    
      
  24. Geef de landnamen van landen die lid zijn van dezelfde organisaties als Duitsland (Germany).
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.
    
         
    
      
  25. Is er een organisatie waarvan alle landen , op 1 of andere manier, mee verbonden zijn?
    Score Exact hetzelfde Equivalent
    Vul hooguit één 1 in.