InfModel infmodel = ModelFactory.createInfModel(reasoner, m);
Resource vegetarian = infmodel.getResource(source + "Vegetarian");
Resource margherita = infmodel.getResource(source + "Example-Margherita");
if (infmodel.contains(margherita, RDF., vegetarian)) {
System.out.println("Margherita is a memberOf Vegetarian pizza");
}
上面给出的示例由正式的pizza.owl构成。在这只猫头鹰中,Example-Margherita是Margherita类的个人。因此,它已经被写入owl文件中。但是,问题在于推理者应该推断玛格丽特的例子也应该是素食比萨。
任何人都可以举一个例子,说明如何找到一个人的可能的推断类,例如在Protege中吗?(Protege正确地推断Example-Margherita是素食比萨饼。
最佳答案
我解决了我的问题。我认为本体存在问题。因此,我创建了另一个本体来推断个人。我创建的本体包含Person和Person的子类:MalePerson,FemalePerson和MarriedPerson。并且,有两个对象属性(hasSpouse,hasSibling)和一个数据类型属性(hasAge)。
而且,我创建了3个人。
John-MalePerson-hasAge(20)-hasSibling(Jane)
简-女人物-hasSibling(John)-hasSpouse(Bob)
鲍勃-男演员-hasSpouse(简)
而且,我对MalePerson和FemalePerson类设置了两个限制。
对于MalePerson:
hasSpouse最大1
hasSpouse only MalePerson
对于女性:
hasSpouse最大1
hasSpouse only FemalePerson
最后,我使MarriedPerson成为一个已定义的类。在推理之前,MarriedPerson没有个人。但是,模型应该推断出简和鲍勃已婚。因此,最后,MarriedPerson类应具有2个人。
当我使用Jena在Java中运行此代码时,我得到了2个推断的个体。
OntModel ontModel = ModelFactory.createOntologyModel();
InputStream in = FileManager.get().open(inputFileName);
if (in == null) {
throw new IllegalArgumentException( "File: " + inputFileName + " not found");
}
ontModel.read(in, "");
Reasoner reasoner = ReasonerRegistry.getOWLReasoner();
reasoner = reasoner.bindSchema(ontModel);
// Obtain standard OWL-DL spec and attach the Pellet reasoner
OntModelSpec ontModelSpec = OntModelSpec.OWL_DL_MEM;
ontModelSpec.setReasoner(reasoner);
// Create ontology model with reasoner support
OntModel model = ModelFactory.createOntologyModel(ontModelSpec, ontModel);
// MarriedPerson has no asserted instances
// However, if an inference engine is used, two of the three
// individuals in the example presented here will be
// recognized as MarriedPersons
//ns is the uri
OntClass marPerson = model.getOntClass(ns + "OWLClass_00000003866036241880"); // this is the uri for MarriedPerson class
ExtendedIterator married = marPerson.listInstances();
while(married.hasNext()) {
OntResource mp = (OntResource)married.next();
System.out.println(mp.getURI());
} // this code returns 2 individuals with the help of reasoner