通过sparql获取城市信息

时间:2015-10-14 15:35:30

标签: sparql dbpedia

我尝试使用以下SPARQL查询。

SELECT distinct ?city ?cityName ?country ?population ?knownfor WHERE {
 ?city rdf:type dbo:City .
?city rdfs:label ?cityName.
?city dbo:country ?country.
OPTIONAL{
?city dbp:population ?population.
?city dbo:knownFor ?knownfor.
}

  FILTER (lang(?cityName) = 'en')
} ORDER BY ?city

但问题是 -

  1. 并非每个城市都有dbp:population谓词,但有些城市有dbp:populationTotal。因此,对于某些城市,我们可以通过此获得人口,但是当我在查询的可选部分中写作时 -

    OPTIONAL{
        ?city dbp:population ?population .
        ?city dbp:populationTotal ?populationTotal
    }
    
  2. 两个部分都变成空白。 dbo:knownFor谓词也是如此(并非每个城市都有knownFor谓词)。

    1. 如何在查询中指定我只想要欧洲城市?我找不到任何指定城市大陆的谓词

1 个答案:

答案 0 :(得分:1)

首先要知道的是,DBpedia数据是一个移动目标,就像它来自的维基百科数据一样。维基百科的更新最终将成为DBpedia的一部分。更快,他们将成为DBpedia-live的一部分。

当您包含两个谓词时,OPTIONAL谓词都没有显示的值的问题似乎是当前托管DBpedia的Virtuoso版本中的错误。我鼓励您检查whether it's been reported yet,如果没有,请自行报告,并监控问题。

至于限制你回来的城市的大陆 - 通常最容易检查你想要的实体(或附近),找到相关的属性/谓词/属性。例如,Aachen-Mittedbo:country Germanyrdf:typeyago:EuropeanCountries,包括?country a yago:EuropeanCountries - 这可能是您想要的,但可能还没有适用于所有这些。您需要在模式中添加三元组,如 -

OPTIONAL { ... }

编辑添加

OPTIONAL { ?city dbp:population ?population . ?city dbo:knownFor ?knownfor . } 子句返回括号内包含的整个模式的结果。所以 -

?city

- 只有当OPTIONAL { ?city dbp:population ?population . } OPTIONAL { ?city dbo:knownFor ?knownfor . } 具有两个谓词的值时才会返回 谓词的值。

如果要为 谓词获取每个值,则需要将该子句拆分为两个 -

dbp:population

dbp:populationTotal OPTIONAL很容易同时使用?populationTotal(以及SELECT添加到SELECT DISTINCT ?city ?cityName ?country ?population ?populationTotal ?knownfor ... OPTIONAL { ?city dbp:population ?population . } OPTIONAL { ?city dbp:populationTotal ?populationTotal . } OPTIONAL { ?city dbo:knownFor ?knownfor . } .box-03c1 p, .box-03c2 p, .box-03c3 p, .box-03c4 p { line-height: 12.5px;padding: 15px 12px } 1}}列表) -

{{1}}

如果你只想要一个的总体值,特别是如果你有一个谓词优先于另一个谓词,那么构造会变得更复杂(并且应该是一个新问题)。