用于寻找总统的维基数据查询

Wikidata query for finding presidents

我正在学习维基数据查询语言,想查找美国总统的名字以及祖父、曾祖父等...

我试过这个找爸爸,但是怎么找爸爸的爸爸等等...

SELECT  ?valLabel ?resLabel
WHERE {
  ?val wdt:P31 wd:Q5.
  ?val  wdt:P27 wd:Q30.
  ?val wdt:P106 wd:Q82955.
  ?val wdt:P22 wd:Q11806.
  OPTIONAL { ?val wdt:P22 ?res. }

  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}

试试这个查询

#Father - GrandFather and so on ...
SELECT  ?childLabel ?fatherLabel ?grandFatherLabel ?greatGrandFather1Label ?greatGrandFather2Label
WHERE {
  ?child wdt:P31 wd:Q5.
  ?child  wdt:P27 wd:Q30.
  ?child wdt:P106 wd:Q82955.
  ?child wdt:P22 wd:Q11806.
  OPTIONAL { ?child wdt:P22 ?father. }
  OPTIONAL { ?father wdt:P22 ?grandFather. }
  OPTIONAL { ?grandFather wdt:P22 ?greatGrandFather1. }
  OPTIONAL { ?greatGrandFather1 wdt:P22 ?greatGrandFather2. }

  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}

您的查询正在寻找美国公民、政治家和父亲是约翰·亚当斯的人。

相反,您需要这样的查询(在伪 SPARQL 中):

SELECT ?presidentLabel ?fatherLabel ?gFatherLabel ?ggFatherLabel ...
WHERE {
?president position_held president_of_the_US .
OPTIONAL{?president has_father ?father .}
OPTIONAL{?father has_father ?gFather .}
OPTIONAL{?gFather has_father ?ggFather .} ...

SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
  }

请注意可选的是必要的,因为可能没有总统的曾祖父的信息,在这种情况下根本不会返回有关总统的信息。

在维基数据中,以下应该有效:

SELECT
  ?presidentLabel
  ?fatherLabel
  ?gFatherLabel
  ?ggFatherLabel
WHERE {
  ?president wdt:P39 wd:Q11696.

  OPTIONAL{?president wdt:P22 ?father}
  OPTIONAL{?father wdt:P22 ?gFather}
  OPTIONAL{?gFather wdt:P22 ?ggFather}

  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}

然而,当你超越总统的祖父时,查询似乎超时了。

奖励:如果您希望总统按时间顺序排列,请使用此查询:

 SELECT  ?ord ?presidentLabel ?fatherLabel ?gFatherLabel
 WHERE {
    ?president wdt:P39 wd:Q11696 ;
               p:P39 ?presidency .
    ?presidency ps:P39 wd:Q11696 ;
                pq:P1545 ?ordString .

  OPTIONAL{?president wdt:P22 ?father .}
  OPTIONAL{?father wdt:P22 ?gFather .}

BIND(xsd:integer(?ordString) AS ?ord)      

      
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
      }
ORDER BY ?ord

这里查询所有美国总统的所有父亲(以及他们的父亲,只要维基数据有数据):

SELECT ?presidentLabel ?fatherLabel 
WHERE 
{
  ?president wdt:P39 wd:Q11696;
             wdt:P31 wd:Q5;
             wdt:P22+ ?father .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

Try it!