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

时间:2017-03-24 06:28:28

标签: recursion sparql wikidata

  • 我有Grumpy Cat维基数据项,我希望得到项目<{3}}的属性,即icon
  • 如果cat没有cat,那么我想要cat的父类的图标,即icon
  • 如果domesticated animal没有domesticated animal,那么我想要驯养动物的父类的图标,即icon
  • 等等,递归,直到找到一个图标或者直到没有父类为止。

如何在SPARQL中获取它?

特别是,如果猫和动物都有图标,那么我想获得猫的图标,而不是动物的图标,因为它更接近Grumpy Cat。

如果该项是多个类的实例,或者如果一个类是几个类的子类,那么如果可以探索所有分支并选择最接近的图标将会很棒。性能非常重要,我希望查询可以在animal上不到一秒的时间内运行。我试过写一个基于imbricated MINUS子句的查询,但它不是真正的递归。

如果需要用于测试目的,这里是https://query.wikidata.org

1 个答案:

答案 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将确保查询仅返回一个图标。