方法 1
これは、通常モデルにアサートされないため、モデルに推論があるかどうかに依存し、推論の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()
方法 2
推論を必要としません。
for (Iterator<OntClass> i = m.listHierarchyRootClasses(); i.hasNext(); ) {
OntClass hierarchyRoot = i.next();
....
}
クラス式を表す匿名リソースであっても、このメソッドはルート クラスを返すことに注意してください。UI の目的では、これは多くの場合、必要なものではありません (ユーザーにとって意味のある方法で bNode を表示するのは困難です)。この場合、代わりにOntTools.namedHierarchyRootsを使用してください。
アップデート
Alan が特定のクラスの親であるルート クラスを必要としているのに対し、クラス階層のすべてnamedHierarchyRoots
のルート クラスを一覧表示することを理解しました。一般に、クラスはそれと の間にゼロ、1 つ、または多数の名前付きスーパークラスを持つことができることに注意してください。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;
}