使用 SPARQL 仅对一个值进行 DISTINCT

DISTINCT only on one value with SPARQL

我想使用 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 "Bologna"@en 384038

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

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

您可以使用 GROUP BY 按特定列分组,然后使用 SAMPLE() 聚合到 select 来自其他列的值之一,例如

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 分组,您不能直接 select 未分组的变量变量。

您必须改为使用 SAMPLE() 聚合来为您希望在最终结果中包含的每个非组变量选择一个值。这将 select ?name?pop 的值之一变为 return 分别为 ?cityName?cityPop