查找 类 应该是实例 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)
听起来很简单,但我还没有找到一个好的解决方案。我想在我的 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: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)