Πανεπιστήµιο Κρήτης Τµήµα Επιστήµης Υπολογιστών ΗΥ-561 ιαχείριση εδοµένων στο Παγκόσµιο Ιστό Βασίλης Χριστοφίδης Ονοµατεπώνυµο: Αριθµός Μητρώου: Τελική Εξέταση (3 ώρες) Ηµεροµηνία: 13 Φεβρουαρίου 2004 Άσκηση 1 (40 µονάδες) Θεωρήστε τον παρακάτω γράφο ηµι-δοµηµένων δεδοµένων D, o οποίος αναπαριστά ένα µέρος της βάσης δεδοµένων MLB µε πληροφορίες σχετικές µε το επαγγελµατικό πρωτάθληµα baseball (Major League baseball). 1.1.(10 µονάδες) Αποδείξτε ότι ο παρακάτω γράφος σχήµατος S είναι ένα σχήµα για τον γράφο ηµι-δοµηµένων δεδοµένων D, δηλαδή ότι ο S είναι µια τυποποιηµένη (typed) και µε ρίζα (rooted) προσοµοίωση του D. ώστε την σχέση R (<) µεταξύ των κόµβων του γράφου δεδοµένων D και αυτών του γράφου σχήµατος S που ορίζει µια µέγιστη προσοµοίωση (maximal simulation). Για την απάντησή σας µπορείτε να αναπαραστήσετε την σχέση R (<) σαν πίνακα µε 2 κολώνες.
R (Data Node, Schema Node) 1 Root 2, 14 N-team 24 A-team 6, 11, 17, 21 N-player 27 A-player 3, 4, 5, 7, 8, 9, 10, 12, 13, 15, 16, 18, 19, 20, 22, 23, 25, 26, 28, 29, 30 String 1.2. (10 µονάδες) Κατασκευάστε, τον Οδηγό εδοµένων DG για τον γράφο ηµι-δοµηµένων δεδοµένων D δηλαδή ένα σχήµα έτσι ώστε: (α) κάθε µονοπάτι ετικετών στο D να εµφανίζεται και στο G καθώς και το αντίστροφο (Accurate) και (β) κάθε µονοπάτι ετικετών στο G να είναι µοναδικό (Concise). 1.3. (10 µονάδες) Μια κανονική έκφραση µονοπατιών P σε ένα γράφο ηµιδοµηµένων δεδοµένων D αποτιµάται στο σύνολο των κόµβων του D οι οποίοι είναι προσπελάσιµοι από την P. Ποιο από τα σχήµατα S (Γράφος Σχήµατος) και DG (Οδηγός εδοµένων) πιστεύετε ότι είναι πιό κατάλληλo για την βελτιστοποίηση της αποτίµησης της κανονικής έκφρασης µονοπατιών MLB. National.player.nickname στο γράφο ηµι-δοµηµένων δεδοµένων MLB της άσκησης; Κατά πόσο η προτεινόµενη τεχνική µπορεί επίσης να χρησιµοποιηθεί για την βελτιστοποίηση επερωτήσεων (π.χ. στην LOREL) που περιέχουν πολλαπλές κανονικές εκφράσεις µονοπατιών και µεταβλητές όπως η παρακάτω; Select x From MLB.National x, x.player.name y Where y = Kim Περιγράψτε αναλυτικά την αποτίµηση των παραπάνω επερωτήσεων µε ή χωρίς βελτιστοποίηση.
Without a DataGuide, a query processor would be forced to examine each National, in turn each player of each National and finally return each nickname object of each player object. The bold lines in D Figure shows this process. In the DataGuide technique, any object in a DataGuide graph has a target set that denotes all objects reachable by a given label path in the source database. For example, the target set of the object 2 in DG Figure is {2; 14} in D Figure. In our example, the query result is the objects in the target set of MLB.National.player.nicknam. So, the target set of the object 6 in DG Figure, that is, {7; 18}, is returned. This traversing is shown in the bold lines in DG Figure. In this way, the object search space is reduced. However, this technique can be applied only to queries with a single regular expression. That is, it cannot be directly applied to complex queries with several regular expressions and variables. The LOREL query asks for teams, which have the player, named Kim. The result of the query cannot be returned by only traversing the DataGuide graph. That is, if we traverse the DataGuide graph, the results of the query are nodes 2 and 7 and the corresponding target sets are {2,14} and {8; 12; 19; 22}. However, since there is no path information between nodes 2 and 7, we cannot answer the query by using only the DataGuide graph. Thus, we should traverse the source data graph and the DataGuide graph simultaneously. 1.4 (10 µονάδες) Ποιο από τα σχήµατα S (Γράφος Σχήµατος) και DG (Οδηγός εδοµένων) πιστεύετε ότι είναι πιο κατάλληλo για την αποθήκευση ενός γράφου ηµι-δοµηµένων δεδοµένων σε µια σχεσιακή βάση δεδοµένων; ώστε το λογικό σχήµα και ένα στιγµιότυπο της σχεσιακής βάσης, που αποθηκεύει όλο το γράφο ηµι-δοµηµένων δεδοµένων MLB της άσκησης. Στη συνέχεια διατυπώστε την επερώτηση SQL που χρειαζόµαστε για να αποτιµήσουµε στην σχεσιακή βάση την κανονική έκφραση µονοπατιών MLB.National.player.nickname. Ποια βελτιστοποίηση επιτυγχάνουµε µε αυτή την τεχνική, συγκρινόµενη µε την εκτέλεση της ίδιας επερώτησης SQL σε µια σχεσιακή βάση που έχει το ακόλουθο γενικό σχήµα αποθήκευσης ηµιδοµηµένων δεδοµένων: ref(source: oid, label: dom, destination: oid) val(obj: oid, value: dom) National (oid, division, stadium, name, player) Player (oid, nickname, name, era, win, avg) American (oid, division,name,playera) Playera (name,era,win) Select Y.name From National X, Player Y Less joins
Άσκηση 2 (60 µονάδες) 2.1.(10 µονάδες) ώστε την έκφραση XQuery που κατασκευάζει ένα πίνακα HTML µε το ακόλουθο περιεχόµενο: Σηµείωση: Θυµηθείτε ότι ένας πίνακας HTML σηµειώνεται µε <table> και αποτελείται από γραµµές που σηµειώνονται µε <tr> και από στήλες που σηµειώνονται µε </td>. Κάθε στήλη, µπορεί να καθορίζει την στοίχιση (align), το υποκείµενο χρώµα (bgcolor), πλάτος (width) και ύψος (height) των κελιών της. <html> <body> <table>{ for $y in 1 to 8 return <tr>{ for $x in1 to8 return let $bg:=(if(( $x + $y) mod2 = 0) then "red" else"black") return <td align="right" bgcolor="{$bg}" width="30" height="30"> </td> }</tr> }</table> </body> </html> 2.2.(20 µονάδες) Σας δίνονται τα παρακάτω έγγραφα XML και οι καθορισµοί των τύπων τους (DTDs) που περιέχουν πληροφορίες σχετικά µε δηµοπρασίες (bids) και αντικείµενα (items) προς πώληση: <?xml version="1.0"?> <!DOCTYPE items [ <!ELEMENT items (item_tuple*)> <!ELEMENT item_tuple (itemno, description, offered_by, start_date?, end_date?, reserve_price? )> <!ELEMENT itemno (#PCDATA)> <!ELEMENT description (#PCDATA)> <!ELEMENT offered_by (#PCDATA)> <!ELEMENT start_date (#PCDATA)> <!ELEMENT end_date (#PCDATA)> <!ELEMENT reserve_price (#PCDATA)> ]>
<?xml version="1.0"?> <!DOCTYPE bids [ <!ELEMENT bids (bid_tuple*)> <!ELEMENT bid_tuple (userid, itemno, bid, bid_date)> <!ELEMENT userid (#PCDATA)> <!ELEMENT itemno (#PCDATA)> <!ELEMENT bid (#PCDATA)> <!ELEMENT bid_date (#PCDATA)> ]> <items> <item_tuple> <itemno>1001</itemno> <description>red Bicycle</description> <offered_by>u02</offered_by> <start_date>2004-01-05</start_date> <end_date>2004-01-20</end_date> <reserve_price>40</reserve_price> </item_tuple> <item_tuple> <itemno>1002</itemno> <description>motorcycle</description> <offered_by>u010</offered_by> <start_date>2004-02-11</start_date> <end_date>2004-03-15</end_date> <reserve_price>500</reserve_price> </item_tuple> <bids> <bid_tuple> <userid>u02</userid> <itemno>1001</itemno> <bid>30</bid> <bid_date>04-01-07</bid_date> </bid_tuple> <bid_tuple> <userid>u04</userid> <itemno>1001</itemno> <bid>90</bid> <bid_date>04-01-08</bid_date> </bid_tuple> </bids> </items> ώστε τις εκφράσεις XQuery για τις παρακάτω επερωτήσεις, καθώς και το αποτέλεσµά τους µε την µορφή ενός εγγράφου XML. ώστε επίσης τον τύπο του αποτελέσµατος για κάθε ερώτηση: a) (5 µονάδες) ώστε τον αριθµό και την περιγραφή των αντικειµένων (items) τα οποία δεν έχουν δηµοπρατηθεί (bids). <result>{ FOR $i IN document("items.xml")//item_tuple WHERE NOT(exists( -- use of variable in Xpath document("bids.xml")//bid_tuple[itemno=$i/itemno])) RETURN <no_bid_item>{ $i/itemno, $i/description }</no_bid_item> }</result> <result> <no_bid_item> <itemno>1002</itemno> <description>motorcycle</description> </no_bid_item> </result>
element result { element no_bid_item { element itemno {xsd:integer}, element description {xsd:string} }* } b) (5 µονάδες) ώστε τον αριθµό και την µέση προσφερόµενη τιµή των δηµοπρατηθέντων αντικειµένων για τα οποία υπάρχουν τουλάχιστον δύο προσφορές (bids). Ταξινοµήστε σε φθίνουσα σειρά το αποτέλεσµα ως προς την µέση προσφερόµενη τιµή. <result>{ FOR $i IN DISTINCT- VALUES (document("bids.xml")//itemno) LET $b := document("bids.xml")//bid_tuple [itemno = $i] WHERE count($b) GE 2 ORDER BY avg($b/bid) DESCENDING RETURN <popular_item> {$i, <avgbid>{avg($b/bid)}</avgbid>} </popular_item> }</result> <result> <popular_item> <itemno>1001</itemno> <avgbid>60</avgbid> </popular_item> </result> element result { element popular_item { element itemno {xsd:integer}, element avgbid {xsd:integer?} }* } c) (10 µονάδες) Για κάθε δηµοπρατηθέν αντικείµενο, του οποίου η µέγιστη προσφερόµενη τιµή (bid) είναι διπλάσια από την τιµή εκκίνησης (reserve price), βρείτε τον αριθµό, την περιγραφή, την τιµή εκκίνησης, και την µέγιστη προσφερόµενη τιµή του αντικειµένου. <result>{ FOR $item IN document("items.xml")//item_tuple LET $b := document("bids.xml")//bid_tuple [itemno = $item/itemno] WHERE $item/reserve_price * 2 < max($b/bid) RETURN <successful_item> {$item/itemno, $item/description,
$item/reserve_price, <high_bid>{max($b/bid)}</high_bid>} </successful_item> }</result> <result> <successful_item> <itemno>1001</itemno> <description>red Bicycle</description> <reserve_price>40</reserve_price> <high_bid>90</high_bid> </successful_item> </result> element result { element successful_item { element itemno {xsd:integer}, element description {xsd:string}, element reserve_price {xsd:integer}?, element high_bid {xsd:integer?} }* } 2.3.(10 µονάδες) Είναι ισοδύναµες οι ακόλουθες επερωτήσεις XPath (2.0) και XQuery (1.0); Επιστρέφουν δηλαδή τα ίδια αποτελέσµατα; ικαιολογήστε την απάντησή σας. (α) XPath: document("items.xml")//item_tuple[itemno=1002]/description XQuery: FOR $item IN document("items.xml")//item_tuple WHERE every $itemno IN $item/itemno SATISFIES $itemno=1002 RETURN $item/description (β) XPath: document("items.xml")//item_tuple[reserve_price>100] [3]/ description XQuery: FOR $item IN document("items.xml")//item_tuple [3] [reserve_price>100] RETURN $item/description (α) Νο in general. In the current schema the answer is yes because itemno has been defined to appear exactly once. If itemno was defined as itemno* then: XPATH expression returns the description of an item_tuple if it has at least one itemno=1002, while XQuery expression returns the description of an item_tuple if all the itemno elements of it, are equal to 1002. (β) Νο. XPATH returns the description of the third item_tuple which has a reserve_price > 100. XQuery returns the third item_tuple if it happens to have a reserve_price element greater than 100.
2.4.(10 µονάδες) Σας δίνονται οι ακόλουθοι καθορισµοί τύπων εγγράφων XML (DTDs) των οποίων τα επιτρεπτά στιγµιότυπα µπορούν καθ υπέρβαση να θεωρηθούν σαν αποτελέσµατα δύο επερωτήσεων Q1 και Q2. Q1: <!DOCTYPE a [ Q2: <!DOCTYPE a [ <!ELEMENT A(B*, C+)> <!ELEMENT A((B, A) C+)> <!ELEMENT B(#PCDATA)> <!ELEMENT B(#PCDATA)> <!ELEMENT C(#PCDATA)> <!ELEMENT C(#PCDATA)> ]> ]> Ποια από τις παρακάτω προτάσεις είναι σωστές; ικαιολογήστε την απάντησή σας. (a) Η Q1 και Q2 έχουν ακριβώς τα ίδια αποτελέσµατα. (b) Τα αποτελέσµατα της Q1 περιέχονται πάντα στα αποτελέσµατα της Q2. (c) Τα αποτελέσµατα της Q2 περιέχονται πάντα στα αποτελέσµατα της Q1. (d) Η Q1 και Q2 έχουν διαφορετικά αποτελέσµατα. Correct: d) Q1 and Q2 produce different answers. Q1 allows tag patterns like <A><B></B><B></B><C></C></A> that Q2 does not. Q2 allows <A><B></B><A><C></C></A></A> that Q1 does not. 2.5.(10 µονάδες) Το ακόλουθο µοντέλο οντοτήτων/συσχετίσεων αναπαριστά µία βάση δεδοµένων µε απλά και σύνθετα αντικείµενα (Parts). Θέλουµε να ανταλάξουµε τα δεδοµένα της βάσης Parts στο ιαδίκτυο µε την µορφή εγγράφων XML. ώστε τον καθορισµό τύπου εγγράφου (DTDs) και το σχήµα (Schema) XML που αναπαριστούν µε την µικρότερη δυνατή απώλεια πληροφορίας το µοντέλο οντοτήτων/συσχετίσεων που σας δίνεται. <!DOCTYPE Store[ <!ELEMENT Store(Part*) <!ELEMENT Part(BPname, ComposedOf+) <!ATTLIST Part number ID> <!ELEMENT BPname (#PCDATA)> <!ELEMENT ComposedOf (Quantity)> <!ELEMENT Quantity (#PCDATA)> <!ATTLIST ComposedOf partnumber IDREF> ]> <!DOCTYPE Store[ <!ELEMENT Store(Part*, ComposedOf*) <!ELEMENT Part(BPname) <!ATTLIST Part number ID> <!ELEMENT BPname (#PCDATA)> <!ELEMENT ComposedOf (Quantity)> <!ATTLIST ComposedOf pnumber IDREF> <!ATTLIST ComposedOf chnumber IDREF> <!ELEMENT Quantity(#PCDATA)> ]>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema"> <xsd:annotation> <xsd:documentation xml:lang="en"> Purchase order schema for Example.com. Copyright 2000 Example.com. All rights reserved. </xsd:documentation> </xsd:annotation> <xsd:element name = "Store" type = "Store_Type" /> <xsd:complextype name = "Store_Type" > <xsd:sequence> <xsd:element name = "Part" type = "Part_Type" minoccurs = "0" maxoccurs = "unbounded" /> </xsd:sequence> </xsd:complextype> <xsd:complextype name = "Part_Type" number > <xsd:sequence> <xsd:element name = "BPname" type = "xsd:string" /> <xsd:element name = "Composed_Of" type = "Composed_Of_Type" maxoccurs = "unbounded" /> </xsd:sequence> <xsd:attribute name="number" type="xsd:id" use="required"/> </xsd:complextype> <xsd:complextype name = "Composed_Of_Type" > <xsd:sequence> <xsd:element name = "Quantity" type = "xsd:integer" /> </xsd:sequence> <xsd:attribute name="partnumber" type="xsd:idref" use="implied"/> </xsd:complextype> </xsd:schema> Άσκηση 3 (25 µονάδες) Για την βελτιστοποίηση επερωτήσεων δεδοµένων XML, έχουν προταθεί πολλές τεχνικές σε διάφορα πλαίσια εφαρµογών. Μία τεχνική προτείνει την χρήση σχηµάτων κωδικοποίησης (labeling schemεs) σε έγγραφα XML για την αποτίµηση των εκφράσεων µονοπατιών που εµφανίζονται σε επερωτήσεις XPath και XQuery. ύο από τα πιο γνωστά σχήµατα είναι (α) η κωδικοποίηση βασισµένη σε προθέµατα (prefix-based) και (β) η κωδικοποίηση βασισµένη σε διαστήµατα (interval-based). Για παράδειγµα, οι δοµικές σχέσεις των λογικών στοιχείων (elements) του παρακάτω έγγραφου XML αναπαριστώνται στις δύο κωδικοποιήσεις, ως ακολούθως, χρησιµοποιώντας κατάλληλες ετικέτες.
<A> <C> <B> <D/> </B> <E> <G> <H/> <I/> </G> </E> <F/> </C> B E F 111 112 113 D G 1111 1121 H A 1 C 11 I 11211 11212 B [1,2] E [3,6] F [7,7] [1,1] D H A C [1,9] [1,8] G [3,5] [3,3] I [4,4] </A> Prefix based Interval based Στην κωδικοποίηση βασισµένη σε προθέµατα, σε κάθε επίπεδο τα παιδιά ενός κόµβου διακρίνονται αρχικά από ένα σύµβολο ενός αλφαβήτου (π.χ. έναν αριθµό, χαρακτήρα). Στην συνέχεια η ετικέτα κάθε κόµβου σχηµατίζεται από το σύµβολο αυτό και από την ετικέτα του πατέρα του σαν πρόθεµα. Π.χ. ο κόµβος E έχει την ετικέτα 112 γιατί είναι το δεύτερο παιδί του κόµβου C µε ετικέτα 11. Με αυτό τον τρόπο για να ελέγξουµε αν ο κόµβος E είναι απόγονος του κόµβου Α, µας αρκεί να ελέγξουµε εάν η ετικέτα του Α ( 1 ) είναι πρόθεµα της ετικέτας του E ( 112 ), αποφεύγοντας την αναδροµική διάσχιση του δέντρου. Σηµειώστε ότι αυτή η κωδικοποίηση επιτυγχάνει µια λεξικογραφική διάταξη των ετικετών: 1 < 11 < 111 < 1111 < 112 <... Στην κωδικοποίηση βασισµένη σε διαστήµατα, η ετικέτα κάθε κόµβου αποτελείται από δύο αριθµούς: [start, end]. Το τέλος του διαστήµατος αντιστοιχεί στην post αρίθµηση ενός κόµβου στο δέντρο (δηλ. πρώτα αριθµούνται τα παιδιά ενός κόµβου και µετά τον ίδιο τον κόµβο). Η αρχή του διαστήµατος αντιστοιχεί στον post αριθµό του πιο αριστερού απογόνου του κόµβου. Π.χ. ο κόµβος E έχει σαν ετικέτα το διάστηµα [3,6] γιατί είναι ο έκτος κόµβος που επισκεπτόµαστε στην post διάσχιση του δέντρου και γιατί ο πιο αριστερός του απόγονος είναι ο Η µε post αρίθµηση 3. Στα φύλλα του δέντρου start = end. Με αυτόν τον τρόπο, για να ελέγξουµε αν ο κόµβος E είναι απόγονος του κόµβου Α, µας αρκεί να ελέγξουµε εάν η ετικέτα του Ε ([3,6]) αντιστοιχεί σε ένα διάστηµα το οποίο περιέχεται στο αντίστοιχο διάστηµα της ετικέτας του Α ([1,9]). (α) Προτείνετε ένα σχεσιακό σχήµα για να αποθηκεύσετε κωδικοποιηµένα έγγραφα XML σύµφωνα µε τις µεθόδους προθέµατος και διαστήµατος. Σηµειώστε τα ευρετήρια (indices) που χρειαζόµαστε για γρήγορη πρόσβαση στις ετικέτες των κόµβων. Prefix(Tag, Label) Indices should be defined in both Tag and Label. Interval(Tag, Start, End) It will be helpful if indices are defined in End only or in both Tag and End.
(β) ώστε τις SQL επερωτήσεις που χρειαζόµαστε για να αποτιµήσουµε, στις δύο κωδικοποιήσεις, τις παρακάτω εκφράσεις XPath: 1. A/descendent::G 2. I/ancestor::node() Σχολιάστε τα πλεονεκτήµατα της κάθε κωδικοποίησης για την βελτιστοποίηση των παραγόµενων SQL επερωτήσεων. 1. prefix based select desc.label from Prefix desc where desc.label > 1 and desc.label < 2 and desc.tag = G interval based select desc.end from Interval desc where 1 <= desc.start and desc.end < 9 and desc.tag = G 2. prefix based prefixes( 11212 ) interval based select ans.end from Interval ans where ans.start <= 4 and ans.end > 4 Advantages in above coding Ancestors in Prefix are computed in almost constant time.