我在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 }
}
答案 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
}
如果不支持属性路径,则无法表达任意长度的类层次结构。