跳至內容

SPARQL/聚合函式

來自華夏公益教科書,開放的書籍,開放的世界

聚合函式與 修飾符 GROUP BY 結合使用。

可用的聚合函式有

  • COUNT:元素的數量。您也可以寫 COUNT(*) 來簡單地計算所有結果。
  • SUM, AVG:分別為所有元素的總和或平均值。如果元素不是數字,您將獲得奇怪的結果。
  • MIN, MAX:分別為所有元素的最小值或最大值。這對所有值型別都有效;數字按數值排序,字串和其他型別按詞典順序排序。
  • SAMPLE:任何元素。如果您知道只有一個結果,或者您不關心返回哪一個,這偶爾會很有用。
  • GROUP_CONCAT:連線所有元素。

帶有 GROUP BY 的聚合函式

[編輯 | 編輯原始碼]

請參閱 修飾符 GROUP BY 以獲取示例。

# The syntax is like this
SELECT ?group1 ?group2
               (COUNT(?var1) AS ?var2)
               (GROUP_CONCAT(DISTINCT ?var3; SEPARATOR=", ") AS ?var4)
WHERE 
{
...
}
GROUP BY ?group1 ?group2

當使用標籤的聚合函式時,所有標籤都應在 SERVICE 中顯式定義。

此外,您可以在這些函式中新增 DISTINCT 修飾符來消除重複結果。例如,如果有兩個結果,但它們在 ?var 中具有相同的值,那麼 COUNT(?var) 將返回 2,但 COUNT(DISTINCT ?var) 僅返回 1。當您的查詢可以多次返回同一項時,您通常需要使用 DISTINCT——例如,如果您使用 ?item wdt:P31/wdt:P279* ?class,並且從 ?item?class 有多條路徑:您將為每條路徑獲得一個新結果,即使結果中的所有值都相同。(如果您不進行分組,您也可以透過以 SELECT DISTINCT 而不是 SELECT 開頭查詢來消除這些重複結果。)

帶有 HAVING 的聚合函式

[編輯 | 編輯原始碼]

聚合函式也可以與 HAVING 修飾符 結合使用。

例如,檢視此查詢以檢查機場的重複 IATA 程式碼

SELECT ?object (COUNT(?subject) AS ?count)
               (MIN(?subject) AS ?subject1) (MAX(?subject) AS ?subject2)
               (GROUP_CONCAT(DISTINCT ?subjectLabel; SEPARATOR=", ") AS ?subjectLabels)
WHERE
{
  ?subject wdt:P238 ?object.         # IATA airport code
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". 
                         ?subject rdfs:label ?subjectLabel.
                         }
}
GROUP BY ?object
HAVING(COUNT(?subject) > 1)
ORDER BY ?object

試試看!

參考資料

[編輯 | 編輯原始碼]


華夏公益教科書