COUNT

COUNT

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

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

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

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

# שחקניות בוויקינתונים
SELECT ?item ?itemLabel 
WHERE {
  ?item wdt:P31 wd:Q5.           # הפריט הוא מופע של אדם
  ?item wdt:P21 wd:Q6581072.     # למאפיין "מין או מגדר" יש את הערך נקבה
  ?item wdt:P106 wd:Q33999.      # למאפיין "עיסוק" יש את הערך שחקן 

  
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }  
  }

ממשק השאילתות אמור להחזיר את כל הפריטים המתאימים לתבניות שהגדרנו ולציין את מספרם. אבל אם מספר הפריטים המתאימים גדול מאוד השאילתה עלולה "להיתקע" מכיוון שלממשק השאילתות יש זמן קצוב של 60 שניות להחזרת התוצאות. שאילתה שדורשת יותר זמן מהזמן הקצוב הזה תחזיר הודעת TIMEOUT:

על מנת לענות על השאלה כמה שחקניות יש בוויקינתונים מצהירים בפסוקית ה-SELECT על השימוש בפונקציית COUNT. בדוגמה הבאה המשתנה actresscount? מוגדר כפונקציית COUNT של המשתנה item? שהוא המשתנה שאוסף את הפריטים התואמים לתבניות בפסוקית ה-WHERE.

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

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 פרסי אוסקר, וכמה מועמדויות היו לכל אחת?

פתרון

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

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

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

דילוג לתוכן