我有以下查询:
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(*)
和count(?tag)
,但我收到错误消息"Variable or "*" expected."
有人可以告诉我,如何使其成功吗?
答案 0 :(得分:37)
如果您使用的是Java和Jena的ARQ,则可以使用ARQ's extensions for aggregates。您的查询看起来像:
SELECT ?tag (count(distinct ?tag) as ?count)
WHERE {
?r ns9:taggedWithTag ?tagresource.
?tagresource ns9:name ?tag
}
LIMIT 5000
original SPARQL specification from 2008不包含聚合,但the current version, 1.1, from 2013包含聚合。
答案 1 :(得分:30)
使用COUNT(),MIN(),MAX(),SUM(),AVG()和GROUP BY可以为三元组生成汇总值。请注意,这些模式可能特定于SPARQL 1.1。
例如,这个可以将每个?类别的?值相加,
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)的材料,“学习SPARQL”。 O'Reilly Media,Sebastopol,CA,USA;见http://www.learningsparql.com/