Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 236363 מערכות מסדי נתונים 9. מבוא קל ל-XQuery שקפים:אלדר פישר.

Similar presentations


Presentation on theme: "1 236363 מערכות מסדי נתונים 9. מבוא קל ל-XQuery שקפים:אלדר פישר."— Presentation transcript:

1 1 236363 מערכות מסדי נתונים 9. מבוא קל ל-XQuery שקפים:אלדר פישר

2 2 מקורות עבור XQuery ספר : Howard Katt (editor), XQuery from the Experts, Addison-Wesley בעיקר הפרק הראשון: Jonathan Robie, XQuery : A Guided Tour אשר ניתן למצוא אותו גם ברשת: http://www.datadirect.com/techzone/xml/xquery/docs/katz_c01.pdf שקפים עם מידע נוסף: Oded Shmueli, Introduction to XQuery מימוש לדוגמא של XQuery הכולל ממשק דרך הרשת: http://www.galaxquery.org

3 3 XPath ו-XQuery השפה XQuery בנויה למעשה כהרחבה של XPath, כך שכל ביטוי חוקי ב-XPath הוא בפרט ביטוי חוקי ב-XQuery. ליתר דיוק, XQuery 1.0 כוללת בתוכה את XPath 2.0, שהיא גירסא מתקדמת יותר של XPath. חלק מהמבנים שנלמד שייכים למעשה ל-XPath 2.0 ולא רק ל-XQuery.

4 4 התייחסות למסמכים חיצוניים ב-XQuery יש יכולת לעבוד עם מספר מסמכים במקביל. איך נקבע לאיזה מהמסמכים מתייחס ביטוי חיפוש נתון ? הפונקציה doc(name) מחזירה את צומת השורש של המסמך המתואר ע"י הביטוי name (כאשר ביטוי זה מפורש כמחרוזת המכילה URI). דוגמא: הביטוי doc(“xmpbib.xml”)/bib/book יבצע חיפוש של ספרים במסמך ביבליאוגרפיה ששמו הוא “xmpbib.xml”. הסכימה של קובץ זה תתואר בהמשך ותשמש אותנו בדוגמאות (הקובץ הנ"ל משמש חלק מדוגמת-שימוש של XQuery המתוארת בפירוט באתר הרשמי של w3.org). ניתן להתייחס גם לסדרה של צמתי שורש של מספר מסמכים, באמצעות הפונקציה collection(names).

5 5 המסמך לדוגמא xmpbib.xml במהלך ההרצאות על XQuery נתייחס למסמך בשם xmpbib.xml המכיל פרטים על מספר ספרים. אנו נניח שמסמך זה מציית ל-DTD הבא: צמתים עם התוויות title, last, first, affiliation, publisher, price מוגדרים כמכילי #PCDATA בלבד וללא תכונות. נניח גם שצומת המסמך bib הוא בן יחיד של המסמך xmpbib.xml.

6 6 אופרטורים ופונקציות נוספות ב-XPath בגרסת ה-XPath המשמשת ב-XQuery מתווספים אופרטורים נוספים. כמה מהחשובים בהם: טיפול בקבוצות של צמתים: לאופרטור האיחוד "ו", שכאן ניתן גם לכתוב אותו כ-“union”, מתווספים גם האופרטורים של חיתוך, “intersect”, וחיסור, “except”. השוואות צמתים: האופרטור “is” ייתן ערך “true()” אם ורק אם הביטויים משני צדדיו יקבלו צומת זהה (ולא סידרה) בחישוב ערכם (בניגוד ל-"=" שיתן “true()” גם עבור שני צמתים שונים בעלי אותו תוכן). האופרטורים " >" יתנו ערך אמת עבור הצמתים המושווים בהתאם לסדר המסמך. על האופרטורים האחרים, ועל הגידול המשמעותי בפונקציות, הנכם מוזמנים לקרוא באתר של w3.org.

7 7 סדרות ב-XQuery וב-XPath 2.0 במקום קבוצות הצמתים של XPath 1.0, יהיו לנו עתה סדרות של עצמים. הסדרות יוכלו להכיל גם צמתים וגם ערכים, אולם לא סדרות אחרות. תוצאה של ביטוי שאמור להכיל סדרה כאיבר בסדרה אחרת "תשוטח" ע"פ הדוגמא הבאה: (1, (2, 3), 4)  (1, 2, 3, 4) סדרות יכולות להכיל חזרות ושומרים לגביהן סדר. עם זאת, אופרטורים המותאמים לקבוצות צמתים, כגון union, יתעלמו מסדר זה ויחזרו לסדר המסמך, וכן יוציאו הודעת שגיאה אם הסדרות המעורבות מכילות ערכים שאינם צמתים. ניתן לבנות סדרות ב-XQuery באמצעות ביטויים מהצורה הבאה: (arg 1, arg 2, … )

8 8 עוד על סדר המסמך סדר המסמך חשוב גם ב-XQuery, שכן אופרטורים המטפלים בקבוצות של צמתים (כגון intersect, union, או חיפוש בתתי העצים) יתחשבו בסדר המסמך ולא בסדר הסדרה המקורי. סדר המסמך ברור כאשר המדובר בצמתים מתוך אותו עץ. עם זאת, ב-XQuery יתכן שיהיו מספר עצי התייחסות במקביל. במקרה זה, הסדר בין שני צמתים מעצים שונים יכול להיות שרירותי, אולם מובטח שהוא יהיה יציב  הוא לא ישתנה במהלך ביצוע השאילתה.

9 9 בניה של צמתים חדשים  Constructors בשפת ה-XQuery יש אפשרות "לייצר" עצי XML אשר אינם נמצאים כחלק מקבצי הקלט. השיטה הפשוטה ביותר לעשות זאת היא באמצעות כתיבת מקטע XML מוקף בתגים (כגון “ some text ”). מקטע כזה הוא ביטוי XQuery חוקי שתוצאתו היא צומת אלמנט חדש עם התווית, התכונות, והתוכן המצויינים. בדרך כלל נרצה אבל לחשב את תוכן הצומת באמצעות ביטוי XPath או XQuery. במקרה זה מקיפים את ביטוי החישוב בסוגריים מסולסלים “{…}”. דוגמאות: {doc(“xmpbib.xml”)/bib/book/title}

10 10 בניית צמתים  המשך ניתן גם לבנות צומת אלמנט עם תווית tag שתוכנו הוא הביטוי המחושב expr באמצעות הביטוי הבא: element tag {expr}. כאן גם אפשר להחליף את השם tag בביטוי מוקף ב-{...}, ע"פ הדוגמא element {arg} {expr}. במקרה זה תווית הצומת תהיה ערך המחרוזת של הביטוי arg. לתוספת תכונות עבור צמתים אלו, יש לבנות אותן כצמתים באמצעות הביטוי attribute label {expr} או attribute {arg} {expr}, ולשרשר את אלו לביטוי התוכן של צומת האלמנט. דוגמא: הביטוי element title {attribute language {“en”}, “Gone with the wind”} יחזיר את מקטע ה-XML Gone with the wind

11 11 ביטויים מותנים בניה של צמתים ב-XQuery יכולה להסתייע בביטויי XPath מותנים. צורתם הכללית: if (test) then expr 1 else expr 2 כאשר: test הוא ביטוי שערכו מתפרש כערך בוליאני. expr 1 הוא ביטוי לחישוב התוצאה אם test מתפרש כ-true(). expr 2 הוא ביטוי לחישוב התוצאה אם test מתפרש כ-false(). מכיוון שביטוי XQuery תמיד חייב לקבל ערך כל שהוא, תמיד חובה לכתוב גם את חלק ה-else. אם רוצים שבמקרים מסוימים תוחזר הסדרה הריקה, ניתן להשתמש עבור זו בסימון "( )".

12 12 דוגמא לביטוי מותנה נניח ש-$b הוא משתנה שערכו הוא אחד מצמתי ה-“book” של הקובץ xmpbib.xml (בהמשך נראה אפשרות לקביעת ערכים עבור משתנים). הביטוי הבא "יתרגם" את הצומת לצומת עם תווית “monograph” אם זהו ספר עם מחברים, או צומת עם תווית “handbook” אחרת (כזכור, סכימת הקובץ קובעת כי לספר יהיו או מחברים או עורכים): if ($b/author) then {$b/node()} else {$b/node()}

13 13 בניית מסמכים שלמים אחד השימושים של XQuery הוא בבניית מסמך XML תקני מלא כתשובה לשאילתה (הדבר שימושי למשל בתחום החדש יחסית של מסדי נתונים מבוססי XML). לשם כך יש להשתמש בביטוי הבא לבניית צומת-שורש של מסמך XML על תוכנו: document {expr} לדוגמא, אם נרצה להכניס את רשימת הספרים המקוצרת מאחת הדוגמאות הקודמות למסמך XML תקני שלם, נשתמש בביטוי הבא: document { {doc(“xmpbib.xml”)/bib/book/title} }

14 14 מבנה FLWOR FLWOR הוא מבנה לשאילתות XQuery בעל כושר הבעה חזק במיוחד, אשר מזכיר במידה מסוימת את מבנה השאילתות של SQL. משמעות ראשי התיבות היא For… Let… Where… Order by… Return הערה: חלק מצומצם ממבנה זה (for…return בלבד) מצוי כבר ב-XPath 2.0. כאן נראה סקירה של המבנה כפי שהוא מופיע ב-XQuery.

15 15 ביטוי for  return בסיסי בצורה הפשוטה ביותר, ביטוי זה משמש לביצוע פעולה איבר-איבר על סדרה. הצורה הכללית: for $var in domain return result כאשר : $var  המשתנה שיקבל ערכים מהסדרה. domain  ביטוי המחזיר סדרה. result  תוצאה, בד"כ תלויה ב-$var. תוצאת הביטוי תחושב כך: כל איבר (ערך או צומת) בסדרה המתוארת ע"י הביטוי domain מוצב במשתנה $var, ומחשבים עבורו את result (התוצאה יכולה להיות איבר או סדרה). כל התוצאות הנ"ל משורשרות לקבלת תוצאת הביטוי הסופית. סדר השרשור יהיה לפי סדר האיברים בסדרה domain.

16 16 דוגמאות הביטוי for $i in (1, 2, 3) return {$i} יחזיר את התוצאה: 1 2 3 (במושגים של סדרה, התוצאה תהיה שלושה צמתי אלמנט עם תווית i ותוכן מתאים). בהתייחסות לדוגמת הקובץ xmpbib.xml, הביטוי for $i in doc(“xmpbib.xml”)/bib/book/author return { $i/last/text() } יחזיר רשימה של שמות המשפחה של המחברים של הספרים בקובץ. האם יתכנו כפילויות בתוצאת הביטוי ?

17 17 for רב-מימדי ניתן לקשור מספר משתנים לסדרות בביטוי for אחד. דוגמא: for $i in (1, 2), $j in (1, 2, 3) return {($i,$j)} סדר החישוב יהיה כמו זה המוכר מ"לולאות מקוננות" בשפות תכנות. בדוגמא למעלה התוצאה תהיה: 1 1 1 2 1 3 2 1 2 2 2 3

18 18 שימוש ב-let בביטוי FLWOR חלק הביטוי let $var := expr מציב במשתנה $var את הערך המתואר ע"י expr. במקרה (הנפוץ) ש-expr הוא ביטוי המתאר סדרה, ערכו של $var יהיה שווה לסדרה כולה (ולא לאיבר מתוכה). ניתן באותו ביטוי FLWOR לשלב מספר ביטויי for וביטויי let, ובכל סדר.

19 19 דוגמא לשימוש ב-for ו-let הביטוי for $i in (1, 2, 3) let $j := ($i, $i  $i, $i  $i  $i) return {$j} יחזיר את התוצאה 1 1 1 2 4 8 3 9 27

20 20 קינון ביטויים ניתן להשתמש בביטוי FLWOR בכל מקום שבו צריכים סדרה, ובפרט ניתן להשתמש בו כחלק מביטוי FLWOR אחר. דוגמא: הביטוי הבא יבנה טבלא של לוח כפל: for $r in (1 to 5) let $t := ( for $c in (1 to 5) return {$r  $c} ) return {$t}

21 21 שימוש ב-where בביטוי FLWOR שימוש בחלק “where cond” בתוך ביטוי FLWOR יגרום לכך שהחישוב המתואר בחלק ה-return יבוצע (ותוצאתו תשורשר לתוצאה הסופית) אם ורק אם הביטוי cond מקבל ערך true() (לאחר תרגום תוצאתו לערך בוליאני), עבור ערכי המשתנים הניתנים באיטרציה הנוכחית של חלקי ה-for וה-let. דוגמא: הביטוי for $i in (1 to 4), $j in (1 to 4) where $i mod $j = 0 return {($i, $j)} יחזיר את התוצאה: 1 1 2 1 2 2 3 1 3 3 4 1 4 2 4 4

22 22 שימוש ב -where  דוגמא לצירוף ניתן להשתמש בשילוב של for ו-where לביצוע פעולות צירוף (join). לדוגמא, נניח שבידנו קובץ נוסף xmpreviews.xml המכיל ביקורות, ושנרצה עבור כל זוג של ספר וביקורת עליו לייצר רשומה המכילה את כל הפרטים. נוכל לעשות זאת באמצעות הביטוי הבא: for $b in doc(“xmpbib.xml”)/bib/book, $r in doc(“xmpreviews.xml”)/reviews/entry where$b/title=$r/title return {$b/node(), $r/review} שימו לב שספרים ללא ביקורת עבורם לא יכללו בפלט.

23 23 שימוש ב-order by בביטוי FLWOR שימוש ב-order by מאפשר לציין את הסדר שבו ביטוי ה-return יחושב עבור ערכי המשתנים שעברו את הקריטריון של where (או כל הערכים המסופקים ע"י ה-for וה-let, במידה ואין חלק where). שימוש ב-order by הוא השיטה העיקרית לקבלת תוצאות בסדר שונה מסדר המסמך. עם זאת, יש להיזהר לא "לאבד" את הסדר עקב שימוש באופרטורים נוספים. למשל, אם רוצים "לאחד" תוצאות של שני ביטויי FLWOR אז יש לשרשר אותן עם אופרטור "," ולא להשתמש באופרטור "ו" אשר יחזיר אותן לסדר המסמך.

24 24 דוגמאות לשימוש ב-order by כתיבת תוכן רשימת הספרים לפי שם המחבר הראשון (שם משפחה קודם): for $b in doc(“xmpbib.xml”)/bib/book order by $b/author[1]/last, $b/author[1]/first return $b הספרים ללא מחברים יופיעו או כולם לפני שאר הספרים, או כולם לאחריהם. שאלת המיקום של "ערכים ריקים" היא תלוית מימוש, אולם יש דרך לציינה במפורש בביטוי. דוגמא למיון בסדר יורד: for $b in doc(“xmpbib.xml”)/bib/book order by $b/@year descending return $b

25 25 סוף דבר בהרצאה זו נלמדו רק המבנים הבסיסיים בשפה XQuery. נושאים נוספים בבניית שאילתות של XQuery, וכן כל הנושא של היכולות של XQuery בבדיקת תחומים (בשילוב עם שפת הגדרת הסכימות XML-Schema), יכולים היו לתפוס חלק נכבד בקורס יעודי על XML. נזכיר רק כי בתוספת המבנים הנוספים שלא נלמדו כאן (כגון הגדרת שגרות), שפה זו היא שלמה במובן של טורינג. מספר יישומים מתקדמים יותר של XQuery (וכן מספר מלכודות שיש להזהר מהן) ינתנו בתרגיל.


Download ppt "1 236363 מערכות מסדי נתונים 9. מבוא קל ל-XQuery שקפים:אלדר פישר."

Similar presentations


Ads by Google