我正在努力使用Jena自动实现OWL模型。由于每个人都需要唯一的标识符。
我如何知道给定OWL类的个体数量,以便为下一个在此类中实例化的人生成新的id
?
我使用方法listIndividuals
尝试使用以下Jena Java代码,现在是,但它不起作用。
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
有哪些方法可以帮助我更轻松地做到这一点?
如果没有!我怎么能纠正我的代码。
感谢您的回复!
答案 0 :(得分: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推理器,例如HermiT或Pellet。
答案 1 :(得分:2)
如果我正在进行数学运算,那么无论如何你都会有一个错误的错误。尝试:
public static int individualSize(Resource res){
int size = 0;
ExtendedIterator<Individual> individuals = domainModel.listIndividuals(res);
while(individuals.hasNext()) {
individuals.next();
size++;
}
return size;
}