我想使用SPARQL检索人口超过10万的意大利城市列表,并且我使用以下查询:
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?city ?name ?pop WHERE {
?city a dbo:Settlement .
?city foaf:name ?name .
?city dbo:populationTotal ?pop .
?city dbo:country ?country .
?city dbo:country dbpedia:Italy .
FILTER (?pop > 100000)
}
在结果中我得到两个不同的行(代表相同的实体,但名称不同):
http://dbpedia.org/resource/Bologna&#34;博洛尼亚&#34; @ 384038
http://dbpedia.org/resource/Bologna&#34; Comune di Bologna&#34; @ 384038
如何仅在SELECT DISTINCT
列中使用?city
,但仍然将其他列作为输出?
答案 0 :(得分:15)
您可以使用GROUP BY
按特定列进行分组,然后使用SAMPLE()
聚合从其他列中选择一个值,例如
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?city (SAMPLE(?name) AS ?cityName) (SAMPLE(?pop) AS ?cityPop)
WHERE
{
?city a dbo:Settlement .
?city foaf:name ?name .
?city dbo:populationTotal ?pop .
?city dbo:country ?country .
?city dbo:country dbpedia:Italy .
FILTER (?pop > 100000)
}
GROUP BY ?city
因此,通过对?city
进行分组,每个城市只能获得一行,因为按?city
分组,您无法直接选择不属于变量的变量。
您必须使用SAMPLE()
聚合来为您希望在最终结果中获得的每个非组变量选择一个值。这将选择?name
和?pop
中的一个值,分别返回?cityName
和?cityPop