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

时间:2012-02-09 10:57:24

标签: entity instance subclass sparql

我在SPARQL中获取C的C类和子类(直接或间接)的所有实例。

我可以用这种方式得到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 }
}

2 个答案:

答案 0 :(得分:25)

更好的解决方案是在SPARQL 1.1中使用属性路径表达式

这将改写为:

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

答案 1 :(得分:4)

根据SPARQL 1.1 specification,正确的方法是:

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

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