仅使用SPARQL对一个值进行DISTINCT

drs*_*ein 10 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) 
}
Run Code Online (Sandbox Code Playgroud)

在结果中,我得到两个不同的行(代表相同的实体,但名称不同):

http://dbpedia.org/resource/Bologna "博洛尼亚"@ 384038

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

如何SELECT DISTINCT仅在列中使用?city但仍然具有外部列的输出?

Rob*_*obV 16

您可以使用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
Run Code Online (Sandbox Code Playgroud)

因此,通过分组,?city每个城市只能获得一行,因为按照您的分组,?city不能直接选择非组变量的变量.

您必须使用SAMPLE()聚合来为您希望在最终结果中获得的每个非组变量选择一个值.这将选择的值中的一个?name,并?pop为返回?cityName?cityPop分别