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

Query to get properties of quantity for a certain entity class

我想要做的是获取具有数量 属性 类型的特定 class 属性(例如城市、国家、人类、河流、地区、山脉等)。我尝试了几个 classes,比如 Country (wd:Q6256) 对下面的查询工作正常,但许多其他 classes 使查询超出时间限制。我怎样才能达到优化下面查询的结果?或者有没有其他方法可以在某个 class?

中获取 Quantity 类型的属性
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:优化查询

一些观察:

  • 您可以使用 wdt:P31 而不是 p:P31/ps: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,以测试所有属性。