查找 类 应该是实例 sparql;查找恰好包含 1 个子类的 类

Finding classes which should be instances sparql; Finding classes with exactly 1 subclass

听起来很简单,但我还没有找到一个好的解决方案。我想在我的 ontology 中找到 classes,它正好有一个 subclass.

目前我是这样处理的:

SELECT (COUNT(?anything) AS ?count) ?class
WHERE {
GRAPH <> {

    ?class rdf:type owl:Class.
    ?class rdfs:subClassOf ?anything.
    ?anything rdf:type owl:Class.
   
} group by ?class 

理论上我应该能够按计数排序,并且值为 1 的结果应该只有 1 个子class。但是,当我执行此查询时,计数根本不符合我的预期,例如我的测试用例应该 return 1,它确实如此,但另一个 class 根本没有 subclass,也 returns 1。还有一个 class 有 3 个子classes returns 计数为 4.

在下图中,应该会发现突出显示的 classes 的计数为 1。

您要查找的 SPARQL 查询类似于

SELECT ?class WHERE {
  ?sub rdfs:subClassOf ?class
}
GROUP BY ?class 
HAVING (COUNT(DISTINCT ?sub) = 1)

正如 UninformedUser 在 中提到的,但是,如果有 OWL 可用的推理,可能会有很多您可能意想不到的答案,例如

owl:Nothing rdfs:subClassOf ex:YourClass

ex:YourClass rdfs:subClassOf ex:YourClass

如果这些阻止查询产生您正在寻找的那种结果,您应该添加一个过滤器,例如

SELECT ?class WHERE {
  ?sub rdfs:subClassOf ?class
  FILTER ( ?sub != ?class && ?sub != owl:Nothing )
}
GROUP BY ?class 
HAVING (COUNT(DISTINCT ?sub) = 1)