本文介绍了如何检查从SPARQL*通配符展开的所有级别的子属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Wikidata中,我要查找项目的国家/地区。如果物品有国家,直接直接,或者爬上P131(位于行政领土实体),直到我找到一个国家。以下是查询:

?item wdt:P131*/wdt:P17 ?country.
上面的查询运行良好.除非一个分区过去属于另一个国家,比如Q25270(普里什蒂纳)。在这种情况下,结果可能是不合时宜的。这就是我要解决的问题。

好消息:在这种情况下,我们只需要考虑没有P582(结束时间)子属性的唯一P131(位于行政属地实体中),问题就解决了!

我的问题:如何更改上面的查询以实现此目的?

示例:假设MyItemMyStreetMyCityMyRegionMyCountry中,我必须确保MyStreetMyCityMyRegion没有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 ) ) .
}

推荐答案

Wikidata对直接链接和带有额外信息的链接使用不同的属性。因此,对于"普里什蒂纳位于科索沃的行政领土实体社会主义自治省"这句话,有一个简单的三元组:

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设置了多个值,则此查询似乎会超时。此外,查询没有考虑到从一个项目到一个区域可能存在多个链接,其中一个链接有时间戳,另一个没有时间戳(两条路径都将被过滤掉)。

这篇关于如何检查从SPARQL*通配符展开的所有级别的子属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-05 18:08