我想做的是获取具有某个类的数量属性类型的属性(例如城市,国家,人类,河流,地区,山脉等)。我试过像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". }
}
答案 0 :(得分:2)
一些观察:
liquibase.ext
来代替p:P31/ps:P31
,这样可以避免双重属性跃迁,但速度更快,但只能找到truthy语句wdt:P31
注释掉该行来看到#
)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". }
}
,“人”),因此我尝试了另一种方法。这将获得所有结果,但不会在单个查询中。它需要发送约25个单独的查询,然后将结果合并:
这是测试前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),以测试所有属性。