SPARQL中的GROUP和COUNT

时间:2018-08-13 10:08:28

标签: count grouping sparql wikidata

我正在使用WikiData SPARQL端点搜索两个实体:博物馆(wd:Q33506)和图书馆(wd:Q7075),它们具有instagram和twitter帐户,以及它们来自哪个国家。我试图对它们进行计数并按国家/地区分组。

SELECT ?item ?instagram ?twitter ?countryLabel (COUNT(?country) AS ?ccount) WHERE {
  { ?item (wdt:P31/wdt:P279*) wd:Q33506. }
  { ?item (wdt:P31/wdt:P279*) wd:Q7075. }
  ?item wdt:P2003 ?instagram.
  ?item wdt:P2002 ?twitter.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
  OPTIONAL { ?item wdt:P17 ?country. }
}
GROUP BY ?country
ORDER BY ?ccount

1 个答案:

答案 0 :(得分:3)

主要错误是:

  

查询格式不正确:聚合错误

来自11.4 Aggregate Projection Restrictions

  

在使用聚合的查询级别中,只能投影由聚合和常量组成的表达式,只有一个例外。当GROUP BY给出一个或多个仅包含一个变量的简单表达式时,这些变量可能是从级别投影的。

因此,您的查询应为:

SELECT ?countryLabel (COUNT(DISTINCT ?item) AS ?ccount) WHERE {
  { ?item wdt:P31/wdt:P279* wd:Q33506. }
  UNION
  { ?item wdt:P31/wdt:P279* wd:Q7075. }
  ?item wdt:P2003 ?instagram.
  ?item wdt:P2002 ?twitter.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
  OPTIONAL { ?item wdt:P17 ?country. }
}
GROUP BY ?countryLabel ORDER BY DESC(?ccount)

Try it!

我还添加了UNIONDISTINCT,并在投影中将?country替换为?item

请注意,同时拥有Instagram和Twitter帐户的图书馆和博物馆都将计算在内。