1

我正在使用 Jena 自动实例化 OWL 模型。因为每个人都需要一个唯一的标识符。

我怎么知道给定 OWL 类的个体数量,以便id为下一个个体在这个类中实例化生成一个新的?

我已经尝试使用以下 Jena Java 代码,方法listIndividuals是 Here It is,但它不起作用。

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,您将需要考虑使用OWLAPI,它是一个以 OWL 为中心的 Java API。Jena 很棒,但它更多地以 RDF/triples 为中心,这使得用于真正的基于 OWL 的应用程序变得很麻烦(至少在我的经验中)。如果您要在应用程序中进行大量推理,您可能还想考虑使用专用的 OWL 推理器,例如HermiTPellet 。

于 2012-06-19T13:51:32.040 回答
2

如果我做的数学正确,那么无论如何你都会有一个错误。尝试:

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 回答