Recursion SPARQL递归:获取类、父类或父类等的属性 我有Wikidata项,我想获得它是其实例的项的属性,即 如果没有,那么我需要cat父类的图标,即 如果没有,那么我需要驯化动物父类的图标,即 等,直到找到图标或不再有父类为止

Recursion SPARQL递归:获取类、父类或父类等的属性 我有Wikidata项,我想获得它是其实例的项的属性,即 如果没有,那么我需要cat父类的图标,即 如果没有,那么我需要驯化动物父类的图标,即 等,直到找到图标或不再有父类为止,recursion,sparql,wikidata,Recursion,Sparql,Wikidata,如何在SPARQL中实现这一点 特别是,如果猫和动物都有图标,那么我想得到猫的图标而不是动物的图标,因为它更接近暴躁的猫 如果该项是多个类的实例,或者某个类是多个类的子类,那么最好能够探索所有分支,并选择最近的图标。性能非常重要,我希望查询可以在不到一秒钟的时间内运行。我曾经尝试过编写一个基于重叠减号子句的查询,但它不是真正的递归 如果出于测试目的需要,这里有。您不能递归地在SPARQL中查找某些内容,然后在找到第一个时停止。您可以做的是获取所有图标,一个随机图标,或者定义有限数量的类 您可以使

如何在SPARQL中实现这一点

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

如果该项是多个类的实例,或者某个类是多个类的子类,那么最好能够探索所有分支,并选择最近的图标。性能非常重要,我希望查询可以在不到一秒钟的时间内运行。我曾经尝试过编写一个基于重叠减号子句的查询,但它不是真正的递归


如果出于测试目的需要,这里有。

您不能递归地在SPARQL中查找某些内容,然后在找到第一个时停止。您可以做的是获取所有图标,一个随机图标,或者定义有限数量的类

您可以使用一系列选项来获取最近的图标(在定义静态深度的情况下):


第一个成功的可选项将绑定
?图标
,因此此变量将保存“最近的”图标。
SAMPLE
将确保查询只返回一个图标。

您确定始终从头到尾尝试
可选的
s吗?动态优化器更改订单的风险是否为零?(我可以想象一个学习优化器,它执行随机更改只是为了看看什么更快)。因此,不,优化器不应该更改顺序。
# 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