从维基数据中的空白节点检索数据
Retrieving data from blank nodes in Wikidata
我正在尝试检索有关某些人的寿命的数据。对于生活了一段时间的人来说,这是有问题的。例如的数据集Pythagoras 似乎有一个所谓的 "blank node" for date of birth (P569)
。但是这个空白节点引用了另一个节点 earliest date (P1319)
,其中包含我可以正常使用的数据。
但出于某种原因我无法检索该节点。 My first try looked like this,但以某种方式导致结果集完全为空:
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
}
然后我发现了另一种语法,它建议使用 ?person wdt:P569/wdt:P1319 ?earliestdateofbirth
作为某种 "shortcut" 语法,用于我在上面所做的显式导航 but this also ends with a empty result set。
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.
}
那么我如何访问维基数据中空白节点(在我的例子中特别是最早的生日)引用的节点?[=18=]
But this blank node references another node…
情况略有不同。 earliest date
属性 不是 _:t550690019
的 属性,而是 语句 [=] 的 属性 14=].
在维基数据中 data model, these annotations are expressed using qualifiers。
您的查询应该是:
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")
}
顺便说一句,时间精度(出生日期已知时使用)是另一个限定符:
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" }
}
我正在尝试检索有关某些人的寿命的数据。对于生活了一段时间的人来说,这是有问题的。例如的数据集Pythagoras 似乎有一个所谓的 "blank node" for date of birth (P569)
。但是这个空白节点引用了另一个节点 earliest date (P1319)
,其中包含我可以正常使用的数据。
但出于某种原因我无法检索该节点。 My first try looked like this,但以某种方式导致结果集完全为空:
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
}
然后我发现了另一种语法,它建议使用 ?person wdt:P569/wdt:P1319 ?earliestdateofbirth
作为某种 "shortcut" 语法,用于我在上面所做的显式导航 but this also ends with a empty result set。
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.
}
那么我如何访问维基数据中空白节点(在我的例子中特别是最早的生日)引用的节点?[=18=]
But this blank node references another node…
情况略有不同。 earliest date
属性 不是 _:t550690019
的 属性,而是 语句 [=] 的 属性 14=].
在维基数据中 data model, these annotations are expressed using qualifiers。
您的查询应该是:
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")
}
顺便说一句,时间精度(出生日期已知时使用)是另一个限定符:
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" }
}