如何在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!=?超级
和?其他子系统!=?超级