【问题标题】:Wikidata query for finding presidents查找总统的维基数据查询
【发布时间】:2020-06-12 08:32:12
【问题描述】:

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

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

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

【问题讨论】:

标签: sparql wikidata


【解决方案1】:

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

相反,您需要这样的查询(在伪 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". }
  }

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

在 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 .

  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

【讨论】:

  • 如何找到第n级直到找不到信息?
  • 您需要使用属性路径,如下所示: ?president wdt:P22+ ?ancestor 。但是,这会很慢,您需要查看其他帖子以了解如何找出祖先所在的级别。
  • 请参阅此处获取灵感:stackoverflow.com/questions/31614043/…
【解决方案2】:

试试这个查询

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

【讨论】:

  • 如何找到第n级直到找不到信息?
  • 我认为我们无法做到这一点,因为查询会在某个时间点之后变得昂贵并且会超时。你想用这个查询做什么?
【解决方案3】:

这是对所有美国总统的所有父亲(以及他们的父亲,早在 Wikidata 中有数据)的查询:

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!

【讨论】:

  • 感谢您的询问,从中学到了一些新东西,但我想知道单行中每个总统的第n级父亲、祖父等。
  • 据我所知,这在 SPARQL 中是不可能的。要获得新列,您需要命名变量,这意味着必须在查询之前对 n 做出决定。 (但我必须承认这是我知识的边缘,很高兴被证明是错误的。)
  • 酷好吧,即使我是新手,无论如何感谢分享该查询,非常有帮助:)
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多