GROUP BY

GROUP BY

עכשיו שלמדתם להשתמש בפונקציה צוברת כמו COUNT, ניתן לשלב אותה עם פונקציית ספארקל בשם GROUP BY. פונקציה זו מקבצת נתונים בתוצאות וכך מאפשרת להשתמש בפונקציה כמו COUNT על קבוצות של נתונים לצורך ניתוחם.

בואו ניקח כדוגמא את השאילתה שמאחזרת את מספר שחקני הטניס בוויקינתונים. בשאילתה הבא יש משתנה נוסף – gender? – ותוצאות השאילתה מוצגות בנפרד עבור כל ערך של המשתנה זה.

שימו לב: חובה להצהיר את המשתנה שמופיע בהוראה GROUP BY בפסוקית ה-SELECT.

ייתכן ששמתם לב לכך שהסכום של כל הפריטים בכל המגדרים נמוך מהתוצאה של השאילתה המקורית (ללא ההפרדה למגדר). הסיבה לכך היא שיש מספר (מועט) של פריטים שאין עבורם מידע על מגדר. (להסבר, ראו את הפרק OPTIONAL).

תרגיל: GROUP BY

| תרגיל: כתבו שאילתה שמציגה סרטים שהיו מועמדים לפרס, ואת מספר המועמדויות עבור כל סרט.

רמז: חפשו סרטים שיש להם מאפיין P1411 (מועמדות לפרס)

טיפ: השאילתה צריכה לאחזר לא רק פריטים שהם מופע של סרט קולנוע, אלא גם פריטים שהם מופע של תת-קבוצה של סרט קולנוע. השתמשו בהוראה DISTINCT כדי להסיר תוצאות כפולות

פתרון

שימו לב שההוראה DISTINCT מתייחסת במקרה זה למשתנה של הפרס ולא לפריט. אם לפריט יש יותר מהצהרה אחת עם המאפיין P31 (מופע של) ויש לו יותר מנתיב אחד למחלקה סרט קולנוע (למשל, הפריט מוגדר גם כמופע של סרט קולנוע וגם כמופע של סרט תלת-ממד – שהוא תת-קבוצה של סרט קולנוע), DISTINCT יוודא שהמועמדויות לפרס ייספרו רק פעם אחת.

כדי לראות לאיזה סרט היו הכי הרבה מועמדויות, אפשר לגלול לתוצאות לאחר הרצת השאילתה, וללחוץ על העמודה "count" בראש הטבלה. פעולה זו תדרג את התוצאות לפי עמודה זו. בפרק הבא תלמדו איך להורות לדרג את התוצאות בגוף השאילתה.

ORDER BY

ORDER BY

ORDER BY היא פקודה שמדרגת את התוצאות לפי משתנה או ביטוי מסויים. הדירוג יכול להיות בסדר עולה (ASC) או בסדר יורד (DESC).

לדוגמה, השאילתה הבאה מציגה בסדר יורד את מספר המועמדיות לפרס עבור כל סרט בוויקינתונים:

HAVING

HAVING

HAVING היא פקודה שמסננת קבוצות שלא עומדות בתנאי מסויים. השימוש בפקודה HAVING הוא תמיד בשילוב עם GROUP BY.

לדוגמה, אפשר לערוך את השאילתה הקודמת המציגה את מספר המועמדויות לפרס עבור כל סרט קולנוע, כך שרק סרטים עם יותר מ-5 מועמדויות יוצגו בתוצאות:

שימו לב שההוראה HAVING חייבת לבוא מיד אחרי GROUP BY.

LIMIT

LIMIT

LIMIT היא פקודה שניתן לציינה לאחר פסוקית ה-WHERE על מנת להגביל את מספר התוצאות למספר ספציפי.

לדוגמה, השאילתה הבאה מראה את עשרת הסרטים בעלי ההכנסות הגבוהות ביותר שהם חלק מסדרה.

שימו לב שהשימוש בהוראה GROUP BY אפשרי רק בשילוב עם פונקציה צוברת כלשהי (כגון COUNT). ההוראות ORDER BY ו-LIMIT לא מחייבות פונקציה צוברת.

מבחינים

מבחינים

בואו נסתכל שוב על השאילתה שמאחזרת סרטים עם יותר מ-5 מועמדויות לפרס.

# סרטים שהיו מועמדים ליותר מ-5 פרסים

SELECT ?item ?itemLabel (COUNT(DISTINCT ?award) AS ?count)
WHERE {
  ?item wdt:P31/wdt:P279* wd:Q11424.     # הפריט הוא מופע של סרט קולנוע, או מופע של תת-קבוצה של סרט קולנוע
  ?item wdt:P1411 ?award.                # ?award הפריט היה מועמד לפרס, שנאסף על ידי המשתנה 
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
}
GROUP BY ?item ?itemLabel                # התוצאות מוצגות בנפרד עבור כל סרט
HAVING (?count>5)                        # רק סרטים עם יותר מ-5 מועמדויות
ORDER BY DESC(?count)                    # בסדר יורד

השאילתה הזו סופרת פרסים מכל סוג. איך אפשר לערוך את השאילתה כך שתראה את הסרטים עם הכי הרבה מועמדויות לפרס אוסקר?

אנחנו יכולים להגדיר שהפרס צריך להיות מופע של פרס אוסקר:

אבל יש סרטים שהיו מועמדים פעמיים לאותו פרס. למשל, לסרט "הכל אודות חווה" (Q200299) היו שתי מועמדויות לפרס השחקנית הטובה ביותר:

אם השאילתה רק לוקחת את הערך של המאפיין "מועמדות לפרס" אז שתי ההצהרות הן זהות ולכן ייספרו רק פעם אחת.

כפי שמוסבר בחלק על הצהרות עם מבחינים, במודל של ויקינתונים עבור כל מאפיין ישיר שמחבר פריט וערך יש גם מאפיין פשוט (p) שמחבר את הפריט עם קודקוד הצהרה. לכל מועמדות לפרס יש קודקוד הצהרה שונה. כדי לאחזר את המספר הנכון של המועמדויות לפרס עבור כל סרט השאילתה צריכה לספור עבור כל סרט כמה קודקודי הצהרות יש למאפיין "מועמדות לפרס" שעבורם הערך (כלומר הפרס) הוא פרס אוסקר:

עכשיו השאילתה סופרת את מספר ההצהרות של מועמדויות לפרס שהערך שלהן הוא מופע של פרס אוסקר. שימו לב שהמועמד או מועמדת לפרס הם מבחינים של ההצהרה, אבל אינם רלוונטיים לספירת התוצאות בשאילתה.

תרגיל

| תרגיל: איזה שחקניות היו מועמדות ליותר מ-3 פרסי אוסקר, וכמה מועמדויות היו לכל אחת?

פתרון

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

כך למשל, השחקנית אמה תומפסון הייתה מועמדת לפרס האוסקר לתסריט המעובד הטוב ביותר.

גישה אחרת לשאילתה היא להסתכל על הזוכות ב"פרס האוסקר לשחקנית הטובה ביותר" וב"פרס האוסקר לשחקנית המשנה הטובה ביותר":

סינון תוצאות

FILTER – סינון תוצאות

עד עכשיו ראינו הוראות ופונקציות שפועלות בפסוקית ה-SELECT או אחרי פסוקית ה-WHERE. פונקציה שימושית נוספת היא FILTER, שיכולה להופיע בתוך פסוקית ה-WHERE.
נדגים את הסינון של תוצאות בשתי צורות: הפונקציה FILTER שבוחרת רק פריטים שמתאימים לתנאי של הפילטר (כלומר מסירה תוצאות שאינן תואמות), והפונקציה FILTER NOT EXISTS – פסוקית שמסננת תוצאות שמתאימות לתבנית מסויימת.

פונקציית FILTER

הפונקציה FILTER מסננת פריטים על בסיס הביטוי שמופיע בסוגריים של הפונקציה: רק התוצאות שעבורן הביטוי בסוגריים נכון יכללו בתוצאות.

נניח שאנחנו רוצים לערוך את השאילתה לגבי עשרת סרטים בעלי ההכנסות הגבוהות ביותר שהם חלק מסדרה, כך שהשאילתה תחזיר רק תוצאות של סרטים שיצאו לאור לפני שנת 2000.

בשורה 8 הוספנו תבנית שאוספת את הערך של המאפיין P577 (תאריך הוצאה לאור) עם המשתנה date?. בשורה אחרי כן אנחנו משתמשים ב-FILTER כדי לכלול רק פריטים שתאריך ההוצאה לאור שלהם הוא לפני 1 בינואר 2000.

שימו לב שהקריטריון לתאריך (2000-01-01) מופיע במרכאות ואחריו הביטוי "^^xsd:dateTime" שמסמן שמדובר בערך בפורמט של תאריך.

פונקציית YEAR

דרך אחרת לכתוב את השאילתה היא באמצעות הפונקציה YEAR. זו פונקציה מובנית שמחזירה את השנה של תאריך (כלומר של ערך שהוא נתון מסוג תאריך/שעה):

FILTER NOT EXISTS

נניח היינו רוצים לערוך את השאילתה על שחקניות שהיו מועמדות ליותר מ-3 פרסי אוסקר, כך שהשאילתה תחזיר רק את השחקניות שאף פעם לא זכו בפרס אוסקר.

הפסוקית FILTER NOT EXISTS משתמשת להגדרת התבניות שצריכות לא להתאים. בדוגמה הזו, התבנית היא מאפיין P166 (פרס שזכה בו") עם ערך שהוא מופע של (P31) פרס אוסקר (Q19020):

במילים אחרות, השאילתה מסירה פריטים שיש להם הצהרה שתואמת את התבנית בפסוקית FILTERNOT EXISTS.

תרגיל: FILTER

| תרגיל: כתבו שאילתה שמראה ראשי מדינות שנולדו בשנת 1980 או אחריה

רמז: בחרו מדינות ריבוניות (Q3624078) שיש להם מאפיין ראש הראשות המושלת (P6) שתאריך הלידה (P569) שלו או שלה הוא בשנת 1980 או אחריה, או שתאריך הלידה שלהם הוא 01-01-1980 או אחרי כן.

פתרון

דרך אחרת היא להשתמש בפורמט התאריך המדויק:

איך להמשיך

מה הלאה?

מזל טוב! הגעת לסוף המדריך.

המדריך הזה מוגבל בהיקפו ומטרתו היא ללמד את המושגים הבסיסיים הנדרשים לשימוש בספארקל לתשאול ויקינתונים. אבל יש עוד הרבה מה לגלות – עוד פונקציות, עוד מילות מפתח, עוד מבנים של שאילתות, אפילו סוגים שונים של שאילתות! כאן כיסינו רק את היסודות.

בהמשך תמצאו רשימה של הצעות איך להמשיך ללמוד ספארקל. אך לפני סיום יש היבט חשוב של ממשק השאילתות שחשוב לנו להדגיש. ממשק השאילתות נותן כלי ייחודי לאחזור מידע, אבל השימושיות של הכלי היא פונקציה של איכות המידע שנמצא בוויקינתונים. ככל שהמידע בוויקינתונים יהיה מלא, מדויק ואמין יותר כך התוצאות של השאילתות שלנו יהיו יותר טובות ושימושיות. בתהליך התשאול והחקירה של ויקינתונים ייתכן שתתקלו בנתונים חסרים, מיושנים או מוטעים. כולנו תקווה שהשימוש בממשק השאילתות יתמרץ אתכם להיות מעורבים בוויקינתונים ולהצטרף למאמץ הקהילתי לפיתוח המיזם.

מקורות להמשך לימוד ספארקל/ממשק השאילתות:

  • מדריך לספארקל בוויקינתונים, הכולל תרגילים נוספים.
  • ספר בנושא ספארקל/ויקינתונים במיזם ויקי-ספר.
  • רשימה של שאילתות לדוגמה – אפשר ללמוד הרבה בהסתכלות על התחביר והמבנה של שאילתות אלה. לעיתים קרובות תמצאו כאן שאילתה שמתאימה לצרכים שלכם ורק נדרש לערוך אותה במעט. אין צורך להמציא את הגלגל כל פעם מחדש! דוגמאות אלה גם נגישות וניתן לחפש בהן דרך ממשק השאילתות תחת הכפתור "Examples".
  • בקשת שאילתה – השאילתה שכתבתם לא עובדת, ואתם לא מבינים למה? לא בטוחים איך לנסח את השאילתה? בעמוד זה קהילת ויקינתונים יכולה לענות לשאלות ולסייע בעזרה.

דילוג לתוכן