32

我有以下查询:

SELECT ?tag WHERE {
  ?r ns9:taggedWithTag ?tagresource.
  ?tagresource ns9:name ?tag
}
LIMIT 5000

结果是:

abc
abc
abc
abc
abc
abc
abc
abd
ads
anb

我想得到类似的东西:

tag | count
-----------------
abc     7
abd     1
ads     1
anb     1

我已经用count(*)and尝试过count(?tag),但是我收到错误消息"Variable or "*" expected."有人可以告诉我,如何使它正确吗?

4

2 回答 2

42

如果您使用 Java 和 Jena 的 ARQ,您可以使用ARQ 的聚合扩展。您的查询将类似于:

SELECT ?tag (count(distinct ?tag) as ?count)
WHERE {
    ?r ns9:taggedWithTag ?tagresource.
    ?tagresource ns9:name ?tag
}
LIMIT 5000

2008 年的原始 SPARQL 规范不包含聚合,但2013 年的当前版本 1.1包含。

于 2009-08-03T17:31:38.710 回答
35

将 COUNT()、MIN()、MAX()、SUM()、AVG() 与 GROUP BY 一起使用可以生成三元组的汇总值。请注意,这些模式可能特定于 SPARQL 1.1。

例如,这个可以对每个 ?category 的 ?value 求和,

SELECT ?category (SUM(?value) as ?valueSum)
WHERE
{
  ?s ?category ?value .
}
GROUP BY ?category

这个可以计算谓词 ?p 的使用次数,

SELECT ?p (COUNT(?p) as ?pCount)
WHERE
{
  ?s ?p ?o .
}
GROUP BY ?p

这些示例的灵感来自 Bob DuCharme (2011),“Learning SPARQL”中的材料。O'Reilly Media,美国加利福尼亚州塞瓦斯托波尔;见http://www.learningsparql.com/

为了避免在使用 GROUP BY 时出现错误“Bad aggregate”

  1. 分组变量应该匹配;(?category 在第一个例子中)
  2. SELECT 中的其余变量应各自产生一个值;(SUM(?value) as ?valueSum) 在第一个例子中。
于 2012-04-18T04:48:28.537 回答