SPARQL/聚合函数
外观
< SPARQL
聚合函数与 修饰符 GROUP BY
结合使用。
可用的聚合函数有
COUNT
:元素的数量。您也可以写COUNT(*)
来简单地计算所有结果。SUM
,AVG
:分别为所有元素的总和或平均值。如果元素不是数字,您将获得奇怪的结果。MIN
,MAX
:分别为所有元素的最小值或最大值。这对所有值类型都有效;数字按数值排序,字符串和其他类型按词典顺序排序。SAMPLE
:任何元素。如果您知道只有一个结果,或者您不关心返回哪一个,这偶尔会很有用。GROUP_CONCAT
:连接所有元素。
请参阅 修饰符 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
修饰符 结合使用。
例如,查看此查询以检查机场的重复 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