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

问题描述 投票:1回答:1

我想要做的是获取具有某个类的数量属性类型的属性(例如城市,国家,人类,河流,地区,山等)。我试过像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". }
}
sparql wikidata
1个回答
2
投票

尝试1:优化查询

一些观察:

  • 而不是p:P31/ps:P31,你可以使用wdt:P31,它通过避免两个属性跳更快,但只找到truthy语句
  • 昂贵的部分是最后调用标签服务,可以通过在行的开头放置#来评论该行。
  • 查询检索每个城市的每个索赔(很多!),获取索赔的属性(少数!),并且最后只删除重复项(使用DISTINCT
  • 因此,对于同一财产,标签服务被多次调用,每次索赔一次!这是查询的一个大问题
  • 通过将DISTINCT的属性检索移动到子查询中,并且仅在少数属性的末尾调用标签服务,可以避免这种情况
  • 在更改之后它应该很快,但仍然很慢,因为查询优化器似乎以错误的顺序评估查询。根据this page的提示,我们可以关闭查询优化器。

这对我有用:

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". }
}

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

得知上面的方法对一些最大的类别(如wd:Q5,“人类”)不起作用,我尝试了一种不同的方法。这将获得所有结果,但不能在单个查询中获得。它需要发送~25个单独的查询并在之后组合结果:

  • 我们首先列出数量属性。截至今天,其中有503个。
  • 我们只想保留那些在“人类”类型的项目上实际使用的属性。
  • 因为检查太慢(需要查看数百万个项目),所以我们首先只检查列表中的前20个属性。
  • 在第二个查询中,我们将检查下一个20,依此类推。

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

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.
}

OFFSET增加到20,40,60等,最多可达500,以测试所有属性。

© www.soinside.com 2019 - 2024. All rights reserved.