跳至内容

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

试试看!

参考资料

[编辑 | 编辑源代码]


华夏公益教科书