我想要做的是获取具有某个类的数量属性类型的属性(例如城市,国家,人类,河流,地区,山等)。我试过像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". }
}
一些观察:
p:P31/ps:P31
,你可以使用wdt:P31
,它通过避免两个属性跳更快,但只找到truthy语句#
来评论该行。DISTINCT
)DISTINCT
的属性检索移动到子查询中,并且仅在少数属性的末尾调用标签服务,可以避免这种情况这对我有用:
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". }
}
得知上面的方法对一些最大的类别(如wd:Q5
,“人类”)不起作用,我尝试了一种不同的方法。这将获得所有结果,但不能在单个查询中获得。它需要发送~25个单独的查询并在之后组合结果:
这是测试前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,以测试所有属性。