620 likes | 721 Views
Επεξεργασία Σημασιολογικού Περιεχομένου με Τεχνολογίες XML / RDF. Γλώσσα XQuery. XQuery: γλώσσα επεξεργασίας XML αρχείων W3C: www.w3c.org Είναι συναρτησιακή γλώσσα: βασίζεται σε εκφράσεις που επιστρέφουν τιμές . Χρησιμοποιεί το XML μοντέλο δεδομένων.
E N D
Επεξεργασία Σημασιολογικού Περιεχομένου με Τεχνολογίες XML/RDF
Γλώσσα XQuery • XQuery: γλώσσα επεξεργασίας XML αρχείων • W3C: www.w3c.org • Είναι συναρτησιακή γλώσσα: βασίζεται σε εκφράσεις που επιστρέφουν τιμές. • Χρησιμοποιεί το XML μοντέλο δεδομένων. • Οι εκφράσεις (expressions) XQuery επιστρέφουν μια (διατεταγμένη) σειρά από κόμβους ή τιμές. • Σημαντικό κομμάτι της XQuery είναι οι εκφράσεις μονοπατιών (path expressions). • Τα παραδείγματα που θα ακολουθήσουν βασίζονται στην αναφορά D. Chamberlin, XQuery: an XML Query Language. IBM Systems Journal, 41(4), 2002.
XML Μοντέλο Δεδομένων <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items>
XML Μοντέλο Δεδομένων <?xml version = "1.0"?> <bids> <bid> <itemno> 4</itemno> <bidder> George </bidder> <bid-amount> 150 </bid-amount> <bid-date> 21/5/2005 </bid-date> </bid> <bid> ... </bid> </bids>
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) /items • Βρες το root element items (“/”).
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) /items/item • Βρες όλα τα elements itemπου είναι παιδιά (‘/’) του root element items (“/”).
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) //item • Βρες όλα τα elements item (‘//’: απόγονος).
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) //item/seller • Βρες όλα τα elements seller που είναι παιδιά του item (‘//’: απόγονος).
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) //item/* • Βρες όλα τα elements που είναι παιδιά του item.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) /item/* • Βρες όλα τα elements που είναι παιδιά του root element item (NULL!).
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) //* • Βρες όλα τα elements.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) /*/*/seller • Βρες όλα τα elements sellerπου έχουν 2 προγόνους.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) /items/item[2] • Βρες το 2ο itemπαιδί του element items.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) //item[@status] • Βρες όλα τα item elements που έχουν attribute status.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) //item[@status=‘new’] • Βρες όλα τα item elements που έχουν attribute status με τιμή ‘new’.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml) //item[reserve-price>=100] • Βρες όλα τα item elements που έχουν παιδί το reserve-price element και το οποίο έχει value > 100.
Κατασκευαστές • Οι εκφράσεις μονοπατιών έχουν ένα σημαντικό μειονέκτημα: επιστρέφουν κόμβους. • Θα θέλαμε να υπάρχει δυνατότητα κατασκευής καινούριων element, value, καθορισμού των σχέσεων μεταξύ elements (δηλαδή το αποτέλεσμα να μην είναι μεμονωμένοι κόμβοι, αλλά δέντρο κομμάτι του μοντέλου XML), κ.λ.π. • Για το λόγο αυτό η XQuery παρέχει κατασκευαστές (constructors): • {έκφραση XQuery} • η έκφραση αποτιμάται και η {...} αντικαθίστανται από το αποτέλεσμα.
Κατασκευαστές • Παραδείγματα κατασκευαστών: <highbid> {$b/@status,$b/itemno,$b/bid-amount} </highbid> <highbid status ''{$s}'‘> <itemno>{$i}</itemno> <bid-amount> {max($bids[itemno $i]/bid-amount)} </bid-amount> </highbid>
Iterators (For) • Παράδειγμα For iterator: FOR $m in (2, 3), $n in (5, 10) RETURN <fact> {$m} times {$n} is{$m * $n} </fact> • Αποτέλεσμα <fact>2 times 5 is 10</fact> <fact>2 times 10is 20</fact> <fact>3 times 5 is 15</fact> <fact>3 times 10is 30</fact>
Iterators (For), Δέσιμο Μεταβλητών • Παράδειγμα For iterator με δέσιμο (binding) μεταβλητών: FOR $i in (1 to 3) LET $j := (1 to $i) • Αποτέλεσμα $i = 1, $j = 1 $i = 2, $j = (1, 2) $i = 3, $j = (1, 2, 3) • Το δέσιμο μεταβλητών σε For και Let δίνει την δυνατότητα στην XQuery να διασχίζει το μοντέλο δεδομένων XML και να ψάχνει για πολλαπλά ταιριάσματα.
FLoWeRs! • F: FOR • L: LET • W: WHERE • R: RETURN • FLWR (προφέρεται flower) expressions
Παράδειγμα FLOWER 1 (lily) • Βρες αντικείμενα στα οποία έχουν δοθεί δύο προσφορές. • Ερώτηση: FOR $i in document(''items.xml'')/*/item LET $b := document(''bids.xml'')/*/bid[itemno = $i/itemno] WHERE count ($b) =2 RETURN $i bind
Παράδειγμα FLOWER 1 (lily) <?xml version = "1.0"?> <bids> <bid> <itemno> 1</itemno> <bidder> George </bidder> ... </bid> <bid> <itemno> 1 </itemno> <bidder> Theo </bidder> ... </bid> <bid> <itemno> 2 </itemno> <bidder> George </bidder> ... </bid> </bids> <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 1 </itemno> .... </item> <item status=“old”> <itemno> 2 </itemno> .... </item> <item status=“old”> <itemno> 3 </itemno> .... </item>
Παράδειγμα FLOWER 2 (dahlia) • Για κάθε αντικείμενο στο οποίο έχουν δοθεί παραπάνω από δέκα προσφορές, φτιάξε ένα element popular-item που να περιέχει τον κωδικό του αντικειμένου, την περιγραφή και τον αριθμό των προσφορών. • Ερώτηση: FOR $i in document(''items.xml'')/*/item LET $b := document(''bids.xml'')/*/bid[itemno = $i/itemno] WHERE count ($b) > 10 RETURN <popular-item> { $i/itemno, $i/description, <bid-count> {count ($b)} </bid-count> } </popular-item>
Παράδειγμα FLOWER 3 (Chrysanthemum) • Έχοντας μια σειρά από elements emp, αντικατέστησε τον μισθό, την προμήθεια και τα bonus με ένα καινoύριο element pay που να περιέχει το άθροισμα των values των αρχικών elements, και βάλε σε αύξουσα σειρά το αποτέλεσμα με βάση το άθροισμα αυτό. • Ερώτηση: FOR $e in $emps RETURN <emp> { $e/name, <pay> {$e/salary + $e/commission + $e/bonus} </pay> } </emp> sortby (pay)
Παράδειγμα FLOWER 4 (Blue Pansy) • Φτιάξε ένα νέο element με όνομα recent-large-bids που να περιέχει όλα τα elements bid στο κείμενο bids.xml που έχουν αριθμό προσφορών πάνω από 1000 και ημερομηνία τελευταίας προσφοράς μετά την 1/1/2002. • Ερώτηση: <recent-large-bids> document(''bids.xml'')/*/bid[bid-amount > 1000.00] intersect document(''bids.xml'')/*/bid[bid-date > date(''2002-01-01'')] </recent-large-bids>
Παράδειγμα FLOWER 5 (Cream Pansy) • Φτιάξε ένα νέο element με όνομα recent-large-bids που να περιέχει όλα τα elements bid στο κείμενο bids.xml που έχουν αριθμό προσφορών πάνω από 1000 και ημερομηνία τελευταίας προσφοράς μετά την 1/1/2002. • Ερώτηση (με άλλον τρόπο): <recent-large-bids> document(''bids.xml'')/*/bid[bid-amount > 1000.00and bid-date > date(''2002-01-01'')] </recent-large-bids>
Παράδειγμα FLOWER 6 (Shasta Daisies) • Βρες τα αντικείμενα στο αρχείο items.xml για τα οποία όλες οι προσφορές ήταν διπλάσιες από την τιμή εκκίνησης, και τοποθέτησέ τα μέσα σε ένα νέο element με όνομα underpriced-items. • Ερώτηση: <underpriced-items> FOR $i in document(''items.xml'') WHERE every $bindocument(''bids.xml'')/*/bid[itemno = $i/itemno] satisfies $b/bid-amount > 2 * $i/reserve-price RETURN $i </underpriced-items>
Παράδειγμα FLOWER 7 (Hemerocallis) • Όρισε μια συνάρτηση που να δέχεται ως παράμετρο ένα element item και μετά να βρίσκει το μεγαλύτερο ποσό προσφοράς που έχει καταγραφεί για το συγκεκριμένο αντικείμενο. • Ορισμός συνάρτησης: define function highbid(element $item) returns decimal { max(document(''bids.xml'')//bid[itemno = $item/itemno]/bid-amount) } • Χρήση: highbid(document(''items.xml'')//item[itemno = ''1234''])
...άλλες δυνατότητες • Συνθήκες τύπων • $i instance of xs:integer • το xs:integer έρχεται από το XML schema • $k instance of element item • $l instance of element* • Switch εντολή • typeswitch (expression) as $a case element of type A return $a/state ... • If εντολή • ... και πάρα πολλά άλλα.
XML, RDF, OWL (σύνοψη προηγούμενης διάλεξης) • Ας κάνουμε μία σύνοψησχετικά με το ρόλο και την χρησιμότητα των τεχνολογιών XML, RDF/S, OWL στην ανάπτυξη του Σημασιολογικού Ιστού: • XML.Παρέχει μόνο συντακτική πληροφορία. Δεν δίνει σημασιολογία. Διευκολύνει τον εντοπισμό και την επεξεργασία των δεδομένων, μαρκάροντάς τα με tags. • XML Schema. Επεκτείνει την XML με χρήση τύπων δεδομένων. Δεν δίνει σημασιολογία. • XQuery: πλήρης γλώσσα επεξεργασίας XML αρχείων. • RDF.Δηλώνει ιδιότητες και σχέσεις για αντικείμενα στον Ιστό (resources), π.χ. Web σελίδες. Δίνει απλή σημασιολογία. • RDFSchema. Eίναι τo σύστημα τύπων (type system) του RDF. Βασίζεται σε classes και properties. Ορίζει ιεραρχίες γενίκευσης. Δίνει ικανοποιητική σημασιολογία. • Θεωρείται πολύ σημαντικό εργαλείο του Σημασιολογικού Ιστού. • Έχει ήδη διαθέσιμες πολλές γλώσσες ερωτήσεων.
XML, RDF, OWL (σύνοψη προηγούμενης διάλεξης) • Ας κάνουμε μία σύνοψησχετικά με το ρόλο και την χρησιμότητα των τεχνολογιών XML, RDF/S, OWL στην ανάπτυξη του Σημασιολογικού Ιστού: • OWL.Παρέχει πλούσια σημασιολογική πληροφορία, αλλά... • Το τίμημα είναι η δυσκολία σχεδιασμού γλωσσών ερωτήσεων. RDF/S: τουλάχιστον 4 ολοκληρωμένες γλώσσες ερωτήσεων. OWL: 1?? • Δύσκολη κατασκευή OWL αναπαραστάσεων: μέσω SW-authoring tools (χειροκίνητη διαδικασία), μέσω ημι-αυτόματης επεξεργασίας υπαρχόντων HTML σελίδων (πολύ δύσκολο!) • Προβλήματα στην επεκτασιμότητα. Συστήματα DL δουλεύουν σήμερα με ~100Κ κλάσεις, αλλά με πολύ απλή δομή.
??? ??? ??? Όλα μαζί! Semantics+reasoning Relational Data Data Exchange Επικεντρωνόμαστε λοιπόν εδώ!
RDF/S (σύνοψη) *…από Karvounarakis G., Alexaki S., Christophides V. Plexousakis D., Scholl M: RQL, A Declarative Query Language for RDF, WWW’02 Conf (pres. slides).
RDF/S (σύνοψη) Literal Class Property Subclass/Subproperty creates Artist Artifact Artist=domainOf(creates) Artifact=rangeOf(creates) RDF resource &r5 Painter &r5=instanceOf(Painter)
Γλώσσες ερωτήσεων για RDF/S • Τι χρειαζόμαστε: • εκφράσεις μονοπατιών • χρήση μεταβλητών για κόμβους αλλά και ακμές του γράφου RDF/S • δυνατότητα για δέσιμο (binding) μεταβλητών... • Mας τα δίνει και η XQuery (θυμηθείτε επίσης ότι το RDF/S έχει XML αναπαράσταση)! • Ναι, αλλά το μοντέλο δεδομένων XML δεν έχει την ίδια σημασιολογία με το RDF/S. • Όπως θα φανεί και σε παραδείγματα, η απάντηση σε ερωτήσεις περιλαμβάνει αρκετές φορές όχι μόνο τις άμεσα ανακτηθείσες κλάσεις αλλά και τις υποκλάσεις τους. • Θέλουμε επίσης η γλώσσα μας να χειρίζεται με ενιαίο τρόπο και το κομμάτι των απλών RDF statements (τα resources) αλλά και των RDFSstatements (τις κλάσεις, την ιεραρχία τους, κ.λ.π.).
Γλώσσα ερωτήσεων RQL • ΙΤΕ/FORTH • http://athena.ics.forth.gr:9090/RDF/ • Karvounarakis G., Alexaki S., Christophides V. Plexousakis D., Scholl M: RQL,A Declarative Query Language for RDF, WWW’02 Conf. • Είναι συναρτησιακή γλώσσα ερωτήσεων. • Θυμίζει στην σύνταξη την OQL. • Επίσης τα select, where, from που χρησιμοποιεί θα σας θυμίσουν την SQL. • Ξεκινάμε με τις αποκαλούμενες στην RQLbasic queries...
RQL basic queries • Βρες τις άμεσες υποκλάσεις της classArtist: • subClassOf^(Artist) • Αποτέλεσμα: Sculptor, Painter • Βρες τις υποκλάσεις της classArtist: • subClassOf(Artist) • Αποτέλεσμα: Sculptor, Painter και όλες τις υποκλάσεις τους (στο παράδειγμα δεν έχουν) • Βρες τo domain του property creates: • domain(creates) • Αποτέλεσμα: Artist
RQL basic queries • Βρες τα resources που είναι instances της class Sculptor: • ^Sculptor • Αποτέλεσμα: &r5 • Βρες τα resources που είναι instances της class Artist: • ^Artist • Αποτέλεσμα: κανένα!! • Βρες τα resources που είναι instances της class Artist ή κάποιας υποκλάσης της: • Artist • Αποτέλεσμα: &r5
RQL schema queries • ...συνεχίζουμε με schema queries, ερωτήσεις δηλαδή που αφορούν classes, properties, ιεραρχία από classes, κ.λ.π.
RQL schema queries (1) • Ποιές classes έχουν domain και range το property creates; • SELECT $C1, $C2 FROM {$C1}creates{$C2} • $...: μεταβλητήγια κόμβους (classes) • Αποτέλεσμα: (Artist, Artifact), (Artist, Painting),(Artist, Sculpture),(Painter, Artifact),(Painter, Painting),(Painter, Sculpture),(Sculptor, Artifact),(Sculptor, Painting),(Sculptor, Sculpture)
RQL schema queries (2) • Ποιά properties εμπλέκουν την classPainter (δηλαδή είναι domain ή range); • SELECT @P FROM {$C}@P WHERE $C=Painter • @...: μεταβλητήγια ακμές (properties) • Αποτέλεσμα: creates, paints, lname, fname
RQL schema queries (3) • Βρες οτιδήποτε σχετίζεται με την classPainter (δηλαδή τα resources που ανήκουν σε αυτή, τις υπερκλάσεις της και τα property): • seq(Painter, superclassof^(Painter), SELECT @P, domain(@P), range(@P) FROM {;Painter}@P) • {;Painter}: επιστρέφει την class Painter και όλες τις υπερκλάσεις της (εδώ την Artist) • Αποτέλεσμα: (Painter, Artist, (paints, Painter, Painting), (creates, Artist, Artifact))
RQL schema queries (4) • Ποιά properties εμπλέκονται στις classes/literals που ανήκουν στο range του property creates; Βρες επίσης το domain και το range των properties αυτών. • SELECT $Y, @P, range(@P), FROM creates{$Y}.@P • ‘.’: κάνει join μεταξύ όλων των class ($Y)που ανήκουν στο range του property creates και όλων των properties (@P) • Αποτέλεσμα: (Artifact, exhibited, Museum), (Painting, exhibited, Museum), (Sculpture, exhibited, Museum)(Painting, technique, string)
RQL data queries • ...συνεχίζουμε με data queries, ερωτήσεις δηλαδή που αφορούν resources
RQL data queries (5) • Ποιά resources έχουν μεταβληθεί μετά το 2000; • SELECT Χ FROM Museum{X}.last_modified{Y} WHERE Y >= 01-01-2000 • X, Y: μεταβλητές για resources • Αποτέλεσμα: &r4
RQL data queries (6) • Βρες τα oνόματα των καλλιτεχνώντων οποίων τα έργα τέχνηςεκτίθενται σε μουσεία, μαζί με τις ονομασίες των μουσείων. • SELECT V, R, Y, Z FROM {X}creates.exhibited{Y}.title{Z}, {X}fname{V}, {X}lname{R}
RQL mixed query • ...συνεχίζουμε με ένα παράδειγμα mixed query, ερώτησης δηλαδή που αφορά resources αλλά και classes, properties, ιεραρχία από classes, κ.λ.π.
RQL mixed query (7) • Βρες τις περιγραφές των resources των οποίων το URI περιέχει το ‘www.museum.es’. • SELECT X, (SELECT $W, (SELECT @P, Y FROM {X;$W}@P{Y}) FROM $W{X}) FROM Resource{X} WHERE X like "www.museum.es"
RQL mixed query • Βρες τις περιγραφές των resources των οποίων το URI περιέχει το ‘www.museum.es’. • SELECT X, (SELECT $W, (SELECT @P, Y FROM {X;$W}@P{Y}) FROM $W{X}) FROM Resource{X} WHERE X like "www.museum.es“ • Για κάθε resource X, η μεταβλητή $W παίρνει τις classes των οποίων το Χ είναι instance. • Για κάθε τέτοια class $W, η μεταβλητή @P παίρνει όλα τα properties που έχουν $W στο domain και Χ ως source value ({X;$W}@P{Y})