某些情况下,Wikidata中的首选排名无法正常工作?

时间:2018-08-17 14:21:15

标签: sparql wikidata

因此,我目前正在一个项目中,我正在使用从Wikidata获得的数据,并且注意到数据库中有很多重复的元素。原因是我收到不同时间点的人口数字。

我已经读到Wikidata对具有多堆值的语句和似乎是最新值的种群属性进行排名-对于大约99.9%的条目而言,这是正确的。我不明白的是为什么它对其他0.1%无效。

一个例子是:Wikidata query

例如元素

也会发生同样的情况

我不知道为什么。

我已经尝试过this topic的解决方案,但是并没有改变结果。

有什么想法吗?


根据以下线程中的过滤器选项进行编辑:wikidata query 2

编辑2:Full query

1 个答案:

答案 0 :(得分:1)

某些Wikidata属性由PreferentialBotsource code)处理。

简而言之,该漫游器会发布最新的语句preferred,因此它们是truthy

有时,漫游器不处理属性的语句。例如,该机器人不会处理包含没有相应限定词的语句的项目。

在您的特定情况下:

SELECT DISTINCT ?city ?cityLabel ?population ?date ?rank WHERE {
  VALUES (?settlement) {(wd:Q515) (wd:Q15284)}
  VALUES (?city) {(wd:Q1658752)}
  ?city wdt:P31/wdt:P279* ?settlement . 
  ?city p:P1082 ?statement .
  ?statement ps:P1082 ?population .
  ?statement wikibase:rank ?rank
  OPTIONAL { ?statement pq:P585 ?date }  
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" }   
} ORDER by ?date

Try it

结果:

+-------------+-----------+------------+----------------------+---------------------+
|    city     | cityLabel | population |        date          |         rank        |
+-------------+-----------+------------+----------------------+---------------------+
| wd:Q1658752 | Kagan     |      86745 |                      | wikibase:NormalRank |
| wd:Q1658752 | Kagan     |      17656 | 1939-01-01T00:00:00Z | wikibase:NormalRank |
| wd:Q1658752 | Kagan     |      21103 | 1959-01-01T00:00:00Z | wikibase:NormalRank |
| wd:Q1658752 | Kagan     |      34117 | 1970-01-01T00:00:00Z | wikibase:NormalRank |
| wd:Q1658752 | Kagan     |      41565 | 1979-01-01T00:00:00Z | wikibase:NormalRank |
| wd:Q1658752 | Kagan     |      48054 | 1989-01-01T00:00:00Z | wikibase:NormalRank |
+-------------+-----------+------------+----------------------+---------------------+

您希望使用最近的声明还是“永恒的”声明?

这是找到最近人口的方法:

SELECT DISTINCT ?city ?cityLabel ?population WHERE {
  VALUES (?settlement) {(wd:Q515) (wd:Q15284)}
  VALUES (?city) {(wd:Q1658752)}
  ?city wdt:P31/wdt:P279* ?settlement . 
  ?city p:P1082 [ ps:P1082 ?population; pq:P585 ?date1 ]  
  FILTER NOT EXISTS {
    ?city p:P1082 [ pq:P585 ?date2 ]
    FILTER (?date2 > ?date1) }
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" }   
}

Try it

这是您找到“永恒”的方式:

SELECT DISTINCT ?city ?cityLabel ?population WHERE {
  VALUES (?settlement) {(wd:Q515) (wd:Q15284)}
  VALUES (?city) {(wd:Q1658752)}
  ?city wdt:P31/wdt:P279* ?settlement . 
  ?city p:P1082 ?statement .
  ?statement ps:P1082 ?population .
  FILTER NOT EXISTS {?statement pq:P585 []}
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" }   
}

Try it


实际上,具有P1082属性的条目中几乎有70%(不是0.1%)没有此属性的首选语句。您应该指的是具有P1082属性的条目,该条目对该属性具有多个真实声明。回想一下:

  

Truthy语句表示对于给定属性具有最佳非弃用等级的语句。即,如果存在属性P2的首选语句,则仅将P2的首选语句视为真实。否则,所有P2的正常排名陈述都被认为是真实的。

是的,大约有P1082陈述的条目中有0.5%具有两个或多个真实的P1082陈述。