使用 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
我想使用 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