0

フクロウのオントロジーを処理するために jena フレームワークを使用しています。

Thing クラスのすぐ下にあるスーパークラスを見つけることができるメソッドを書きたいと思います。

4 つの例として、5 つのレベルの階層がある場合、最初のレベルが Thing、2 番目のレベルが secondAncestor、3 番目のレベルが ThirdAncestor などとします。クラス FifthAncestor を渡す場合、Thing は意味をなさないため、SecondAncestor を返したいと思います。ThirdAncestor を渡す場合は、SecondAncestor を返したいと思います。つまり、最も一般的なクラスに属しますが、最上位のクラス (モノ) には属しません。

4

2 に答える 2

1

方法 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 = truelistSubClasses()

方法 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;
}
于 2012-11-15T08:22:48.690 に答える
0

reasonerを使用せずに、次の方法で解決策を見つけます。完全な解決策ではありませんが、機能します。名前のない(匿名の)クラスをスーパークラスとして取得した場合、このソリューションは問題も解決します。

最初に、最上位のクラス名を格納する配列を作成しました。

渡されたパラメーターがトップクラスの場合、作成した配列を検索する単純なメソッド。

public Boolean IsTopClass(String ontologyClass)
  {
              //NS is URI of ontology
      String onClass=ontologyClass.replace(NS, "");

      for(String oClass: topLevelClassList)
      {
          if(oClass.equalsIgnoreCase(onClass))
              return true;
      }
      return false;

  }

次に、事の下で最も一般的なクラスを見つける main メソッド:

      public String FindSuperClassUnderThing(OntClass subClass)
  {

     OntClass prevSubClass=subClass;
     OntClass prevprevSubClass=null;         

     String topClass="";

     String supClass=subClass.toString();
     ExtendedIterator<OntClass> superClassList=null;
    while(!this.IsTopClass(topClass))
    {   
        prevprevSubClass=prevSubClass;
        prevSubClass=prevSubClass.getSuperClass();
                    //if returned class is a anonymous class (not a named one)
                    //get list of superclasses and check if there is a topclass
                    //inside the super class list
        if(!prevSubClass.toString().startsWith(NS))
        {
            prevSubClass=prevprevSubClass;
             superClassList= prevSubClass.listSuperClasses();

             while(superClassList.hasNext())
                {
                   OntClass OntClassFromList= superClassList.next();
                    if(this.IsTopClass(OntClassFromList.toString()))
                    {
                    topClass= OntClassFromList.toString();
                    }
                }

        }
        else
        {
            if (this.IsTopClass(prevSubClass.toString()))
            {
                topClass= prevSubClass.toString();
            }
        }


    }

     return topClass;
}
于 2012-11-15T18:19:16.030 に答える