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

时间:2017-06-01 08:05:07

标签: sparql wikidata

在维基数据中,我想查找某个项目的国家/地区。如果该项目直接具有国家,或者通过攀登P131(位于行政区域实体中)直到我找到一个国家,则直接。这是查询:

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

上面的查询工作得很好......除非分区曾经属于另一个国家,例如Q25270(Prishtina)。在这种情况下,结果可能是不合时宜的。这就是我想解决的问题。

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

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

示例:假设 MyItem 位于 MyStreet 位于 MyTown 位于 MyRegion MyCountry 中,我必须确保 MyStreet MyTown MyRegion 没有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 ) ) .
}

1 个答案:

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