Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 5. Επερώτηση XML Εγγράφων: Εισαγωγή στη Γλώσσα XQuery ιαχείριση εδομένων στον Παγκόσμιο Ιστό Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων ευτέρα 31/10/2016
XQuery Η XQuery επεκτείνει την XPath σε μια γλώσσα επερωτήσεων που έχει παρόμοια δύναμη με την SQL Η XQuery είναι μια γλώσσα που χρησιμοποιεί expressions (expression language) Σαν τη σχεσιακή άλγεβρα Οποιοδήποτε XQuery expression μπορεί να αποτελέσει όρισμα για ένα άλλο XQuery expression Αντίθετα με τη σχεσιακή άλγεβρα Όπου ο μοναδικός τύπος είναι η σχέση, η XQuery διαθέτει ένα πιο εκλεπτυσμένο σύστημα τύπων Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 2
Το Σύστημα Τύπων της XQuery Atomic values: συμβολοσειρές, ακέραιοι, κτλ. Και επιπλέον κάποιες παραγόμενες τιμές true(), date( 2004-09-30 ) Nodes Επτά τύποι κόμβων Θα ασχοληθούμε μόνο με τους τέσσερις βασικότερους από αυτούς Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 3
Μερικοί Τύποι Κόμβων Element nodes Όμοιοι με κόμβους στα ημιδομημένα δεδομένα Περιγράφονται από!element declarations στα DTD Attribute nodes Είναι τα attributes Περιγράφονται από!attlist declarations στα DTD Text nodes #PCDATA Document nodes Αναπαριστούν αρχεία Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 4
Παράδειγμα XML Εγγράφου <BARS> <BAR name = JoesBar > <PRICE thebeer = Bud >2.50</PRICE> <PRICE thebeer = Miller >3.00</PRICE> </BAR> <BEER name = Bud soldby = JoesBar SuesBar /> </BARS> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 5
Παράδειγμα Κόμβων BARS Καφέ = element Ροζ = attribute Γκρι = text BAR name = JoesBar BEER name = Bud SoldBy = PRICE thebeer = Bud PRICE thebeer = Miller 2.50 3.00 Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 6
Document Nodes Έχουν τη μορφή document( <filename> ) Καθορίζουν το έγγραφο στο οποίο εφαρμόζεται/απευθύνεται η επερώτηση Παράδειγμα document( /usr/ullman/bars.xml ) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 7
XQuery Values Item = ένας κόμβος (node) ή μια atomic value Value = ταξινομημένη ακολουθία από μηδέν ή περισσότερα items Παραδείγματα () = κενή ακολουθία ( Hello, World ) ( Hello, <PRICE>2.50</PRICE>, 10) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 8
FLWR Expressions Αποτελούνται από Ένα ή περισσότερα for ή/και let clauses Έπειτα, ένα προαιρετικό where clause Ένα return clause Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 9
Σημασιολογία των FLWR Expressions Κάθε for δημιουργεί ένα βρόχο (loop) To let παράγει απλά έναν τοπικό ορισμό Σε κάθε επανάληψη των nested loops, αποτιμάται το where clause Εάν το where clause επιστρέψει TRUE, καλείται το return clause, και η τιμή του προστίθεται στην έξοδο (output) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 10
FOR Clauses for <variable> in <expression>,... Οι μεταβλητές ξεκινούν με $ Μια for μεταβλητή παίρνει καθεμιά από τις τιμές της ακολουθίας που καθορίζεται στο expression Ο,τιδήποτε ακολουθεί το for εκτελείται μία φορά για κάθε τιμή της μεταβλητής Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 11
Παράδειγμα: FOR Το περιεχόμενο γίνεται expand αντικαθιστώντας μεταβλητές και path expressions με τις τιμές τους for $beer in document( bars.xml )/BARS/BEER/@name return <BEERNAME> {$beer} </BEERNAME> Το $beer παίρνει τις τιμές των name attributes όλων των BARS/BEER του εγγράφου Το αποτέλεσμα είναι μια λίστα από tagged names <BEERNAME>Bud</BEERNAME> <BEERNAME>Miller</BEERNAME>... Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 12
LET Clauses let <variable> := <expression>,... Η τιμή της μεταβλητής γίνεται η ακολουθία των items που καθορίζονται από την expression. Προσέξτε ότι το let δεν προκαλεί τις επαναλήψεις Αυτό συμβαίνει λόγω του for Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 13
Παράδειγμα LET let $d := document( bars.xml ) let $beers := $d/bars/beer/@name return <BEERNAMES> {$beers} </BEERNAMES> Επιστρέφει ένα element με όλα τα names των beers: <BEERNAMES>Bud Miller </BEERNAMES> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 14
Ακολουθώντας τα IDREFs Η XQuery (αλλά όχι η XPath) επιτρέπει τη χρήση paths που ακολουθούν attributes που είναι IDREFs Εάν το x συμβολίζει μια ακολουθία ενός ή περισσότερων IDREFs, τότε x => y συμβολίζει όλα τα elements με tag y των οποίων τα IDs είναι ένα από τα IDREFs Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 15
Παράδειγμα Βρείτε όλα τα beer elements όπου η beer πωλείται στο Joe s Bar για λιγότερο από 3.00 Στρατηγική: Το $beer θα εκτελέσει ένα επαναληπτικό βρόχο παίρνοντας τιμές των beer elements Για κάθε $beer, θέτουμε το $joe να είναι είτε το JoesBar element, εφόσον ο Joe πουλάει την μπύρα, ή η κενή ακολουθία εάν όχι Ελέγχουμε εάν ο $joe πουλάει την μπύρα για < 3.00 Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 16
Παράδειγμα: Το Query Το attribute soldby είναι τύπου IDREFS. Ακολουθείται κάθε ref σε BAR και γίνεται έλεγχος εάν το όνομα είναι JoesBar let $d := document( bars.xml ) for $beer in $d/bars/beer let $joe := $beer/@soldby=>bar[@name= JoesBar ] let $joeprice := $joe/price[@thebeer=$beer/@name] where $joeprice < 3.00 return <CHEAPBEER> {$beer} </CHEAPBEER> Οι τιμές των $beer, $joe, $joeprice περνώνται στο RETURN clause, μόνο εφόσον το string στο PRICE element του $joeprice είναι < 3.00 Εύρεση του PRICE subelement (του JoesBar element) που αναπαριστά οποιαδήποτε μπύρα είναι αυτή τη στιγμή η $beer Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 17
Order-By Clauses Τα FLWR expressions είναι στην πραγματικότητα FLWOR expressions Ένα order-by clause μπορεί να προηγείται του return clause Σύνταξη: order by <expression> Προαιρετικά ascending ή descending Το expression αποτιμάται για κάθε output element Έτσι καθορίζεται η σειρά στην ακολουθία εξόδου Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 18
Παράδειγμα Order By Βρείτε όλες τις τιμές της Bud σε αύξουσα σειρά let $d := document( bars.xml ) for $p in $d/bars/bar/price[@thebeer= Bud ] order by $p return { $p } Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 19
Κατηγορήματα (Predicates) Κανονικά οι συνθήκες υπονοούν existential quantification () Παράδειγμα /BARS/BAR[@name] σημαίνει όλα τα bars που έχουν name Παράδειγμα /BARS/BAR[@name= JoesBar ]/PRICE = /BARS/BAR[@name= SuesBar ]/PRICE σημαίνει ο Joe και η Sue έχουν τουλάχιστον μία κοινή τιμή Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 20
Άλλοι Τελεστές Χρήση τελεστών σύγκρισης Fortran για σύγκριση με atomic values μόνο eq, ne, gt, ge, lt, le Αριθμητικοί τελεστές +, -, *, div, idiv, mod Εφαρμόζονται σε οποιεσδήποτε expressions που αφορούν αριθμητικές ή date/time τιμές Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 21
Effective Boolean Values Η effective boolean value (EBV) μιας expression είναι Η ίδια η τιμή, εάν η expression είναι boolean FALSE, εάν η expression αποτιμάται σε 0, κενό string, () κενή ακολουθία TRUE, σε κάθε άλλη περίπτωση Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 22
Παραδείγματα EBV @name= JoesBar έχει EBV TRUE ή FALSE Ανάλογα με το εάν το name attribute είναι JoesBar /BARS/BAR[@name= GoldenRail ] έχει EBV TRUE Εάν κάποιο bar ονομάζεται GoldenRail EBV FALSE Εάν δεν υπάρχει κανένα τέτοιο bar Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 23
Λογικοί Τελεστές E1 and E2, E1 or E2, not(e), if (E1) then E2 else E3 εφαρμόζονται σε οποιεσδήποτε expressions Πρώτα υπολογίζονται τα EBVs των expressions Παράδειγμα not(3 eq 5 or 0) έχει τιμή TRUE Επίσης: true() και false() είναι συναρτήσεις που επιστρέφουν τιμές TRUE και FALSE Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 24
Quantifier Expressions Κάποιο $x in E1 ικανοποιεί E2 1. Αποτιμάται η ακολουθία E1 2. Έστω $x (οποιαδήποτε μεταβλητή) ένα item στην ακολουθία, και αποτίμησε E2 3. Επιστρέφει TRUE εάν η E2 έχει EBV TRUE για τουλάχιστον μία $x Ανάλογα: κάθε $x in E1 ικανοποιεί E2 Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 25
Σειρά στο Έγγραφο (Document Order) Σύγκριση με βάση το document order: << και >> Παράδειγμα $d/bars/beer[@name= Bud ] << $d/bars/beer[@name= Miller ] Είναι true αν και μόνο αν το Bud element εμφανίζεται πριν το Miller element στο έγγραφο $d Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 26
Τελεστές Συνόλων union, intersect, except λειτουργούν σε ακολουθίες κόμβων Έχουν έννοια ανάλογη με την SQL Το αποτέλεσμα αποκλείει διπλότυπα Το αποτέλεσμα εμφανίζεται με βάση το document order Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 27
For και Let Clauses Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 28
Παράδειγμα XQuery που Περιέχει όλα τα Clauses Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 29
Ένα Μεγαλύτερο Παράδειγμα XQuery INPUT Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 30
Ένα Μεγαλύτερο Παράδειγμα XQuery XQuery Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 31
Ένα Μεγαλύτερο Παράδειγμα XQuery OUTPUT Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 32
Ένα Πολυπλοκότερο Παράδειγμα XQuery INPUT Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 33
Ένα Πολυπλοκότερο Παράδειγμα XQuery Βρες τους τίτλους των video που συμμετέχει ηθοποιός με μικρό όνομα Lisa //video[actorref=//actors/actor[ends-with(., 'Lisa')]/@id]/title XQuery Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 34
Πηγές Αναφοράς XQuery 1.0: An XML Query Language http://www.w3.org/tr/xquery/ XQuery 1.0 and XPath 2.0 Functions and Operators http://www.w3.org/tr/xpath-functions/ Παράδειγμα XQuery http://www.stylusstudio.com/xquery_primer.html Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 35