13

我想用 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 “博洛尼亚”@en 384038

http://dbpedia.org/resource/Bologna "Comune di Bologna"@en 384038

如何SELECT DISTINCT仅在列中使用?city但仍将外部列作为输出?

4

1 回答 1

19

您可以使用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

于 2015-03-11T14:22:06.263 回答