Hi Brice,
Using Models with an explicit reasoner or an OntModel with a suitable
OntModelSpec should result in exactly the same inferences.
This list doesn't accept attachments. The thing to do is to cut your
ontology down a minimal complete test case with you then either post
inline or use a pastebin type service.
Cutting the ontology down to a test case may reveal the answer anyway :)
Dave
On 22/07/13 14:29, Brice Sommacal wrote:
Hello Dave,
Thank you for your answer. However, I didn't figure out why it was not
working.
You were right, I was meaning owl:TransitiveProperty.
My first code fragment was using Model while the second piece of code
was using OntModel. I was thinking that this 2 differents Model may have
incidences on the inference engine.
Updating the OntModelSpec to OWL_DL_MEM_RULE___INF didn't change
anything in the output file. I am able to see the infered type, but
nothing about my transitive properties.
See ontology.owl attached.
Regards,
Brice
2013/7/19 Dave Reynolds <[email protected]
<mailto:[email protected]>>
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