我正在尝试编写一个查询,告诉我国家元首首次上任的年龄。我无法将
position held
语句与最早的 start time
限定符隔离开来。我似乎无法将 MIN()
放在正确的位置。
这是一个查询,返回就职时的所有年龄(对于多次就职的人,有多个条目):
SELECT ?headOfState ?headOfStateLabel ?age ?countryLabel ?positionLabel
{
# find heads of state positions
hint:Query hint:optimizer "None".
?position wdt:P279* wd:Q48352 .
# sovereign states only
?position wdt:P1001 ?country .
?country wdt:P31 wd:Q3624078 .
# fetch names of officeholders
?headOfState wdt:P39 ?position .
# birthdates of officeholders
?headOfState wdt:P569 ?dob. hint:Prior hint:rangeSafe true.
# date of term start
?headOfState p:P39 ?statement .
?statement ps:P39 ?position .
?statement pq:P580 ?termStart. hint:Prior hint:rangeSafe true.
FILTER("1950-01-01"^^xsd:dateTime <= ?termStart && ?termStart < "1980-01-01"^^xsd:dateTime)
BIND(YEAR(?termStart)-YEAR(?dob) as ?age)
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
ORDER BY DESC(?age)
早些时候,在对我的问题进行更新之前,我使用了
SELECT DISTINCT
并放错了MIN()
,如下所示:BIND(MIN(YEAR(?termStart))-YEAR(?dob) as ?age)
,产生奇怪的错误:它返回Anwar Sadat成为32岁的埃及总统。萨达特的出生日期是1918年,并没有开始时间为1950年的position held
。那么32这个数字是从哪里来的呢?
现在,感谢我收到的帮助,我有了正确的年龄,但如何仅选择最低年龄?
如果在第一行中,我
SELECT (MIN(?age) as ?ageMin)
,我会得到一个错误的聚合(我猜这是有道理的,因为每个国家元首都有多个条目,并且这不会选择单个正确的条目)。
我尝试过类似的子查询
{SELECT (MIN(?termStart) as ?termStartMin) WHERE {
?headOfState p:P39 ?statement .
?statement ps:P39 ?position .
?statement pq:P580 ?termStart. hint:Prior hint:rangeSafe true.
FILTER("1950-01-01"^^xsd:dateTime <= ?termStart && ?termStart < "1980-01-01"^^xsd:dateTime)}}
BIND(YEAR(?termStartMin)-YEAR(?dob) as ?age)
但这些给了我疯狂的结果。
我正在查看您的问题,奇怪的是,当
?age
和 ?termStart
也添加到 ?dob
语句中时,查询会返回不同的 SELECT
值。
无论如何,问题是您在查询正文中使用
MIN()
。