Hi Dave, Thank you for your support. Yesterday, I was not able to send a minimal example quickly (that's why I have firstly been focused on the data).
My component read a set of XML files and create a OWL files (using Jena). Then, we apply inference rules on it (to create inverse properties and so far, transitive inference). When making the minimal example, I have tried to avoid the read/write thing from XML files and directly populate the model with 4 individuals. And, transitive inference was working well. =>So, the problem came from the data. It was weird because when opening the OWL file within Protégé, everything was well-displayed. Even when I was using a functionnality to see "inferred properties values" (by making a right click on an individual) I was able to see the transitive values. In fact, the error was about a namespace problem when filling the 2 properties on which I want to run inbference. (see details below) *Details:* When reading the XML file, we manage to complete the property of allparents using tcuaInstance.addProperty(allParentsClassName, modelKB.createResource( "#" + getParentUid())); The parent Resource was created in the modelKB. When outputing the model in a file, the default namespace and xml:base properties were filled in with the same namespace. That's why everything was well-displayed in Protégé. However, I was expecting a similar behavior when using jena inference. By replacing, the above line by the full URI of the parentResource, the inference is working well. tcuaInstance.addProperty(allParentsClassName, modelKB.createResource( ONTOLOGY_NAMESPACE + getParentUid())); Thank you again for your support and the directions that you share to help me resolving this use case, BR, Brice 2013/7/22 Dave Reynolds <[email protected]> > Hi, > > That's not a complete, minimal example - there's not enough info there to > create something we can test. There's nothing in that snippet that shows > any transitive inference is possible since we can't see the 3 and 4 other > individuals you are referring to and can't see what properties they have to > start the inference. > > If you can create something more complete so we can see an minimal example > then we might be able to help. > > One oddity which might be cut/paste issues in your email or might mean > there's a namespace problem ... > > In parts of your example you show: > > <#TcClass.RBFParamDef> > > and in other parts > > <http://seamless.pco-**innovation.com/energy/common/** > software/tcua#TcClass.**RBFParamDef<http://seamless.pco-innovation.com/energy/common/software/tcua#TcClass.RBFParamDef> > > > > Unless you have an explicit @base declaration in that Turtle file then > those are two different resources. > > Dave > > > On 22/07/13 15:12, Brice Sommacal wrote: > >> Hi again, >> >> The transitive properties are well-defined in my ontology: >> >> <owl:ObjectProperty rdf:about="#allparents"> >> <rdf:type rdf:resource="http://www.w3.**org/2002/07/owl#** >> TransitiveProperty <http://www.w3.org/2002/07/owl#TransitiveProperty> >> "/> >> <rdfs:range rdf:resource="#TCCLASS"/> >> <rdfs:label >> rdf:datatype="http://www.w3.**org/2001/XMLSchema#string<http://www.w3.org/2001/XMLSchema#string> >> " >> >allparents</rdfs:label> >> <owl:inverseOf rdf:resource="#allchilds"/> >> <rdfs:domain rdf:resource="#TCCLASS"/> >> <rdfs:comment rdf:datatype="http://www.w3.** >> org/2001/XMLSchema#string <http://www.w3.org/2001/XMLSchema#string>" >> >parentClassName</rdfs:**comment> >> </owl:ObjectProperty> >> >> <owl:ObjectProperty rdf:ID="allchilds"> >> <rdfs:range rdf:resource="#TCCLASS"/> >> <rdf:type rdf:resource="http://www.w3.**org/2002/07/owl#** >> TransitiveProperty <http://www.w3.org/2002/07/owl#TransitiveProperty> >> "/> >> <rdfs:domain rdf:resource="#TCCLASS"/> >> <rdfs:label >> rdf:datatype="http://www.w3.**org/2001/XMLSchema#string<http://www.w3.org/2001/XMLSchema#string> >> " >> >allchilds</rdfs:label> >> <owl:inverseOf> >> <owl:ObjectProperty rdf:ID="allparents"/> >> </owl:inverseOf> >> </owl:ObjectProperty> >> >> >> Here are extract from the infModel : >> >> <#TcClass.RBFParamDef> >> a pco:BMIDE , owl:Thing , rdfs:Resource , _:b1 , pco:TCCLASS >> ; >> pco:allchilds < >> http://seamless.pco-**innovation.com/energy/common/** >> software/tcua#TcClass.**RBFOutput<http://seamless.pco-innovation.com/energy/common/software/tcua#TcClass.RBFOutput> >> > >> , < >> http://seamless.pco-**innovation.com/energy/common/** >> software/tcua#TcClass.**RBFExpression<http://seamless.pco-innovation.com/energy/common/software/tcua#TcClass.RBFExpression> >> > >> ; >> pco:childClassName < >> http://seamless.pco-**innovation.com/energy/common/** >> software/tcua#TcClass.**RBFOutput<http://seamless.pco-innovation.com/energy/common/software/tcua#TcClass.RBFOutput> >> > >> , < >> http://seamless.pco-**innovation.com/energy/common/** >> software/tcua#TcClass.**RBFExpression<http://seamless.pco-innovation.com/energy/common/software/tcua#TcClass.RBFExpression> >> > >> ; >> owl:sameAs <#TcClass.RBFParamDef> . >> >> < >> http://seamless.pco-**innovation.com/energy/common/** >> software/tcua#TcClass.**RBFParamDef<http://seamless.pco-innovation.com/energy/common/software/tcua#TcClass.RBFParamDef> >> >>> >>> a pco:BMIDE , owl:Thing , rdfs:Resource , _:b1 , >> pco:TCCLASS ; >> pco:allparents <#TcClass.BusinessElement> ; >> pco:className "RBFParamDef" ; >> pco:custo "False" ; >> pco:description "" ; >> pco:isExportable "false"^^xsd:boolean ; >> pco:isUninheritable "false"^^xsd:boolean ; >> pco:isUninstantiable >> "false"^^xsd:boolean ; >> pco:parentClassName <#TcClass.BusinessElement> ; >> owl:sameAs < >> http://seamless.pco-**innovation.com/energy/common/** >> software/tcua#TcClass.**RBFParamDef<http://seamless.pco-innovation.com/energy/common/software/tcua#TcClass.RBFParamDef> >> > >> . >> >> >> >> I expect 3 individuals in pco:allparents and 4 individuals in >> pco:allchilds. >> >> Initially, pco:allchilds is populated from pco:childclassname. >> Same for pco:allparents with pco:parentClassName. >> >> As you can see, the inferred type values are well retrived. But nothing >> about the inference on transitive properties. >> >> Regards, >> >> >> Brice >> >> >> >> 2013/7/22 Dave Reynolds <[email protected]> >> >> 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:dave.e.reynolds@gmail.****com <[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 >>>> >>>> >>>> >>>> >>> >> >
