Week 6


Exercise with members


http://staff.science.uva.nl/~marx/teaching/wtt/EXTRA/problemsetxpath.xq
declare namespace pm = "http://www.politicalmashup.nl";
declare variable $col := collection('XMLs/');

(: Change the path in the previous statement to the location of the xml files on your local drive :)

(: The return statement is already prepared to make a list of the answers.
The only thing you need to do is to fill in the correct expressions. The first one is already given. Good luck! :) (: Q1: Make a tab separated list of the full names (pm:full) of all members :) let $memberfullnames := $col//pm:member//pm:full (: Q2: Make a tab separated list of the pm:id's of all the female members :) let $femalememberids := $col//pm:member[.//pm:gender = 'female']/@pm:id (: Q3: Count the total number of women (use the function count) :) let $nrwomen := count($femalememberids) (: Q4: Count the total number of women that is or has been a member of government (@pm:body="government") :) let $nrwomengov := count($col//pm:member[.//pm:gender = 'female'][.//@pm:body="government"]) (: Q5: Count the total number of women that were a member of government before 1945-05-05 :) let $nrwomengov45 := count($col//pm:member[.//pm:gender = 'female'][.//pm:membership[@pm:body="government"
and pm:period/@pm:from < '1945-05-05']])
(: Q6: Count the total number of members with a dutch wikipedia link :) let $nrdutchwiki := count($col//pm:member[.//@pm:description="Wikipedia (NL)"]) (: Q7: Count the total number of members with a foreign wikipedia link :) let $nrforeignwiki := count($col//pm:member[.//pm:link[@pm:linktype="wikipedia" and not(@pm:description="Wikipedia (NL)")]]) (: Q8: Make a tab separated list of the full names of PvdA (@pm:party-ref='nl.p.pvda') members of parliament (@pm:body="commons") without a dutch wikipedia link :) let $pvdanowiki := $col//pm:member[.//pm:membership[@pm:body="commons" and @pm:party-ref='nl.p.pvda']]
[not(.//@pm:description="Wikipedia (NL)")]//pm:full
return concat( 'A1: ', string-join($memberfullnames,'&#9;'),'&#10;', 'A2: ', string-join($femalememberids,'&#9;'),'&#10;', 'A3: ', $nrwomen,'&#10;', 'A4: ', $nrwomengov,'&#10;', 'A5: ', $nrwomengov45,'&#10;', 'A6: ', $nrdutchwiki,'&#10;', 'A7: ', $nrforeignwiki,'&#10;', 'A8: ', string-join($pvdanowiki,'&#9;'),'&#10;')

XML database practicum

http://www.w3schools.com/xquery/default.asp

http://en.wikibooks.org/wiki/XQuery/XQuery_from_SQL#Task:_How_many_Employees.3F

http://www.xqueryfunctions.com

http://staff.science.uva.nl/~marx/teaching/mondial/mondial-xml-practicum-VRAGEN.html

  1. Geef all codes van lande:
    1. for $i in /mondial/country/@car_code
      return
      <antwoord carcode='{$i}'/>
    2. for $carcode in /mondial/country/@car_code
      return
      <return>
      {data($carcode)}
      </return>
  2. Geef een alfabetisch geordende lijst van codes van de landen.
    1. <ul>
      {
      for $carcode in /mondial/country/@car_code
      order by $carcode
      return <li>{data($carcode)}</li>
      }
      </ul>
  3. Geef een lijst van landen samen met hun bevolkingsaantal, aflopend geordend op bevolkingsaantal. (Land met meeste mensen bovenaan)
    1. for $x in /mondial/country
      let $y := $x/population
      order by xs:integer($y)
      return
      <return>{data($y)}
      </return>
  4. Hoeveel landen zitten er in de database?
    1. let $c := count(/mondial/country/name)
      return
      <return>{$c}</return>
  5. Wat is de totale oppervlakte van alle landen in de DB?
    1. let $area := /mondial/country/@area
      return
      <return>
      {sum($area)}
      </return>
  6. Wat is het kleinste land? Hoeveel inwoners heeft het?
    1. let $x := /mondial
      return
      <return>
      The smallest country is: {data($x/country[./@area=min($x//@area)]//name)}
      with {data(min($x//@area))}
      </return>
  7. Geef alle landen met minder dan 100000 inwoners samen met hun inwoneraantal. Orden ze naar aflopend inwoneraantal.
    1. for $x in /mondial/country
      where $x/population<100000
      order by $x/population
      return $x/name | $x/population
  8. Zelfde als vorige vraag, maar zorg nu dat er "Land" bovenaan de tabel komt te staan.
  9. Geef de landen met een inwoner aantal tussen de honderduizend en 1 miljoen.
    1. for $x in /mondial/country[population<1000000][population>100000]
      order by $x/population descending
      return $x/name | $x/population

  10. Geef alle landen in wiens hoofdstad "dam" voorkomt.
    1. for $x in /mondial/country[contains(@capital,"dam")]
      return
      <return>{$x/name}
      </return>

  11. Geef alle landen wiens hoofdstad met een Z begint.
    1. for $x in /mondial/country[contains(@capital,"Z")]
      return
      <return>{$x/@capital | $x/name}
      </return>
    2. for $x in /mondial/country[starts-with(@capital,"Z")]
      return
      <return>{$x/@capital | $x/name}
      </return> - hij doet het niet want er komen nog andere karakters voor de name van de hoofdstad
  12. Wat is de gemiddelde oppervlakte van landen wiens hoofdstad met een A begint?
    1. let $x := /mondial/country[contains(@capital,"A")]
      return
      <return>{avg($x/@area)}
      </return>
      - nog niet helemaal goed
  13. Join de tabellen is_member en country
    1. for $x in /mondial/country
      let $y := tokenize($x/@memberships, 'org-')
      order by $x/name
      return
      <return><name>{concat($x/name, ' is lid van de volgende organisaties: ')}</name>
      <organizations>{$y}</organizations>
      </return>

  14. 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
    1. for $x in /mondial/country[contains(@memberships,"org-")]
      order by $x/name
      return
      <return>{$x/name}
      </return>

  15. Welke landen zijn er lid van een organisatie? Geef elk land slechts 1 keer. Geef nu de hoofdsteden van die landen.
    1. for $x in /mondial/country[contains(@memberships,"org-")]
      order by $x/name
      return
      <return>{data($x/@capital)}
      </return>

  16. 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.
    1. for $x in /mondial/country
      let $y := tokenize($x/@memberships, 'org-')
      order by count($y) descending
      return
      <return>{data($x/name)} ({data($x/@car_code)}) is lid van {count($y)} organizaties.
      </return>

  17. Zelfde als net, maar geef nu de namen van de landen samen met de codes
    1. for $x in /mondial/country
      let $y := tokenize($x/@memberships, 'org-')
      order by count($y) descending
      return
      <return>{data($x/name)} ({data($x/@car_code)}) is lid van {count($y)} organizaties.
      </return>

  18. Geef de namen van de organisaties waarvan Nederland lid is.
    1. for $x in /mondial/country
      let $y := tokenize($x/@memberships, 'org-')
      where $x/name = 'Netherlands'
      return
      <return>{data($x/name)} ({data($x/@car_code)}) is lid van de volgende organizaties: {$y}
      </return>

  19. Geef voor elke organisatie de som van de populaties van de landen die er lid van zijn, samen met de organisatie-code. Orden aflopend.

  20. Geef de land-codes en het aantal organisaties waarvan die landen lid zijn.
    1. for $x in /mondial/country
      let $y := tokenize($x/@memberships, 'org-')
      order by count($y) descending
      return
      <return>{data($x/name)} ({data($x/@car_code)}) is lid van de volgende organizaties: {$y}
      </return>

  21. Geef alle landen (codes zijn genoeg) die lid zijn van meer dan 60 organisaties? (Hint: gebruik de query uit de vorige vraag)
    1. for $x in /mondial/country
      let $y := tokenize($x/@memberships, 'org-')
      where count($y)>60
      order by count($y) descending
      return
      <return>{data($x/name)} : {count($y)}
      </return>

  22. Welke landen met een oppervlakte van meer dan 500.000 vierkante kilometer zijn lid van meer dan 60 organisaties?
    1. for $x in /mondial/country
      let $y := tokenize($x/@memberships, 'org-')
      where $x/@area>500000 and count($y)>60
      order by count($y) descending
      return
      <return>{data($x/name)} heeft een oppervlakte van meer dan 500.000 vierkante kilometer en is lid van meer dan 60 organisaties.
      </return>

  23. Geef de landnamen van landen die lid zijn van dezelfde organisaties als Duitsland (Germany).
    1. for $x in /mondial/country
      let $y := tokenize($x/@memberships, 'org-')
      where contains($x/@memberships, 'org-AfDB org-AG org-AsDB org-BIS org-CDB org-BDEAC org-CE org-CBSS org-CCC org-ECE org-EBRD org-EIB org-CERN org-ESA org-EU org-FAO org-G-5 org-G-7 org-G-8 org-G-10 org-IADB org-IAEA org-IBRD org-ICC org-ICAO org-ICFTU org-Interpol org-IDA org-IEA org-IFRCS org-IFC org-IFAD org-ILO org-IMO org-Inmarsat org-IMF org-IOC org-IOM org-ISO org-ICRM org-ITU org-Intelsat org-MTCR org-NAM org-ANC org-NATO org-EN org-NSG org-OECD org-OSCE org-OAS org-PCA org-UN org-UNAMIR org-UNCRO org-UNESCO org-UNIDO org-UNITAR org-MINURSO org-UNOMIG org-UNHCR org-UNPROFOR org-UPU org-WEU org-WHO org-WIPO org-WMO org-WToO org-WTrO org-ZC')
      order by count($y) descending
      return
      <return>{$x/@memberships}
      </return>

  24. Is er een organisatie waarvan alle landen , op 1 of andere manier, mee verbonden zijn?


ċ
Attila Csala,
Mar 14, 2012, 11:15 AM
Comments