如何在SPARQL中查询所有直接子类?

如何在SPARQL中查询所有直接子类?,sparql,Sparql,我将A、B和C作为与可传递属性isSubClassOf相关的类。 因此A发行B类和B发行C类。因此,通过推断,我们得到了一个C类的问题 我的问题是:如何编写SPARQL查询,以便只返回每个类的直接子类编号。比如说 A 0 B 1 C 1 在标准SPARQL语言中,您可以通过查询“中间”不存在其他子类的子类来实现这一点,如下所示: SELECT ?directSub ?super WHERE { ?directSub rdfs:subClassOf ?super .

我将
A
B
C
作为与可传递属性
isSubClassOf
相关的类。 因此
A发行B类
B发行C类
。因此,通过推断,我们得到了一个C类的问题

我的问题是:如何编写SPARQL查询,以便只返回每个类的直接子类编号。比如说

A    0 
B    1
C    1  

在标准SPARQL语言中,您可以通过查询“中间”不存在其他子类的子类来实现这一点,如下所示:

 SELECT ?directSub ?super 
 WHERE { ?directSub rdfs:subClassOf ?super .
         FILTER NOT EXISTS { ?otherSub rdfs:subClassOf ?super. 
                             ?directSub rdfs:subClassOf ?otherSub .
                             FILTER (?otherSub != ?directSub)
         }
 }
如果要计算子类的数量,则需要使用
count
groupby
运算符调整上述查询

然而,许多SPARQL引擎提供了一些查询直接子类的快捷方式。例如,在Sesame中,当以编程方式进行查询时,可以通过将
query
对象上的布尔属性设置为
false
来禁用查询期间的推断。它还提供了一个额外的推理器,可以在数据存储上进行配置,并允许您使用“虚拟”属性
sesame:directsubassof
(以及
sesame:directType
sesame:directsubpertyof
)进行查询


其他SPARQL引擎也有类似的机制

SPARQL不会为您进行推断,因此如果您要求
?x:rdfs:subassof?y
,您将不会得到
?x=A,?y=C
作为答案。@scozy事实上这取决于您使用的SPARQL引擎。默认情况下,某些配置确实支持这种类型的推理。此外,即使SPARQL引擎不进行推理,推理程序也不一定会推理出关系
A isSubClassOf C
。它可能会显式地出现在您查询的数据集中。此查询给出了正确的答案。但是假设一个没有子类的类,我可以得到0作为这个类的答案吗?我认为子类也是自反的,所以你也应该添加检查
?directSub!=?超级
?其他子系统!=?超级