SPARQL中仅对一个值进行DISTINCT筛选

13

我想用SPARQL检索具有超过100k人口的意大利城市列表,我正在使用以下查询:

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 "Bologna"@en 384038

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

我如何只在列?city中使用SELECT DISTINCT,但仍然将其他列作为输出?


可能相关的问题 - https://dev59.com/IGXWa4cB1Zd3GeqPR_R4 - RobV
1个回答

20

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


非常感谢,这正是我所寻找的! - drstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接