方法一
这将取决于您的模型是否具有推理器,因为owl:Thing
通常不会在模型中断言,因此不会出现在没有推理器的模型中。鉴于此,那么:
OntModel m = ... your OntModel ...;
OntClass thing = m.getOntClass( OWL.Thing.getURI() );
for (Iterator<OntClass> i = thing.listSubClasses(true); i.hasNext(); ) {
OntClass hierarchyRoot = i.next();
....
}
注意调用中标志的direct = true
使用listSubClasses()
。
方法二
不需要推理机。
for (Iterator<OntClass> i = m.listHierarchyRootClasses(); i.hasNext(); ) {
OntClass hierarchyRoot = i.next();
....
}
请注意,此方法将返回根类,即使它们是代表类表达式的匿名资源。出于 UI 目的,这通常不是您想要的(很难以有意义的方式向用户显示 bNode)。在这种情况下,请改用OntTools.namedHierarchyRoots。
更新
我现在明白 Alan 想要作为特定类的父类的根类,而namedHierarchyRoots
将列出类层次结构的所有根类。请注意,一般来说,一个类在它和 之间可能有零个、一个或多个命名超类Thing
。
无论如何,这就是我将如何解决这个问题。同样,此解决方案假定模型未使用推理器。有了推理器,它会容易得多:
private boolean hasSubClassTransitive( OntClass parent, OntClass child ) {
return OntTools.findShortestPath( child.getOntModel(), child, parent,
new OntTools.PredicateFilter( RDFS.subClassOf ) ) != null;
}
public List<OntClass> namedRootsOf( OntClass c ) {
List<OntClass> cRoots = new ArrayList<OntClass>();
for (OntClass root: OntTools.namedHierarchyRoots( c.getOntModel() )) {
if (hasSubClassTransitive( root, c )) {
cRoots.add( root );
}
}
return cRoots;
}