在维基数据中,我想查找某个项目的国家/地区。如果该项目直接具有国家,或者通过攀登P131(位于行政区域实体中)直到我找到一个国家,则直接。这是查询:
?item wdt:P131*/wdt:P17 ?country.
上面的查询工作得很好......除非分区曾经属于另一个国家,例如Q25270(Prishtina)。在这种情况下,结果可能是不合时宜的。这就是我想解决的问题。
好消息:在这种情况下,我们应该只考虑附加没有P582(结束时间)子属性的唯一P131(位于行政区域实体中),问题就解决了!
我的问题:如何更改上面的查询以实现这一目标?
示例:假设 MyItem 位于 MyStreet 位于 MyTown 位于 MyRegion 在 MyCountry 中,我必须确保 MyStreet , MyTown 和 MyRegion 没有P582 (结束时间)。
(如果“子属性”不是正确的术语,请告诉我正确的用语,我将解决问题,谢谢!)
下面的查询适用于most cases,但不幸的是它有一个错误:如果当前国家也是过去的国家,它会找到错误的国家(例如,阿尔萨斯直到1871年才属于法国德国,目前再到法国)。
SELECT DISTINCT ?country WHERE {
wd:Q6556803 wdt:P131* ?area .
?area wdt:P17 ?country .
OPTIONAL {
wd:Q6556803 wdt:P131*/p:P131 [
pq:P582 ?endTime; ps:P131/wdt:P131* ?area
] .
} .
FILTER( !BOUND( ?endTime ) ) .
}
答案 0 :(得分:2)
维基数据使用不同的属性来提供直接链接和带有额外信息的链接。因此,对于“Prishtina位于科索沃社会主义自治省行政区域实体”的声明,有一个简单的三联:
> str(sr.master)
'data.frame': 1941 obs. of 8 variables:
$ Berechnung: Factor w/ 51 levels "Berechnung 1",..: 51 1 12 23 34 45 47 48 49 50 ...
$ Situation : Factor w/ 13 levels "Nach Massnahme 0",..: 6 6 6 6 6 6 6 6 6 6 ...
$ Sachrisiko: num 1857 1857 1857 1337 1342 ...
$ PID : int 2844 2844 2844 2844 2844 2844 2844 2844 2844 2844 ...
$ Case : int 1 1 1 1 1 1 1 1 1 1 ...
$ Differenz : num 0 0 0 -28 -27.7 ...
$ Prozess : Factor w/ 1 level "Murgang": 1 1 1 1 1 1 1 1 1 1 ...
$ Objektart : Factor w/ 1 level "Einfamilienhaus": 1 1 1 1 1 1 1 1 1 1 ...
带有附加信息的长格式(结束时间):
wd:Q25270 wdt:P131 wd:Q646035
因此,我们需要过滤掉具有结束时间(wd:Q25270 p:P131 wds:Q25270-7df79cec-4938-8b6d-4e11-4dde6f72d73b .
wds:Q25270-7df79cec-4938-8b6d-4e11-4dde6f72d73b ps:P131 wd:Q646035 ;
pq:P582 "1990-01-01T00:00:00Z"
)的所有路径:
pq:582
此处,SELECT DISTINCT ?s ?sLabel ?country ?countryLabel {
VALUES ?s {
wd:Q25270
}
?s wdt:P131* ?area .
?area wdt:P17 ?country .
FILTER NOT EXISTS {
?s p:P131/(ps:P131/p:P131)* ?statement .
?statement ps:P131 ?area .
?s p:P131/(ps:P131/p:P131)* ?intermediateStatement .
?intermediateStatement (ps:P131/p:P131)* ?statement .
?intermediateStatement pq:P582 ?endTime .
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" }
}
limit 50
是一个语句,其结束时间位于从?intermediateStatement
到国家/地区的路径上。
如果为?s
设置了多个值,则此查询似乎确实超时。此外,查询没有考虑到可能存在从项目到一个区域的多个链接,其中一个区域具有时间戳而另一个区域没有(两个路径都将被过滤掉)。