On 19/07/13 15:54, Brice Sommacal wrote:
Hello everyone,
In the past, I was able to execute inference engine to retrieve transitive
values like the following:
// model intialisation
Model typesModel = ModelFactory.createDefaultModel();
typesModel.read(inStream, "RDF");
//function to run inference:
public void applyInference(Model model) throws FileNotFoundException{
Model modelTemp = model;
Reasoner reasoner = ReasonerRegistry.getOWLMicroReasoner();
reasoner = reasoner.bindSchema(ev6Model);
InfModel infmodel = ModelFactory.createInfModel(reasoner, model);
Model modelTemp2 = ModelFactory.createDefaultModel();
Property prop21 = ev6Model.getProperty(ns+"#parentsType");
for (StmtIterator sti = infmodel.listStatements(null, prop21, (RDFNode)
null);
sti.hasNext(); ) {
Statement stmt = sti.nextStatement();
modelTemp2.add(stmt);
}
modelTemp.add(modelTemp2);
}
By "transitive" I assume you mean as in owl:TransitiveProperty?
Actually, I'm working on a other project which deal with OntModel like the
following:
public static OntModel readOntology(File ontoFile) throws
FileNotFoundException
{
Model myModel = null;
FileInputStream inStream = new FileInputStream(ontoFile);
myModel = ModelFactory.createDefaultModel();
myModel.read(inStream, "");
OntModel sourceModel =
ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, myModel);
return sourceModel;
}
I have 2 transitive properties in my model. When I make a call to the
function which deal with inference, the transitive values are not returned.
Here is how my inference engine is initialized:
Reasoner reasoner = ReasonerRegistry.getTransitiveReasoner();
reasoner = reasoner.bindSchema(srcModel);
InfModel infmodel = ModelFactory.createInfModel(reasoner, kbModel);
Can't see how this code fragment relates to the above code fragment.
I'll assume that srcModel is the result of a call to readOntology.
The problem is that the TransitiveReasoner only does transitive closure
(and reduction) of the the subClassOf/subPropertyOf hierarchies. Despite
the name it doesn't handle owl:TransitiveProperty.
You want OWL_MICRO (or better).
I have tried several way to make it works, but I din't figure out yet:
- Modify the inference engine intialization with Model instead of OntModel
Should not make any difference.
- Modify the specification with OntModelSpec.OWL_DL_MEM_RULE_INF instead
of OntModelSpec.OWL_MEM
In readOntology? That should work, though then you don't need the second
InfModel wrapper.
- Modify the reasonner from getTransitiveReasonner to getOwlMicro
That should also work.
I would start with the simplest standalone test which just creates an
OntModel and use OntModelSpec.OWL_MEM_MICRO_RULE_INF. No separate
InfModel wrappers.
If that works then you can repackage to separate out a readOntology
function however you wish.
If it doesn't work then that suggests a problem with the ontology or the
test code. [Or a bug in the reasoner but if you have had the same case
work before then hopefully that's not the case.]
Dave