200 likes | 218 Views
חלק XQuery : IV. XML Query. ביבליוגרפיה - DTD. <!ELEMENT bib (book*)> <!ELEMENT book (title, (author+ | editor+ ), publisher, price)> <!ATTLIST book year CDATA #REQUIRED > <!ELEMENT author (last, first)> <!ELEMENT editor (last, first, affiliation )> <!ELEMENT title (#PCDATA)>
E N D
חלק XQuery :IV XML Query
ביבליוגרפיה - DTD <!ELEMENT bib (book*)> <!ELEMENT book (title, (author+ | editor+ ), publisher, price)> <!ATTLIST book year CDATA #REQUIRED > <!ELEMENT author (last, first)> <!ELEMENT editor (last, first, affiliation )> <!ELEMENT title (#PCDATA)> <!ELEMENT last (#PCDATA)> <!ELEMENT first (#PCDATA)> <!ELEMENT affiliation (#PCDATA)> <!ELEMENT publisher (#PCDATA)> <!ELEMENT price (#PCDATA)>
ביבליוגרפיה – books.xml <bib> <book year="1994"> <title>TCP/IP Illustrated</title> <author><last>Stevens</last><first>W.</first></author> <publisher>Addison-Wesley</publisher> <price>65.95</price> </book> <book year="1992"> <title>Advanced Programming in the UNIX Environment</title> <author><last>Stevens</last><first>W.</first> </author> <publisher>Addison-Wesley</publisher> <price>65.95</price> </book>
ביבליוגרפיההמשך… <book year="2000"> <title>Data on the Web</title> <author><last>Abiteboul</last><first>Serge</first></author> <author><last>Buneman</last><first>Peter</first></author> <author><last>Suciu</last><first>Dan</first></author> <publisher>Morgan Kaufmann Publishers</publisher> <price>65.95</price> </book> <book year="1999"> <title>The Economics of Technology and Content for Digital TV</title> <editor><last>Gerbarg</last><first>Darcy</first> <affiliation>CITI</affiliation></editor> <publisher>Kluwer Academic Publishers</publisher> <price>129.95</price> </book> </bib>
יוצרים – Constructors (1) • Constructorsמשמשים ליצירת צמתי ומסמכי XML. • דוגמאות: יצירה פשוטה של צמתי אלמנט:<book><title>Database systems</title></book> יצירת צמתים דינאמית:<booklist>{doc("books.xml")/bib/book/title}</booklist> תוצאה: <booklist> <title>TCP/IP Illustrated</title> <title>Advanced Programming in the UNIX Environment</title>... </booklist>
יוצרים (2) • דרך אלטרנטיבית ליצירת צמתים: element book{ attribute year {1977}, element author {doc("books.xml")/bib/book/author[2]/*}, element {node_name(doc("books.xml")/bib/book[1]/price} {4.3*10} } תוצאה: <book year="1977"> <author><last>Buneman</last><first>Peter</first></author> <price>43</price> </book>
FLWOR (For, Let, Where, Order by, Return) • For -for$bindoc("books.xml")/bib/book • קושר את המשתנה b$ לכל איבר שמוחזר ע"י ביטוי ה-in. • Let - let$authors := $b/author • מציב את תוצאת הביטוי $b/author למשתנה $authors. משמש בעיקר למניעת כפילויות בקוד. • Where - where$authors/first = "Peter” • מתאר תנאים עבור התוצאה. החישוב בחלק ה-returnיבוצע אם תנאים אלו מתקיימים. • Order by - orderby$b/titledescending • מתאר את סדר המיון עבור התוצאה. • Return - return$b/title • מתאר מה יוחזר ממבנה ה- FLWOR.
דוגמא • מה מבצע הביטוי מהשקף הקודם? for$bindoc("books.xml")/bib/booklet$authors := $b/authorwhere$authors/first = "Peter”orderby$b/title descendingreturn$b/title • תוצאה: <title>Data on the Web</title> • תשובה: הביטוי מחזיר את כל כותרות הספרים עם מחבר כלשהו ששמו הפרטי הוא Peter, ממוינים בסדר יורד לפי הכותרת.
דוגמא • החזר את כל הספרים שנכתבו ע"י סרג' סוסיו. • הצעה לפתרון: for$bindoc("books.xml")//book where$b/author/first = "Serge"and $b/author/last = "Suciu" return$b
לא אותו סופר דוגמא: תוצאות מפתיעות <book year="2000"> <title>Data on the Web</title> <author> <last>Abiteboul</last> <first>Serge</first> </author> <author> <last>Buneman</last> <first>Peter</first> </author> <author> <last>Suciu</last> <first>Dan</first> </author> <publisher>Morgan Kaufmann Publishers</publisher> <price>65.95</price> </book>
דוגמא: הדרך הנכונה for$bindoc("books.xml")//book where$b/author[first="Serge"and last="Suciu"] return$b מקבל ערך אמת אם תוצאת הביטוי לא ריקה
נתון קובץ XML של ביקורות ספרים reviews.xml. דוגמא: ביצוע Outer Join <reviews> <entry> <title>Data on the Web</title> <price>34.95</price> <review> A very good discussion of semi-structured database systems and XML. </review> </entry> <entry> <title>Advanced Programming in the Unix environment</title> <price>65.95</price> <review> A clear and detailed discussion of UNIX programming. </review> </entry>
המשך reviews.xml <entry> <title>TCP/IP Illustrated</title> <price>65.95</price> <review> One of the best books on TCP/IP. </review> </entry> <entry> <title>TCP/IP Illustrated</title> <price>66.95</price> <review> The book is a complete and detailed guide to the entire TCP/IP protocol suite with an important difference from other books on the subject. </review> </entry> </reviews>
המשימה: • עבור כל הספרים שיש עבורם ביקורות במסמך reviews.xml החזר את פרטי הספרים (כותרת ושמות מחברים) ביחד עם הביקורות בתוך צומת book-with-review. • עבור כל הספרים ללא ביקורות החזר רק את פרטיהם בצומת book. • על התוצאה להיות בנוסח Outer Join, כלומר כל צומת book-with-review יכיל ביקורת אחת בלבד!
התוצאה הצפויה: <result> <book-with-review> <title>TCP/IP Illustrated</title> <author><last>Stevens</last><first>W.</first></author> <review>One of the best books on TCP/IP.</review> </book-with-review> <book-with-review> <title>TCP/IP Illustrated</title> <author><last>Stevens</last><first>W.</first></author> <review>The book is a complete and detailed guide to the entire TCP/IP protocol suite-with an important difference from other books on the subject. </review> </book-with-review> <book-with-review> <title>Advanced Programming in the Unix environment</title> <author><last>Stevens</last><first>W.</first></author> <review>A clear and detailed discussion of UNIX programming. </review> </book-with-review>
התוצאה הצפויה המשך... <book-with-review> <title>Data on the Web</title> <author><last>Abiteboul</last><first>Serge</first></author> <author><last>Buneman</last><first>Peter</first></author> <author><last>Suciu</last><first>Dan</first></author> <review>A very good discussion of semi-structured database systems and XML. </review> </book-with-review> <book> <title>The Economics of Technology and Content for Digital TV </title> </book> </result> לספר זה אין מחברים ואין ביקורת
הפתרון: <result> { for$bindoc("books.xml")//book let$t := (for$aindoc("reviews.xml")//entry where ($b/title = $a/title) return$a/review) return if ($t) then for$cin$treturn<book-with-review>{$b/title, $b/author, $c}</book-with-review> else <book>{$b/title, $b/author}</book> } </result>
דוגמא – הפיכת היררכית המסמך • ברצוננו ליצור "מסמך חדש" שבו היררכית הצמתים תהיה הפוכה לזו של המסמך books.xml. • בפרט, נרצה שצמתי publisher יהיו כעת בראש ההיררכיה ויכילו כותרות (צמתי title) של כל הספרים שהוצאו לאור על ידם. • שימו לב, שבמסמך books.xml צמתי publisher נמצאים בתחתית ההיררכיה עם צמתי books מעליהם.
הפיכת היררכית המסמך – התוצאה הצפויה <listing> <publisher> <name>Addison-Wesley</name> <title>Advanced Programming in the UNIX Environment</title> <title>TCP/IP Illustrated</title> </publisher> <publisher> <name>Kluwer Academic Publishers</name> <title>The Economics of Technology and Content for Digital TV</title> </publisher> <publisher> <name>Morgan Kaufmann Publishers</name> <title>Data on the Web</title> </publisher> </listing>
הפתרון: • <listing>{ for$pindistinct-values(doc("books.xml")//publisher) orderby$p return <publisher> <name> { $p } </name> { for$bindoc("books.xml")/bib/book where$b/publisher = $p orderby$b/title return$b/title } </publisher> }</listing> מחזיר את כל ערכי הטקסט השונים של הצמתים