【问题标题】:DISTINCT only on one value with SPARQL使用 SPARQL 仅对一个值进行 DISTINCT
【发布时间】:2015-05-13 08:46:28
【问题描述】:

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

http://dbpedia.org/resource/Bologna“博洛尼亚社区”@zh 384038

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

【问题讨论】:

标签: rdf sparql dbpedia linked-data


【解决方案1】:

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

【讨论】:

  • 非常感谢,这正是我要找的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
相关资源
最近更新 更多