SPARQL:获取某个类的子类所有实体

19

我需要获取类C及其所有子类(直接或间接)的所有实例,在SPARQL中。

我可以通过以下方式获取所有C的直接子类:

SELECT ?entity
WHERE {
  ?subclass rdfs:subClassOf :C .
  ?entity rdf:type ?subclass .
}

但我无法获取间接子类的实例,也无法获取 C 的任何实例。

据我所知(已经预先计算),所有 C 的直接和间接子类都可以构建一个动态查询,是否可能构建以下查询?

SELECT ?entity
WHERE {
  ?entity rdf:type in <list>.
}

感谢大家。

编辑:

我刚刚解决了它,虽然不是很优雅。

SELECT ?entity
WHERE {
  { ?entity rdf:type :C }
  UNION { ?entity rdf:type :SubClass1 }
  UNION { ?entity rdf:type :SubClass2 }
  UNION { ?entity rdf:type :SubClass3 }
}
3个回答

41
更好的解决方案是在SPARQL 1.1中使用属性路径表达式。
重写后的代码如下:
SELECT ?entity
WHERE {
  ?entity rdf:type ?type.
  ?type rdfs:subClassOf* :C.
}

2
根据三元组存储,这可能有效,也可能无效。并非所有的三元组存储都实现了属性路径表达式。 - Manuel Salvadores
作为更新,虽然可能仍然存在旧的三元组存储,但属性路径已经被纳入SPARQL 1.1中,因此任何支持当前标准的三元组存储都将支持属性路径。 - Joshua Taylor
这很优雅,但只有在所有(子)类都在默认图中才能工作。属性路径不会跨命名图边界工作。 - Martynas Jusevičius
这个答案可能已经过时了吗?我不得不使用Robin Keskirarkka的语法。 - Cris

12

基于SPARQL 1.1规范,正确的做法是:

SELECT ?entity
WHERE {
    ?entity rdf:type/rdfs:subClassOf* :C
}

如果没有属性路径的支持,就无法表达任意长度的类层次结构。


0

为了完整起见,现在如果图形具有基本的RDFS推理(或更好),您可以进行直接查询:

SELECT ?entity
WHERE {
    ?entity rdf:type :C
}

从技术上讲,这意味着不需要属性路径,但是所有相关的SPARQL查询引擎今天至少都是1.1版本,如果不是RDF*兼容的话。

如果使用一个预处理推理计算的引擎,并且根据类层次结构的深度,这个解决方案通常比以前的解决方案更快。


好的。你能给一些关于“基于RDFS推理”和“预处理推理计算的引擎”解决方案的例子吗? - undefined
@matthaeus 推理引擎将预先计算所有推理三元组,或在查询时计算它们。这通常需要在特定的SPARQL引擎中进行配置,以提供对一组指定图形的推理,使用指定的推理“蕴含”——您所需的推理级别。然后,您可以像使用其他图形一样在查询中使用该图形。对于预处理推理,一些引擎将等待第一个查询来计算三元组。每个实现都有自己的方法来配置推理图,超出了本讨论的范围。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接