仅选择具有最小日期限定符的语句

问题描述 投票:0回答:1

我正在尝试编写一个查询,告诉我国家元首首次上任的年龄。我无法将

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)

wdqs 链接

早些时候,在对我的问题进行更新之前,我使用了

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)

但这些给了我疯狂的结果。

sparql wikidata wikidata-query-service
1个回答
1
投票

我正在查看您的问题,奇怪的是,当

?age
?termStart
也添加到
?dob
语句中时,查询会返回不同的
SELECT
值。

无论如何,问题是您在查询正文中使用

MIN()

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.