如何检查从 SPARQL * 通配符扩展的所有级别的子 属性?
How to check for a sub-property at all levels expanded from a SPARQL * wildcard?
在维基数据中,我想找到一个项目的国家。如果物品直接有一个国家,或者直接爬上 P131s(位于行政领土实体),直到我找到一个国家。这是查询:
?item wdt:P131*/wdt:P17 ?country.
上面的查询工作正常...除非一个分区曾经属于另一个国家,例如 Q25270(普里什蒂纳)。在这种情况下,结果可能是不合时宜的。这就是我要解决的问题。
好消息:在这种情况下,我们应该只考虑没有附加P582(结束时间)子属性的唯一P131(位于行政领土实体),问题就解决了!
我的问题:如何修改上面的查询来实现?
示例:假设 MyItem 在 MyStreet 在 MyTown 位于 MyRegion 位于 MyCountry,我必须确保 MyStreet, MyTown 和 MyRegion 没有 P582(结束时间)。
(如果 "sub-property" 不是正确的术语,请告诉我正确的术语,我会解决问题,谢谢!)
一次尝试
下面的查询在 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 ) ) .
}
维基数据对直接链接和带有额外信息的链接使用不同的属性。因此,对于语句 "Prishtina is located in the administrative territorial entity Socialist Autonomous Province of Kosovo",有一个简单的三元组:
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
到一个国家的路径上的语句。
如果为 ?s
设置了多个值,则此查询似乎会超时。此外,查询没有考虑到可能存在从一个项目到一个区域的多个链接,其中一个有时间戳,另一个没有(两条路径都将被过滤掉)。
在维基数据中,我想找到一个项目的国家。如果物品直接有一个国家,或者直接爬上 P131s(位于行政领土实体),直到我找到一个国家。这是查询:
?item wdt:P131*/wdt:P17 ?country.
上面的查询工作正常...除非一个分区曾经属于另一个国家,例如 Q25270(普里什蒂纳)。在这种情况下,结果可能是不合时宜的。这就是我要解决的问题。
好消息:在这种情况下,我们应该只考虑没有附加P582(结束时间)子属性的唯一P131(位于行政领土实体),问题就解决了!
我的问题:如何修改上面的查询来实现?
示例:假设 MyItem 在 MyStreet 在 MyTown 位于 MyRegion 位于 MyCountry,我必须确保 MyStreet, MyTown 和 MyRegion 没有 P582(结束时间)。
(如果 "sub-property" 不是正确的术语,请告诉我正确的术语,我会解决问题,谢谢!)
一次尝试
下面的查询在 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 ) ) .
}
维基数据对直接链接和带有额外信息的链接使用不同的属性。因此,对于语句 "Prishtina is located in the administrative territorial entity Socialist Autonomous Province of Kosovo",有一个简单的三元组:
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
到一个国家的路径上的语句。
如果为 ?s
设置了多个值,则此查询似乎会超时。此外,查询没有考虑到可能存在从一个项目到一个区域的多个链接,其中一个有时间戳,另一个没有(两条路径都将被过滤掉)。