我尝试使用以下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
但问题是 -
并非每个城市都有dbp:population
谓词,但有些城市有dbp:populationTotal
。因此,对于某些城市,我们可以通过此获得人口,但是当我在查询的可选部分中写作时 -
OPTIONAL{
?city dbp:population ?population .
?city dbp:populationTotal ?populationTotal
}
两个部分都变成空白。 dbo:knownFor
谓词也是如此(并非每个城市都有knownFor
谓词)。
答案 0 :(得分:1)
首先要知道的是,DBpedia数据是一个移动目标,就像它来自的维基百科数据一样。维基百科的更新最终将成为DBpedia的一部分。更快,他们将成为DBpedia-live的一部分。
当您包含两个谓词时,OPTIONAL
谓词都没有显示的值的问题似乎是当前托管DBpedia的Virtuoso版本中的错误。我鼓励您检查whether it's been reported yet,如果没有,请自行报告,并监控问题。
至于限制你回来的城市的大陆 - 通常最容易检查你想要的实体(或附近),找到相关的属性/谓词/属性。例如,Aachen-Mitte的dbo:country
Germany有rdf:type
个yago: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}}
如果你只想要一个的总体值,特别是如果你有一个谓词优先于另一个谓词,那么构造会变得更复杂(并且应该是一个新问题)。