从维基数据中的空白节点检索数据

Mar*_*mer 3 sparql wikidata

我正在尝试检索有关某些人寿命的数据。这对于生活过一段时间的人来说是有问题的。例如毕达哥拉斯的数据集似乎有一个所谓的“空白节点” date of birth (P569)。但是这个空白节点引用了另一个节点earliest date (P1319),该节点具有我可以正常使用的数据。

但由于某种原因,我无法检索该节点。我的第一次尝试看起来像这样,但不知何故导致了一个完全空的结果集:

SELECT DISTINCT ?person ?name ?dateofbirth ?earliestdateofbirth WHERE {
  ?person wdt:P31 wd:Q5.         # This thing is Human
  ?person rdfs:label ?name.      # Name for better conformation
  ?person wdt:P569 ?dateofbirth. # Birthday may result in a blank node
  ?dateofbirth wdt:P1319 ?earliestdateofbirth # Problem: Plausbible Birth
}
Run Code Online (Sandbox Code Playgroud)

然后我发现了另一种语法,它建议将?person wdt:P569/wdt:P1319 ?earliestdateofbirth我上面所做的显式导航用作某种“快捷方式”语法,但这也以空结果集结束

SELECT DISTINCT ?person ?name ?dateofbirth ?earliestdateofbirth WHERE {
  ?person wdt:P31 wd:Q5.         # Is Human
  ?person rdfs:label ?name.      # Name for better conformation
  ?person wdt:P569/wdt:P1319 ?earliestdateofbirth. 
}
Run Code Online (Sandbox Code Playgroud)

那么如何访问维基数据中由空白节点(在我的情况下特别是最早的出生日期)引用的节点?

Sta*_*lin 5

但是这个空白节点引用了另一个节点......

情况略有不同。该earliest date属性不是 的属性_:t550690019,而是语句 的属性wd:Q10261 wdt:P569 _:t550690019

在 Wikidata数据模型中,这些注释使用限定符表示。

维基数据数据模型

您的查询应该是:

SELECT DISTINCT ?person ?name ?dateofbirth ?earliestdateofbirth WHERE {
  VALUES (?person) {(wd:Q10261)}
  ?person wdt:P31 wd:Q5.         # --Is human
  ?person rdfs:label ?name.      # --Name for better conformation
  ?person p:P569/pq:P1319 ?earliestdateofbirth. 
  FILTER (lang(?name) = "en")
}
Run Code Online (Sandbox Code Playgroud)

尝试一下!


顺便说一句,时间精度(在已知出生日期时使用)是另一个限定符:

SELECT ?person ?personLabel ?value ?precisionLabel {
  VALUES (?person) {(wd:Q859) (wd:Q9235)}
  ?person  wdt:P31  wd:Q5 ;
           p:P569/psv:P569  [ wikibase:timeValue  ?value ;
                              wikibase:timePrecision  ?precisionInteger ]
  {
  SELECT ?precision (xsd:integer(?precisionDecimal) AS ?precisionInteger) {
    ?precision  wdt:P2803  ?precisionDecimal .
  }
  }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
Run Code Online (Sandbox Code Playgroud)

尝试一下!