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