查询以获取特定实体类的数量属性

时间:2019-04-04 16:40:37

标签: sparql wikidata

我想做的是获取具有某个类的数量属性类型的属性(例如城市,国家,人类,河流,地区,山脉等)。我试过像Country(wd:Q6256)这样的几个类在下面的查询中可以正常工作,但是许多其他类使查询超出了时间限制。如何优化下面的查询以获得结果?还是有其他方法可以在某个类中获取“数量”类型的属性?

SELECT DISTINCT ?p_ ?pLabel ?pAltLabel
WHERE {
  VALUES (?class) {(wd:Q515)}
  ?x ?p_ [].
  ?x p:P31/ps:P31 ?class.

  ?p wikibase:claim ?p_.
  ?p wikibase:directClaim ?pwdt.
  ?p wikibase:propertyType ?pType.
  FILTER (?pType = wikibase:Quantity)
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ko,en". }
}

1 个答案:

答案 0 :(得分:2)

尝试1:优化查询

一些观察:

  • 您可以使用liquibase.ext来代替p:P31/ps:P31,这样可以避免双重属性跃迁,但速度更快,但只能找到truthy语句
  • 最昂贵的部分是在结尾处调用标签服务,可以通过在行首放置wdt:P31注释掉该行来看到
  • 该查询会检索每个城市的每条声明(很多!),获得声明的属性(很少!),最后只删除重复项(使用#
  • 因此,针对同一属性多次调用标签服务,每次声明一次!这是查询的大问题
  • 通过使用DISTINCT将属性的检索移到子查询中,然后仅在少数属性的末尾调用标签服务,可以避免这种情况
  • 该更改之后,它应该很快,但是仍然很慢,因为查询优化器似乎以错误的顺序评估了查询。根据{{​​3}}的提示,我们可以关闭查询优化程序。

这对我有用:

DISTINCT

尝试2:将任务分为多个查询

了解到上述方法不适用于某些最大类别(例如SELECT ?p ?pLabel ?pAltLabel { hint:Query hint:optimizer "None" . { SELECT DISTINCT ?p_ { VALUES ?class { wd:Q515 } ?x wdt:P31 ?class. ?x ?p_ []. } } ?p wikibase:claim ?p_. ?p wikibase:propertyType ?pType. FILTER (?pType = wikibase:Quantity) SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } } ,“人”),因此我尝试了另一种方法。这将获得所有结果,但不会在单个查询中。它需要发送约25个单独的查询,然后将结果合并:

  • 我们首先列出数量属性。到今天为止,共有503个。
  • 我们只想保留那些在“人类”类型的物品上实际使用的属性。
  • 由于检查速度太慢(它需要查看数百万个项目),因此我们仅检查列表中的前20个属性。
  • 在第二个查询中,我们将检查接下来的20个,依此类推。

这是测试前20个属性的查询:

wd:Q5

SELECT DISTINCT ?p ?pLabel ?pAltLabel { hint:Query hint:optimizer "None" . { SELECT ?p ?pLabel ?pAltLabel { ?p wikibase:propertyType wikibase:Quantity. SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } } OFFSET 0 LIMIT 20 } ?p wikibase:claim ?p_. ?x ?p_ []. ?x wdt:P31 wd:Q5. } 增加到20、40、60等(最多500),以测试所有属性。