仅使用SPARQL对一个值进行DISTINCT

时间:2015-03-11 14:03:12

标签: rdf sparql dbpedia linked-data

我想使用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,但仍然将其他列作为输出?

1 个答案:

答案 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