SPARQL 递归:获取类、父类或祖父类等的属性


  • >我有脾气暴躁的猫维基数据项,我想获取它作为实例的项目的图标属性,即猫。
  • 如果猫没有图标,
  • 那么我想要猫的父类的图标,这是驯养动物。
  • 如果驯养动物没有图标,
  • 那么我想要驯养动物父类的图标,即动物
  • 等等,递归,直到找到图标或直到不再有父类。

如何在SPARQL中获得它?

特别是,如果猫和动物都有图标,那么我想得到猫的图标而不是动物的图标,因为它更接近脾气暴躁的猫。

如果项目是多个类的实例,或者如果一个类是多个类的子类,那么如果可以浏览所有分支并选择最接近的图标,那就太好了。性能非常重要,我希望查询可以在不到一秒的时间内运行 https://query.wikidata.org。我尝试过基于不合时宜的减号子句编写查询,但它并不是真正的递归。

如果需要用于测试目的,这里有许多带有图标的维基数据项目。

你不能递归地在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将确保查询仅返回一个图标。

最新更新