در نوشته آشنایی به ویکی داده – توابع تجمیعی در Sparql درباره تابع های تجمیعی بر روی داده های پیوندی (سه تایی های RDF) در ویکی داده صحبت کردیم. اکنون در این نوشته می خواهیم درباره گروه بندی داده ها توسط عبارت GROUP BY در SPARQL صحبت کنیم که کاربردی همانند GROUP BY در زبان پرس و جوی SQL در پایگاه داده های رابطه ای دارد. همچنین کدهای این نوشته از نمونه مثال های سایت ویکی داده برداشته شده است ولی شما می توانید آنها را از اینجا نیز دانلود کنید.

گروه بندی داده ها با GROUP BY

عبارت HAVING برای اعمال شرط در GROUP BY

عبارت GROUP BY

در کد زیر می خواهیم قشورها را بر پایه تعداد جمعت، روه بندی کنیم، پس قاعدتا کشورهایی که دارای جمعیت یکسان هستند، در یک گروه قرار می گیرند. البته آشکار است که هیچ دو کشوری دقیقا دارای جمعیت یکسان نیستند و حتی اگر هم باشد، دست کم داده های آماری بروزی در لحظه نیست که بتوانیم از طریق داده های نمونه ایی مانند ویکی داده به آنها دسترسی داشته باشیم.

 

بنابراین همانند آنچه که برای SQL هست، اگر بخواهیم عبارت ORDER BY را به کار ببریم، باید نخست عبارت GROUP BY نوشته شده و سپس به دنبال آن عبارت ORDER BY بیاید، زیرا مرتب سازی بر روی نتیجه کلی کوئری SPARQL خواهد بود. در ویکی داده مجموعه ای از سه تایی هایی هست که افراد را توصیف می کنند. در کد زیر می خواهیم فهرستی از رنگ چشم افراد بدست بیاوریم. قاعدتا تعدادی افراد دارای چشمانی به رنگ قهوه ای و برخی رنگ های روشن مانند آبی هستند. بنابراین افرادی که چشمان آنها به رنگ قهوه ای هست، باید در یک گروه قرار بگیرند.

در کد بالا چهار متغير به نام های human? و eyeColor? و eyeColorLabel? و count? تعریف کرده ایم. در سه تایی نخست human wdt:P31 wd:Q5?، متغیر به نام human? موضوع (یا Subject) را نگهداری می کند که به هر فرد و کسی (خواننده، نویسنده، نقاش، زنده یا مرده)  اشاره دارد. در واقع در سه تایی نخست فهرست همه افراد به کمک ویژگی (Property) با شناسه P31 ۰ (یا همان instance of) و مقدار Object با شناسه Q5 که برابر با human است، پیدا می شود. در واقع به دنبال Subject هایی هستیم که instance of human باشند.

در دومین سه تایی human wdt:P1340 ?eyeColor?، تنها آن کسانی را می خواهیم که در ویکی داده برای آنها رنگ چشم آورده شده است. در سه تایی دوم  موضوع در متغیر human هست و اکنون به کمک رابطه (یا ویژگی یا Property) با شناسه P1340 که به eye color اشاره دارد، رنگ چشم آنهایی که این ویژگی برای آنها ثبت شده بدست می آید که در متغیر eyeColor? نگهداری می شد. سپس ما مقدار واقعی و رشته ای رنگ چشم یا همان برچسب را می خواهیم و نه URI که در eyeColor? نگهداری می شود.

چرا متغير eyeColor? در جلوی عبارت SELECT نوشته نشده است؟ زیرا همانند عبارت GROUP BY در SQL هر ستونی که پیش روی SELECT نوشته می شود باید پیش روی GROUP BY نیز بیاید، در اینجا نیز چون می خواهیم پاسخ را بر اساس رشته رنگ چشم که خودکار با تعریف متغیر eyeColorLabel? و از روی مقدارهای URI درون متغیر eyeColor? بدست می آید، گروه بندی کنی، پس نیازی به نوشتن متغیر eyeColor? پیش روی SELECT نیست. بنابراین یک متغیر هم پیش روی عبارت SELECT و هم در سه تایی های درون WHERE تعریف می شوند ولی تنها آنهایی نشان داده می شوند که پیش روی SELECT نوشته شده باشند.

در پایان می خواهیم پاسخ را بر پایه تعداد افراد درون یک گروه رنگ چشم و به صورت نزول مرتب سازی کنیم، پس اول باید مقدار COUNT را برای متغیر human? بدست بیاوریم و سپس یک نام مستعار به نام متغیر تازه count? به آن بدهیم و در پایان همین متغیر را در جلوی ORDER BY استفاده می کنیم تا به کمک DESC مرتب سازی نزولی انجام شود.

عبارت LIMIT

در يرس و جوی زیر می خواهیم تعداد هر دانشمند را به ازای هر جنسیت را (که male و female عمومی و در ویکی داده ها برخی دیگر نیز مانند ترنس زن نیز هست) بدست بیاوریم. در اینجا مهم نیست در چه شاخه ای دانشمند است تنها دسته male و female را می خواهیم بدانیم چه تعداد دانشمند دارد. همچنین همانند عبارت LIMIT در SQL (مانند MySQL و MS SQL Server) می توانیم خروجی را محدود کنیم. همچنین بر پایه نوشته های پیشین گفتیم که برای پیش گیری از نوشتن تکراری (موضوع)، می توانیم به جای آن در سه تایی های پایین تر، علامت سمی کالن بگذازیم.