Sparql 用于查找总统的Wikidata查询

Sparql 用于查找总统的Wikidata查询,sparql,wikidata,Sparql,Wikidata,我在学习维基数据查询语言,想找到美国总统的名字,还有祖父、曾祖父等等 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 wi

我在学习维基数据查询语言,想找到美国总统的名字,还有祖父、曾祖父等等

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". }
}
我试着找个父亲,但如何找到父亲的父亲等等

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中):

请注意,该选项是必要的,因为总统的曾祖父可能没有任何信息,在这种情况下,将不会返回任何关于总统的信息

在Wikidata中,以下各项应起作用:

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 .

BIND(xsd:integer(?ordString) AS ?ord)      
    OPTIONAL{?president wdt:P22 ?father .}
    OPTIONAL{?father wdt:P22 ?gFather .}

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". }
}

如何找到第n个级别,直到它找不到任何信息?我认为我们无法做到这一点,因为查询在某个时间点后会变得昂贵,并且会超时。您希望如何处理此查询?如何查找第n个级别,直到它找不到任何信息?您将需要使用一个属性路径,例如:?president wdt:P22+?祖先。不过这会很慢,你需要看看其他帖子,了解祖先的级别。请看这里获取灵感:谢谢你的提问,从中学习到了一些新的东西,但我想知道每一位总统的第n级父亲、祖父等。据我所知,这在SPARQL中是不可能做到的。要获得一个新列,需要命名变量,这意味着在查询之前必须对n做出决定。(但我必须承认这是我所知不多的,我很高兴被证明是错误的。)好吧,即使我是新手,无论如何,谢谢你分享这个问题,非常有帮助:)