Date post: | 20-Dec-2015 |
Category: |
Documents |
View: | 231 times |
Download: | 1 times |
1
236363מערכות מסדי נתונים
XQuery. מבוא קל ל-9
אלדר פישרשקפים:
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
XPath-ו XQuery
, כך שכל XPath בנויה למעשה כהרחבה של XQueryהשפה
.XQuery הוא בפרט ביטוי חוקי ב-XPathביטוי חוקי ב-
, שהיא XPath 2.0 כוללת בתוכה את XQuery 1.0ליתר דיוק,
. חלק מהמבנים שנלמד XPathגירסא מתקדמת יותר של
.XQuery ולא רק ל-XPath 2.0שייכים למעשה ל-
4
התייחסות למסמכים חיצוניים יש יכולת לעבוד עם מספר מסמכים במקביל. XQueryב-
איך נקבע לאיזה מהמסמכים מתייחס ביטוי חיפוש נתון ?
מחזירה את צומת השורש של המסמך doc(name)הפונקציה (כאשר ביטוי זה מפורש כמחרוזת nameהמתואר ע"י הביטוי
).URIהמכילה
יבצע חיפוש של doc(“xmpbib.xml”)/bib/bookדוגמא: הביטוי . ”xmpbib.xml“ספרים במסמך ביבליאוגרפיה ששמו הוא
הסכימה של קובץ זה תתואר בהמשך ותשמש אותנו בדוגמאות XQuery(הקובץ הנ"ל משמש חלק מדוגמת-שימוש של
).w3.orgהמתוארת בפירוט באתר הרשמי של
ניתן להתייחס גם לסדרה של צמתי שורש של מספר מסמכים, .collection(names)באמצעות הפונקציה
5
xmpbib.xmlהמסמך לדוגמא xmpbib.xml נתייחס למסמך בשם XQueryבמהלך ההרצאות על
המכיל פרטים על מספר ספרים. אנו נניח שמסמך זה מציית הבא: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) >
title , last , first , affiliation , publisher , priceצמתים עם התוויות בלבד וללא תכונות.PCDATA#מוגדרים כמכילי
הוא בן יחיד של המסמך bibנניח גם שצומת המסמך xmpbib.xml.
6
XPathאופרטורים ופונקציות נוספות ב- מתווספים אופרטורים XQuery המשמשת ב-XPathבגרסת ה-
נוספים. כמה מהחשובים בהם:
", שכאן ניתן ו לאופרטור האיחוד "טיפול בקבוצות של צמתים:, מתווספים גם האופרטורים של ”union“גם לכתוב אותו כ-
.”except“, וחיסור, ”intersect“חיתוך,
אם ורק אם ()”true“ ייתן ערך ”is“ האופרטור השוואות צמתים:הביטויים משני צדדיו יקבלו צומת זהה (ולא סידרה) בחישוב
גם עבור שני צמתים שונים ()”true“" שיתן =ערכם (בניגוד ל-"" יתנו ערך אמת עבור >>", "<<בעלי אותו תוכן). האופרטורים "
הצמתים המושווים בהתאם לסדר המסמך.
על האופרטורים האחרים, ועל הגידול המשמעותי בפונקציות, .w3.orgהנכם מוזמנים לקרוא באתר של
7
XPath 2.0 וב-XQueryסדרות ב- של סדרות, יהיו לנו עתה XPath 1.0במקום קבוצות הצמתים של
עצמים.
הסדרות יוכלו להכיל גם צמתים וגם ערכים, אולם לא סדרות אחרות. תוצאה של ביטוי שאמור להכיל סדרה כאיבר בסדרה
אחרת "תשוטח" ע"פ הדוגמא הבאה:(1, (2, 3), 4) (1, 2, 3, 4)
סדרות יכולות להכיל חזרות ושומרים לגביהן סדר. עם זאת, , יתעלמו unionאופרטורים המותאמים לקבוצות צמתים, כגון
מסדר זה ויחזרו לסדר המסמך, וכן יוציאו הודעת שגיאה אם הסדרות המעורבות מכילות ערכים שאינם צמתים.
באמצעות ביטויים מהצורה הבאה:XQueryניתן לבנות סדרות ב-
(arg1, arg2, … )
8
עוד על סדר המסמך
, שכן אופרטורים המטפלים XQuery חשוב גם ב-סדר המסמך
, או חיפוש בתתי intersect, unionבקבוצות של צמתים (כגון
העצים) יתחשבו בסדר המסמך ולא בסדר הסדרה המקורי.
סדר המסמך ברור כאשר המדובר בצמתים מתוך אותו עץ. עם
יתכן שיהיו מספר עצי התייחסות במקביל. XQueryזאת, ב-
במקרה זה, הסדר בין שני צמתים מעצים שונים יכול להיות
הוא לא ישתנה יציבשרירותי, אולם מובטח שהוא יהיה
במהלך ביצוע השאילתה.
9
בניה של צמתים חדשים Constructors
אשר אינם XML יש אפשרות "לייצר" עצי XQueryבשפת ה-נמצאים כחלק מקבצי הקלט. השיטה הפשוטה ביותר לעשות
מוקף בתגים (כגוןXMLזאת היא באמצעות כתיבת מקטע “>tag>some text</tag<” מקטע כזה הוא ביטוי .(XQuery
חוקי שתוצאתו היא צומת אלמנט חדש עם התווית, התכונות, והתוכן המצויינים.
בדרך כלל נרצה אבל לחשב את תוכן הצומת באמצעות ביטוי XPath או XQuery במקרה זה מקיפים את ביטוי החישוב .
.”}…{“בסוגריים מסולסלים
דוגמאות:<booklist>}doc(“xmpbib.xml”)/bib/book/title{</booklist><image height=“1024” width=“768” pixels=“}1024768{”/>
10
המשךבניית צמתים שתוכנו הוא הביטוי tagניתן גם לבנות צומת אלמנט עם תווית
. }element tag }expr באמצעות הביטוי הבא: exprהמחושב , }...{ בביטוי מוקף ב-tagכאן גם אפשר להחליף את השם
. במקרה זה תווית הצומת }element }arg{ }exprע"פ הדוגמא .argתהיה ערך המחרוזת של הביטוי
לתוספת תכונות עבור צמתים אלו, יש לבנות אותן כצמתים , }arg{ }expr{ attribute או }attribute label }exprבאמצעות הביטוי
ולשרשר את אלו לביטוי התוכן של צומת האלמנט.
דוגמא: הביטוי
element title }attribute language }“en”{, “Gone with the wind”{
XMLיחזיר את מקטע ה-
<title language=“en”>Gone with the wind</title>
11
ביטויים מותנים
XPath יכולה להסתייע בביטויי XQueryבניה של צמתים ב-
if (test) then expr1 else expr2מותנים. צורתם הכללית:
הוא ביטוי שערכו מתפרש כערך בוליאני.testכאשר:
expr1 הוא ביטוי לחישוב התוצאה אם test-מתפרש כ true().
expr2 הוא ביטוי לחישוב התוצאה אם test-מתפרש כ false().
תמיד חייב לקבל ערך כל שהוא, תמיד XQueryמכיוון שביטוי
.elseחובה לכתוב גם את חלק ה-
אם רוצים שבמקרים מסוימים תוחזר הסדרה הריקה, ניתן
".( )להשתמש עבור זו בסימון "
12
דוגמא לביטוי מותנה של ”book“ הוא משתנה שערכו הוא אחד מצמתי ה-b$נניח ש-
(בהמשך נראה אפשרות לקביעת ערכים xmpbib.xmlהקובץ עבור משתנים). הביטוי הבא "יתרגם" את הצומת לצומת עם
אם זהו ספר עם מחברים, או צומת עם ”monograph“תווית אחרת (כזכור, סכימת הקובץ קובעת כי ”handbook“תווית
לספר יהיו או מחברים או עורכים):
if ($b/author) then <monograph>}$b/node(){</monograph>
else <handbook>}$b/node(){</handbook>
13
בניית מסמכים שלמים תקני מלא XML הוא בבניית מסמך XQueryאחד השימושים של
כתשובה לשאילתה (הדבר שימושי למשל בתחום החדש ). לשם כך יש להשתמש XMLיחסית של מסדי נתונים מבוססי
על תוכנו:XMLבביטוי הבא לבניית צומת-שורש של מסמך
document }expr{
לדוגמא, אם נרצה להכניס את רשימת הספרים המקוצרת תקני שלם, נשתמש XMLמאחת הדוגמאות הקודמות למסמך
בביטוי הבא:
document }<booklist>}doc(“xmpbib.xml”)/bib/book/title{</booklist>
{
14
FLWORמבנה FLWOR הוא מבנה לשאילתות XQuery בעל כושר הבעה חזק
במיוחד, אשר מזכיר במידה מסוימת את מבנה השאילתות של SQL.
משמעות ראשי התיבות היא
For… Let… Where… Order by… Return
בלבד) מצוי כבר for…returnהערה: חלק מצומצם ממבנה זה (
. כאן נראה סקירה של המבנה כפי שהוא מופיע XPath 2.0ב-.XQueryב-
15
בסיסיforreturnביטוי בצורה הפשוטה ביותר, ביטוי זה משמש לביצוע פעולה
for $var in domainאיבר-איבר על סדרה. הצורה הכללית: return result
המשתנה שיקבל ערכים מהסדרה.var $כאשר: domain .ביטוי המחזיר סדרה
result -תוצאה, בד"כ תלויה ב $var.
תוצאת הביטוי תחושב כך: כל איבר (ערך או צומת) בסדרה , ומחשבים var$ מוצב במשתנה domainהמתוארת ע"י הביטוי
(התוצאה יכולה להיות איבר או סדרה). כל resultעבורו את התוצאות הנ"ל משורשרות לקבלת תוצאת הביטוי הסופית.
.domainסדר השרשור יהיה לפי סדר האיברים בסדרה
16
דוגמאותהביטוי
for $i in (1, 2, 3) return <i>}$i{</i>יחזיר את התוצאה:
<i>1</i><i>2</i><i>3</i>(במושגים של סדרה, התוצאה תהיה שלושה צמתי אלמנט עם
ותוכן מתאים).iתווית
, הביטויxmpbib.xmlבהתייחסות לדוגמת הקובץ for $i in doc(“xmpbib.xml”)/bib/book/authorreturn <authorlast> } $i/last/text() { </authorlast>
יחזיר רשימה של שמות המשפחה של המחברים של הספרים בקובץ.
האם יתכנו כפילויות בתוצאת הביטוי ?
17
forרב-מימדי אחד.forניתן לקשור מספר משתנים לסדרות בביטוי
דוגמא:
for $i in (1, 2), $j in (1, 2, 3)
return <tuple>}($i,$j){</tuple>
סדר החישוב יהיה כמו זה המוכר מ"לולאות מקוננות" בשפות תכנות. בדוגמא למעלה התוצאה תהיה:
<tuple>1 1</tuple><tuple>1 2</tuple><tuple>1 3</tuple>
<tuple>2 1</tuple><tuple>2 2</tuple><tuple>2 3</tuple>
18
FLWOR בביטוי letשימוש ב- את הערך var$ מציב במשתנה let $var := exprחלק הביטוי
.exprהמתואר ע"י
הוא ביטוי המתאר סדרה, ערכו של exprבמקרה (הנפוץ) ש-$var.(ולא לאיבר מתוכה) יהיה שווה לסדרה כולה
וביטויי for לשלב מספר ביטויי FLWORניתן באותו ביטוי let.ובכל סדר ,
19
let ו-forדוגמא לשימוש ב-הביטוי
for $i in (1, 2, 3)
let $j := ($i, $i$i, $i$i$i)
return <tuple>}$j{</tuple>
יחזיר את התוצאה
<tuple>1 1 1</tuple>
<tuple>2 4 8</tuple>
<tuple>3 9 27</tuple>
20
קינון ביטויים בכל מקום שבו צריכים סדרה, FLWORניתן להשתמש בביטוי
אחר.FLWORובפרט ניתן להשתמש בו כחלק מביטוי
דוגמא: הביטוי הבא יבנה טבלא של לוח כפל:
for $r in (1 to 5)
let $t := (
for $c in (1 to 5)
return <cell pos=“}$c{”>}$r$c{</cell>
)
return <row pos=“}$r{”>}$t{</row>
21
FLWOR בביטוי whereשימוש ב- יגרום לכך FLWOR בתוך ביטוי ”where cond“שימוש בחלק
יבוצע (ותוצאתו תשורשר returnשהחישוב המתואר בחלק ה- ()true מקבל ערך condלתוצאה הסופית) אם ורק אם הביטוי
(לאחר תרגום תוצאתו לערך בוליאני), עבור ערכי המשתנים .let וה-forהניתנים באיטרציה הנוכחית של חלקי ה-
דוגמא: הביטויfor $i in (1 to 4), $j in (1 to 4)where $i mod $j = 0return <tuple>}($i, $j){</tuple>
יחזיר את התוצאה:<tuple>1 1</tuple> <tuple>2 1</tuple> <tuple>2 2</tuple><tuple>3 1</tuple> <tuple>3 3</tuple><tuple>4 1</tuple> <tuple>4 2</tuple> <tuple>4 4</tuple>
22
דוגמא לצירוףwhere שימוש ב- לביצוע פעולות צירוף where ו-forניתן להשתמש בשילוב של
)join( לדוגמא, נניח שבידנו קובץ נוסף .xmpreviews.xml המכיל ביקורות, ושנרצה עבור כל זוג של ספר וביקורת עליו
לייצר רשומה המכילה את כל הפרטים. נוכל לעשות זאת באמצעות הביטוי הבא:
for $b in doc(“xmpbib.xml”)/bib/book,
$r in doc(“xmpreviews.xml”)/reviews/entry
where $b/title=$r/title
return <book>}$b/node(), $r/review{</book>
שימו לב שספרים ללא ביקורת עבורם לא יכללו בפלט.
23
FLWOR בביטוי order byשימוש ב- return מאפשר לציין את הסדר שבו ביטוי ה-order byשימוש ב-
whereיחושב עבור ערכי המשתנים שעברו את הקריטריון של , במידה ואין חלק let וה-for(או כל הערכים המסופקים ע"י ה-
where.(
הוא השיטה העיקרית לקבלת תוצאות order byשימוש ב-בסדר שונה מסדר המסמך. עם זאת, יש להיזהר לא "לאבד"
את הסדר עקב שימוש באופרטורים נוספים. למשל, אם רוצים אז יש לשרשר אותן FLWOR"לאחד" תוצאות של שני ביטויי
" אשר יחזיר אותן ו" ולא להשתמש באופרטור ",עם אופרטור "לסדר המסמך.
24
order byדוגמאות לשימוש ב-כתיבת תוכן רשימת הספרים לפי שם המחבר הראשון (שם
משפחה קודם):for $b in doc(“xmpbib.xml”)/bib/bookorder by $b/author[1]/last, $b/author[1]/firstreturn $b
הספרים ללא מחברים יופיעו או כולם לפני שאר הספרים, או כולם לאחריהם. שאלת המיקום של "ערכים ריקים" היא תלוית
מימוש, אולם יש דרך לציינה במפורש בביטוי.
דוגמא למיון בסדר יורד:for $b in doc(“xmpbib.xml”)/bib/bookorder by $b/@year descendingreturn $b
25
סוף דבר.XQueryבהרצאה זו נלמדו רק המבנים הבסיסיים בשפה
, וכן כל הנושא של XQueryנושאים נוספים בבניית שאילתות של בבדיקת תחומים (בשילוב עם שפת XQueryהיכולות של
), יכולים היו לתפוס חלק XML-Schemaהגדרת הסכימות . נזכיר רק כי בתוספת המבנים XMLנכבד בקורס יעודי על
הנוספים שלא נלמדו כאן (כגון הגדרת שגרות), שפה זו היא שלמה במובן של טורינג.
(וכן מספר מלכודות XQueryמספר יישומים מתקדמים יותר של שיש להזהר מהן) ינתנו בתרגיל.