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

aui*_*ino 11 entity subclass instance sparql

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

我可以用这种方式得到C的所有直接子类:

SELECT ?entity
WHERE {
  ?subclass rdfs:subClassOf :C .
  ?entity rdf:type ?subclass .
}
Run Code Online (Sandbox Code Playgroud)

但我不能得到间接子类的实例,也不能得到任何C的实例.

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

SELECT ?entity
WHERE {
  ?entity rdf:type in <list>.
}
Run Code Online (Sandbox Code Playgroud)

谢谢大家.

编辑:

我刚刚解决了它,即使是以一种不优雅的方式.

SELECT ?entity
WHERE {
  { ?entity rdf:type :C }
  UNION { ?entity rdf:type :SubClass1 }
  UNION { ?entity rdf:type :SubClass2 }
  UNION { ?entity rdf:type :SubClass3 }
}
Run Code Online (Sandbox Code Playgroud)

Wil*_*nly 27

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

这将被重写为:

SELECT ?entity
WHERE {
  ?entity rdf:type ?type.
  ?type rdfs:subClassOf* :C.
}
Run Code Online (Sandbox Code Playgroud)

  • 这取决于三重商店,这可能会或可能不会.并非所有三元组都实现属性路径表达式. (2认同)

Rob*_*kka 5

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

SELECT ?entity
WHERE {
    ?entity rdf:type/rdfs:subClassOf* :C
}
Run Code Online (Sandbox Code Playgroud)

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