如何在SPARQL中获取它?
特别是,如果猫和动物都有图标,那么我想获得猫的图标,而不是动物的图标,因为它更接近Grumpy Cat。
如果该项是多个类的实例,或者如果一个类是几个类的子类,那么如果可以探索所有分支并选择最接近的图标将会很棒。性能非常重要,我希望查询可以在animal上不到一秒的时间内运行。我试过写一个基于imbricated MINUS子句的查询,但它不是真正的递归。
如果需要用于测试目的,这里是https://query.wikidata.org。
答案 0 :(得分:2)
您不能以递归方式在SPARQL中查找内容,然后在找到第一个内容时停止。您可以做的是获取所有图标,随机图标,或定义您经历的有限数量的课程。
您可以使用一系列可选项来获取最接近的图标(在您定义静态深度的情况下):
# SAMPLE is used here because 1) the resource might have multiple classes,
# and 2) because of the fallback below
SELECT ?item ?itemLabel ?cls ?clsLabel (SAMPLE(?icon) AS ?icon) WHERE {
BIND(wd:Q103474 AS ?item)
?item wdt:P31 ?cls.
OPTIONAL { ?cls wdt:P2910 ?icon. }
OPTIONAL { ?cls (wdt:P279/wdt:P2910) ?icon. }
OPTIONAL { ?cls (wdt:P279/wdt:P279/wdt:P2910) ?icon. }
OPTIONAL { ?cls (wdt:P279/wdt:P279/wdt:P279/wdt:P2910) ?icon. }
# You can continue the optionals with longer property paths,
# here we just fall back to trying the whole class path
# (returning all icons in the path in an arbitrary order).
OPTIONAL { ?cls (wdt:P279+/wdt:P2910) ?icon. }
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
GROUP BY ?item ?itemLabel ?cls ?clsLabel
第一个成功的可选项将绑定?icon
,因此此变量将保留“最接近”的图标。 SAMPLE
将确保查询仅返回一个图标。