sparql - 如何检查从 SPARQL * 通配符扩展的所有级别的子属性?

标签 sparql wikidata

在维基数据中,我想找到一个项目的国家。如果元素直接有一个国家,或者直接爬上 P131(位于行政领土实体),直到我找到一个国家。这是查询:

?item wdt:P131*/wdt:P17 ?country.

上面的查询工作正常...除非一个子部门曾经属于另一个国家,比如 Q25270 (普里什蒂纳)。在这种情况下,结果可能是不合时宜的。这就是我要解决的问题。

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

我的问题:如何修改上面的查询来实现?

示例:假设 MyItemMyStreetMyTownMyRegion 位于 MyCountry,我必须确保 MyStreetMyTownMyRegion 没有 P582 (结束时间)。

enter image description here

(如果“子属性”不是正确的术语,请告诉我正确的术语,我会解决问题,谢谢!)

一次尝试

下面的查询适用于 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 territory entity Socialist Autonomous of Kosovo Province”这一陈述,有一个简单的三元组:

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 - 如何检查从 SPARQL * 通配符扩展的所有级别的子属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44301893/

相关文章:

wikidata - 获取某些属性的使用值列表

datetime - 在SparQL中,如何区分2017年和2017年1月1日这样的年份?

sparql - 如何查询使用 Wikidata 和 SPARQL 的人?

sparql - Wikidata - 尽管检索到结果,resultset.hasNext() 仍返回 false

sparql - 如何根据外部标识符(例如 Spotify ID)搜索 wiki 数据?

testing - 如何解决 SPARQL 警告?

SPARQL 不同与简化

java - 从 EC2 窗口访问 Amazon Neptune

python - SPARQL 查询中的 HTTP 错误 500

sparql - 如何在Python中将wiki数据QID转换为实体,反之亦然