1

私は Jena を使用して OWL モデルの自動インスタンス化に取り組んでいます。すべての個人が一意の識別子を必要とするため。

idこの Class でインスタンス化する次の個体の新しいを生成するために、特定の OWL クラスの個体の数をどのように知ることができますか?

メソッドを使用して、次の Jena Java コードを試してみましたがlistIndividuals、ここにありますが、機能していません。

import com.hp.hpl.jena.ontology.*;
import com.hp.hpl.jena.model.*;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;

public static int individualSize(Resource res){

        int size = 0;

        ExtendedIterator<Individual> individuals = domainModel.listIndividuals(res);

        while (individuals.next() != null){ size++; }

        return size;
}

static String xmlbase = "http://www.semantic.org/ontologies/exemple.owl#";
OntModel domainModel = ModelFactory.createOntologyModel(ProfileRegistry.OWL_DL_LANG);
domainModel.read((new FileInputStream(ontoInPath)), null);

int nextId = individualSize(domainModel.getOntClass(xmlbase+"Event"));

System.out.print(nextId);

エラーは次のとおりです。

Exception in thread "main" java.util.NoSuchElementException
    at com.hp.hpl.jena.util.iterator.NiceIterator.ensureHasNext(NiceIterator.java:37)
    at com.hp.hpl.jena.util.iterator.UniqueExtendedIterator.next(UniqueExtendedIterator.java:77)
    at soctrace.Intology.individualSize(Intology.java:225)
    at soctrace.Intology.manageOntologies(Intology.java:124)
    at soctrace.Intology.main(Intology.java:65)

Jena APIこれをより簡単に行うのに役立つ方法はありますか?

いいえの場合!コードを修正するにはどうすればよいですか。

返信ありがとうございます。

4

2 に答える 2

4

あなたのコード:

while (individuals.next() != null){ size++; }

イテレータを使用する正しい方法ではありません。必要なのは次のとおりです。

while (individuals.hasNext()) {
  size++;
  individuals.next();
}

Model.read がまだ閉じていない場合は、その FileInputStream を閉じることもできます。

さらに、OWL を使用することを計画している場合は、OWL 中心の Java API であるOWLAPIの使用を検討する必要があります。Jena は優れていますが、より RDF/トリプル中心であるため、(少なくとも私の経験では) 実際の OWL ベースのアプリケーションに使用するのは面倒です。アプリケーションで多くの推論を行う場合は、 HermiTPelletなどの専用の OWL 推論器の使用も検討する必要があります。

于 2012-06-19T13:51:32.040 に答える
2

私が正しく計算している場合は、とにかく1つずつエラーが発生します。試す:

public static int individualSize(Resource res){

    int size = 0;
    ExtendedIterator<Individual> individuals = domainModel.listIndividuals(res);

    while(individuals.hasNext()) {
        individuals.next();
        size++;
    }
    return size;
}
于 2012-06-19T13:47:38.267 に答える