KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

Lösning Tentamen IV1023 Avancerad datahantering med XML 2011-10-20

 Tentan består av 3 delar: Del 1 Teori och modellering (uppgift 1, 2, 3) Del 2 Frågespråk för SSD och XML (uppgift 4, 5) Del 3 XML och relationsdatabaser (uppgift 6)

 Tentan betygsätts enligt skalan F/Fx/E/D/C/B/A.

 För E krävs c:a 60% av totalpoängen, men också c:a 40% av poängen för varje del. Man måste alltså uppvisa kunskaper i alla tre områden (tentadelar). De exakta betygsgränserna för A-E är: Hela tentan Per del A-gräns 94% 87% B-gräns 85% 75% C-gräns 77% 64% D-gräns 68% 52% E-gräns 60% 40% Får man minst 75% på en del utan att uppnå E-gränsen, får man rest (Fx) (på de delar som man inte fick 75%), dvs möjligheten att endast göra vissa delar vid nästa tenta och kan då få högst E. Man behöver inte använda sig av denna möjlighet. Använder man Fx/Rest gäller E-gränserna för de delar man skriver: 60% på hela tentan och 40% per del.

 Skriv endast på en sida av varje blad!

 Skriv namn och uppgiftsnummer på varje blad!

 Fyll i skanningsbladet så att det framgår vilka uppgifter som har lösts och hur många blad som har lämnats in!

 Inga hjälpmedel tillåtna förutom ordböcker för översättning mellan svenska och främmande språk

LYCKA TILL! KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

Uppgift 1 (9 poäng)

Uppgift 1 består av 9 frågor. Några frågor är flervalsfrågor där det alternativ som är rätt skall väljas (bara ett alternativ är rätt). Några frågor är termer som skall förklaras kortfattat så att det framgår att man förstår vad termen betyder. Inga långa uppsatser, tack.

Förklara följande termer: 1. SVG 2. shredding 3. well-formed XML 4. processing-instruction

Välj ett av alternativen för var och en av flervalsfrågorna nedan: 5. Vilken nodtyp kan inte vara en child till en elementnod enligt XQuery-modellen? a. element b. text c. comment d. attribute 6. XML står för: a. Extendable Meta Language b. Extensible Meta Language c. Extendable Markup Language d. Extensible Markup Language 7. Ett rdf:predicate måste alltid vara a. En resurs av typen rdfs:Container b. En resurs av typen rdf:Property c. En literal d. En resurs av typen rdfs:Class 8. Vilket av följande är korrekt? a. Ett element kan innehålla antingen subelement eller kommentarer. b. Ett element får inte ha ett subelement med samma namn som ett attribut. c. Ett element får inte tillhöra flera namespaces. d. Två subelement under samma element får inte vara identiska. e. Ett element och ett subelement får inte ha samma namn. 9. Vad kan man inte göra med XQuery Update facility? a. Byta plats på två syskon-elementnoder. b. Skapa flera nya noder samtidigt. c. Ta bort en elementnod som har subelement. d. Ersätta en nod med två nya noder. e. Skapa en kommentarnod som sista nod i en elementnod.

1. - Ett XML-baserat språk för att representera vektorgrafik. 2. Shredding innebär att man delar upp ett XML-dokument till sina data-element och placerar värdena i t ex en relationsdatabas. 3. Ett XML-dokument som har ett rotelement och är syntaktiskt korrekt så att alla element är nästlade i varandra korrekt, alla element och attribut öppnas och stängs korrekt. Ett well-formed XML-dokument skall börja med XML-deklarationen. 4. En speciell typ av XML-nod som har följande format: XML- deklarationen är en processing-instruction. 5. d 6. d 7. b 8. c 9. a

KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

Uppgift 2 (3 poäng)

Använd RDF och RDFS för att beskriva nedanstående information! Lösningen skall vara antingen grafer eller XML.

En Fanta 500 ml kostar 11 kronor.

Vi kan skapa en resurs för "Fanta 500 ml" som har tre properties: namn, storlek och pris:

Fanta 500

storlek namn

pris 11 P

Som RDF/XML blir det enligt följande:

Fanta 500 Volvo

Resursen ovan borde tillhöra en klass och tre properties borde skapas med den klassen som domain:

rdfs:Class namn rdf:type rdfs:domain rdf:type rdf:type rdfs:domain storlek rdf:Property Produkt rdfs:domain rdf:type pris rdfs:range rdfs:range rdfs:range

rdfs:Literal

KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

I RDF/XML ser det ut såhär:

Man kan även tänka sig göra produktens namn till en klass, t ex "Märke". Man kan även utöka modellen med att ha priset och storleken som resurser som har värde och valuta, respektive värde och måttenhet. Informationen om resurserna skulle kunna även representeras som reifierade påståenden (rdf:Statement) med subjekt, predikat och objekt. Resurserna i RDF/XML kan representeras med den förkortade syntaxen där klassens namn blir elementets namn. Det tidigare XML-dokumentet skulle då bli såhär:

Fanta 500 Volvo KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

Uppgift 3 (3 poäng)

Ta fram en DTD för att representera samma information som relationsmodellen nedan!

Tabellen Plantering innehåller information om vad som har platerats i varje skog vid varje datum, medan tabellen Skogsträd innehåller information om den aktuella mängden träd av varje typ i varje skog.

Eftersom ID och IDREF har använts, måste vi förutsätta att ingen trädtyp har samma namn som en skog. Annars kan man använda en surrogatnyckel (som vi gjorde i relationsdatabasen). Vi kan även ha attributen definierade endast som CDATA men då blir det ingen kontroll att referensvärdena finns och att dubbletter inte förekommer. En annan lösning är att nästla trädtyperna som subelement till Skog och Plantering, men då har vi redundans som vi kanske vill undvika.

Det är även korrekt att använda element istället för attribut eller nästla på något annat sätt, t ex sätta trädtyperna under rotelementet och nästla skog och planteringar i trädtyperna, men det känns mindre naturligt.

KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

Uppgift 4 (2 + 2 = 4 poäng)

Betrakta nedanstående XML-dokument som endast innehåller testdata för att illustrera strukturen. XML-dokumentet innehåller information om olika organisationer och deras medlemmar. Ni kan förutsätta att alla namn är unika, dvs inga två organisationer har samma namn och inga två personer har samma namn.

Skriv XQuery för följande:

a) Ta fram information om antal aktuella medlemmar per organisation! Resultatet skall ha följande struktur:

namnet antalet namnet antalet

element Resultat { for $o in //Organisation let $n := element Namn {$o/@namn/string()} let $am := element AntalMedlemmar {count($o/Medlem[not(@till)])} return element Organisation {$n, $am} } KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

b) Ta fram namn på organisationer som varje person har någon gång varit medlem i! Resultatet skall ha följande struktur:

element Resultat { for $pn in distinct-values(//Medlem/@namn) let $orgs := for $o in //Organisation[Medlem/@namn = $pn] return element Organisation {$o/@namn} return element Person {attribute namn {$pn}, $orgs} }

Eller med hjälp av preceding-axis (så att vi inte behöver återkonstruera attributet namn): element Resultat { for $pn in //Medlem[not(@namn = preceding::Medlem/@namn)]/@namn let $orgs := for $o in //Organisation[Medlem/@namn = $pn] return element Organisation {$o/@namn} return element Person {$pn, $orgs} }

KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

Uppgift 5 (3 poäng)

Betrakta XML-dokumentet i uppgift 4! Skriv ett XSLT (med XSLT 1.0) för följande beskrivning!

Ta fram en HTML-sida där varje person har en rubrik och en tabell med sina medlemskap. Resultatet skall ha följande utseende:

Personnamn Organisation Medlem från Medlem till Orgnamn årtal årtal Orgnamn årtal Orgnamn årtal årtal

Personnamn Organisation Medlem från Medlem till Orgnamn årtal årtal Orgnamn årtal Orgnamn årtal årtal

Organisation Medlem från Medlem till
KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

Uppgift 6 (2 + 2 + 2 + 2 = 8 poäng)

Betrakta följande relationsdatabasmodell om olika krig!

Kommentarer: Varje krig har exakt två sidor (som krigar mot varandra). Kolumnen id är surrogatnyckel definierad som AUTONUMBER. Startår och slutår är av datatypen INTEGER. Namn är av datatypen STRING. Alla kolumner är definierade som NOT NULL. Kolumnen deltagarexml är av datatypen XML och tar emot data som följer reglerna i följande DTD med rotelementet Deltagare:

Attributet antaldöda har alltid ett numeriskt värde.

Skriv standard SQL för följande: a) Ta fram information om alla krig! Resultatet skall ha följande struktur:

Attributet antalår kan ange antalet årsskiften då kriget pågick, så om ett krig börjar och slutar under samma år blir antalår = 0.

SELECT XMLELEMENT(NAME "AllaKrig", XMLAGG(XMLELEMENT(NAME "Krig", XMLATTRIBUTES(namn AS "namn", år AS "antalår", döda AS "antaldöda", länder AS "antaldeltagandeländer")))) FROM (SELECT Krig.namn AS namn, slutår-startår AS år, SUM(XMLCAST(XMLQUERY('count($DELTAGAREXML//Land)') AS INTEGER)) AS länder, SUM(XMLCAST(XMLQUERY('sum($DELTAGAREXML//@antaldöda)') AS INTEGER)) AS döda FROM Krig, Sida WHERE Krig.id = Sida.krig GROUP BY Krig.namn, slutår, startår) AS DataTable eller KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

SELECT XMLELEMENT(NAME "AllaKrig", XMLAGG(XMLELEMENT(NAME "Krig", XMLATTRIBUTES(namn AS "namn", år AS "antalår", döda AS "antaldöda", länder AS "antaldeltagandeländer")))) FROM (SELECT Krig.namn AS namn, slutår-startår AS år, COUNT(*) AS länder, SUM(ad) AS döda FROM Krig, Sida, XMLTABLE('$d//Land' PASSING deltagarexml as "d" COLUMNS ad INTEGER PATH '@antaldöda') WHERE Krig.id = Sida.krig GROUP BY Krig.namn, slutår, startår) AS DataTable eller

SELECT XMLELEMENT(NAME "AllaKrig", XMLAGG(XMLELEMENT(NAME "Krig", XMLATTRIBUTES(namn AS "namn", slutår-startår AS "antalår", (SELECT SUM(XMLCAST(XMLQUERY('sum($d//@antaldöda)' PASSING deltagarexml AS "d") AS INTEGER)) FROM Sida WHERE krig = Krig.id) AS "antaldöda", (SELECT SUM(XMLCAST(XMLQUERY('count($d//Land)' PASSING deltagarexml AS "d") AS INTEGER)) FROM Sida WHERE krig = Krig.id) AS "antaldeltagandeländer")))) FROM Krig b) Ta fram namn på länder som deltog i något krig utan att förlora en enda person, dvs hade noll döda!

SELECT DISTINCT XMLCAST(xt.xc AS varchar(30)) AS land FROM Sida, XMLTABLE('$DELTAGAREXML//Land[@antaldöda=0]/@namn') AS xt(xc) eller

SELECT DISTINCT land FROM Sida, XMLTABLE('$DELTAGAREXML//Land[@antaldöda=0]/@namn' COLUMNS land VARCHAR(30) PATH '.') AS xt

KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

c) Ta fram information om kriget "WWII" enligt följande struktur:

SELECT XMLELEMENT(NAME "WWII", XMLATTRIBUTES(startår AS "startår", slutår AS "slutår"), XMLAGG(XMLELEMENT(NAME "Sida", XMLATTRIBUTES(sida.namn AS "namn"), deltagarexml))) FROM Krig, Sida WHERE Krig.id = Sida.krig AND Krig.namn = 'WWII' GROUP BY startår, slutår

eller

SELECT XMLELEMENT(NAME "WWII", XMLATTRIBUTES(slutår AS "slutår", startår AS "startår"), (SELECT XMLAGG(XMLELEMENT(NAME "Sida", XMLATTRIBUTES(namn AS "namn"), deltagarexml)) FROM Sida WHERE krig = Krig.id)) FROM Krig WHERE namn = 'WWII'

Skriv SQL Server SQL för följande:

d) Ta fram alla länder och vilka krig de har deltagit i! Resultatet skall ha två kolumner: land och krig.

SELECT xc.value('@namn', 'VARCHAR(20)') AS Land, Krig.namn AS Krig from Krig, Sida CROSS APPLY Sida.deltagarexml.nodes('//Land') AS T(xc) WHERE Krig.id = Sida.krig ORDER BY Land KTH/ICT/SCS IV1023 Lösning Tenta 2011-10-20 nikos dimitrakas

Referens

SQL Syntax för SQL SELECT: SELECT [DISTINCT] FROM [WHERE ] [GROUP BY [HAVING ]] [ORDER BY ]

Vanliga SQL/XML-funktioner: XMLELEMENT, XMLATTRIBUTES, XMLFOREST, XMLAGG, XMLCONCAT, XMLEXISTS, XMLQUERY, XMLTABLE, XMLCOMMENT, XMLPI

XML Schema Vanliga element: schema, element, attribute, complexType, simpleType, group, all, sequence, choice, restriction, extension, simpleContent, complexContent

XQuery Syntax för XQuery FLWOR: for set where order by return

Vanliga XQuery-funktioner: distinct-values(), count(), sum(), min(), max(), empty(), not()

XSLT Vanliga element: transform, output, variable, template, for-each, apply-templates, call-template, if, choose, when, otherwise, element, attribute, comment, processing-instruction, value-of, text, copy, copy-of, sort

SQL Server SQL FOR XML PATH | AUTO | RAW XML-metoder: query, value, nodes, , modify XQuery-funktioner: sql:column, sql:variable