> Hi Dave, thanks a lot it works and I can see BestCategory as object > property. > > Now, myIndividual.getPropertyValue() also gets the value of Object > property? Because I could not found something like > myIndividual.getObjectPropertyValue() Trying it out is not possible for you?
The method getPropertyValue does exactly what is written in the Javadoc [1], nothing more nothing less. That means, it returns the value for the given property and any object property is indeed a property. Again, Javadoc is the first entry point for developers [2] [1] https://jena.apache.org/documentation/javadoc/jena/org/apache/jena/ontology/OntResource.html#getPropertyValue-org.apache.jena.rdf.model.Property- [2] https://jena.apache.org/documentation/javadoc/jena/org/apache/jena/ontology/ObjectProperty.html > > Again thank you. > > On Sat, Jan 14, 2017 at 10:00 PM, Sidra shah <[email protected]> wrote: > >> Yes you are right. I think the rule is Ok, Jena code is Ok but the problem >> is in the ontology part i-e data property/object property. >> >> Let me choose BestCategory as object property and will make its domain >> User class and range as class Category. >> Category class have three members, that is catPhysics, catChemistry and >> catGeography. >> I will let you know the outcome. >> >> Thanks again Dave, >> >> Kind regards >> >> On Sat, Jan 14, 2017 at 9:29 PM, Dave Reynolds <[email protected]> >> wrote: >> >>> On 14/01/17 18:22, Sidra shah wrote: >>> >>>> Thank you Dave for such a detailed reply. Actually you got my problem, >>>> but >>>> I have taken BestCategory as data property and the problem which bothered >>>> me is I want the user BestCategory as a data or object property. >>>> The main idea behind this is I want the value of this property for >>>> further >>>> processing. >>>> For instance, I want if BestCategory==Physics >>>> Then do something. >>>> >>>> Should I take BestCategory as Object property? Do you suggest it.? >>>> >>> In OWL a property can only be a DatatypeProperty or an ObjectProperty but >>> not both. So you have to choose. >>> >>> In general in OWL modelling it is best to use symbols (i.e. URIs) for >>> concepts like "Physics" and so BestCategory (or bestCategory) should be an >>> ObjectProperty. >>> >>> You are completely free choose a different style and decide you will use >>> strings and so make bestCategory an DatatypeProperty. >>> >>> Just be consistent in how you declare it and how you use it. >>> >>> And none of this has anything to do with Jena or with Jena rules! >>> >>> Dave >>> >>> >>>> Kind regards >>>> >>>> On Sat, Jan 14, 2017 at 9:08 PM, Dave Reynolds < >>>> [email protected]> >>>> wrote: >>>> >>>> Hi Sidra, >>>>> You have tried to explain your problem but the example is not minimal >>>>> (it >>>>> has elements in that aren't used) and isn't complete (no data, no >>>>> minimal >>>>> ontology, code doesn't generate any output or test any assertions) and >>>>> it's >>>>> not clear what your problem is. >>>>> >>>>> I'm not clear what you mean by "property not in the data property >>>>> assertion but in the Annotations". I assume are referring to the >>>>> Protege UI >>>>> which in turn suggests that your ontology doesn't match your example >>>>> code. >>>>> If that's the case then you just need to fix your ontology - nothing to >>>>> do >>>>> with jena or jena rules or this list. >>>>> >>>>> In the interests of trying to explain for you and Neha what's needed >>>>> then >>>>> here's your code with some of the unnecessary bits removed and some >>>>> output >>>>> code added. I've also changed the name >>>>> #BestCategory#Physics to #BestCategory_Physics because having a # >>>>> character in your local name is really confusing. But I've not fixed >>>>> any of >>>>> the other style issues with the code or ontology names. >>>>> >>>>> >>>>>>>> OntModel model >>>>> = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM); >>>>> InputStream in = FileManager.get().open("data/test-ont.ttl"); >>>>> model.read(in, "", "Turtle"); >>>>> String ns="http://www.semanticweb.org/t/ontologies/2016/7/myOWL#"; >>>>> OntProperty bestcat=model.getOntProperty(ns+ "BestCategory"); >>>>> >>>>> //Then rule >>>>> String rule ="[rule1: ( ?x http://www.semanticweb.org/t/o >>>>> ntologies/2016/7/myOWL#Physics_Preferred_Category ?cat1 )" + >>>>> "( ?x http://www.semanticweb.org/t/o >>>>> ntologies/2016/7/myOWL#Chem_Pr >>>>> eferred_Category ?cat2 )" + >>>>> "greaterThan(?cat1,?cat2)" + >>>>> " -> (?x http://www.semanticweb.org/t/o >>>>> ntologies/2016/7/myOWL#BestCategory http://www.semanticweb.org/t/o >>>>> ntologies/2016/7/myOWL#BestCategory_Physics )]"; >>>>> >>>>> Reasoner reasoner2 = new GenericRuleReasoner(Rule.parseRules(rule)); >>>>> InfModel infModel = ModelFactory.createInfModel(reasoner2, model); >>>>> for (StmtIterator i = infModel.listStatements(null,b >>>>> estcat,(RDFNode)null); >>>>> i.hasNext();) { >>>>> Statement s = i.next(); >>>>> System.out.println( String.format("%s has best category %s", >>>>> s.getSubject().getLocalName(), >>>>> s.getObject().asResource().getLocalName()) ); >>>>> } >>>>> infModel.write(System.out, "Turtle"); >>>>> <<< >>>>> >>>>> Now to run this we need an ontology but we only need to include those >>>>> declarations used in the sample code (stripping out the bits your don't >>>>> need is part of creating a minimal example). We also need test data to >>>>> trigger the rule but for a minimal example, that might as well go in the >>>>> ontology. So an example minimal "test-ont.ttl" file might be: >>>>> >>>>> >>>>>>>> @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . >>>>> @prefix owl: <http://www.w3.org/2002/07/owl#> . >>>>> @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . >>>>> @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . >>>>> @prefix ex: <http://www.semanticweb.org/t/ontologies/2016/7/myOWL#> . >>>>> >>>>> ex:User a owl:Class . >>>>> ex:BestCategory a owl:ObjectProperty . >>>>> >>>>> ex:Category a owl:Class . >>>>> ex:BestCategory_Physics a ex:Category . >>>>> >>>>> ex:Physics_Preferred_Category a owl:DatatypeProperty . >>>>> ex:Chem_Preferred_Category a owl:DatatypeProperty . >>>>> >>>>> ex:fred a ex:User; >>>>> ex:Physics_Preferred_Category 3 ;minimal >>>>> ex:Chem_Preferred_Category 1 . >>>>> <<< >>>>> >>>>> That breaks lots of OWL naming conventions but at least it matches your >>>>> code. >>>>> >>>>> If we run the sample code now then we see that rule fires correctly and >>>>> outputs: >>>>> >>>>> fred has best category BestCategory_Physics >>>>> >>>>> and that the resulting complete model is displayed as >>>>> >>>>> >>>>>>>> @prefix ex: <http://www.semanticweb.org/t/ >>>>> ontologies/2016/7/myOWL#> . >>>>> @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . >>>>> @prefix owl: <http://www.w3.org/2002/07/owl#> . >>>>> @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . >>>>> @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . >>>>> >>>>> ex:fred a ex:User ; >>>>> ex:BestCategory ex:BestCategory_Physics ; >>>>> ex:Chem_Preferred_Category 1 ; >>>>> ex:Physics_Preferred_Category 3 . >>>>> >>>>> ex:BestCategory a owl:ObjectProperty . >>>>> >>>>> ex:BestCategory_Physics >>>>> a ex:Category . >>>>> >>>>> ex:Chem_Preferred_Category >>>>> a owl:DatatypeProperty . >>>>> >>>>> ex:User a owl:Class . >>>>> >>>>> ex:Physics_Preferred_Category >>>>> a owl:DatatypeProperty . >>>>> >>>>> ex:Category a owl:Class . >>>>> >>>>> That looks correct (or at least looks like it does what you say you are >>>>> trying to do). If I load that into protege then I can see the individual >>>>> fred and the ex:BestCategory property is shown as being a property >>>>> assertion not an axiom. >>>>> >>>>> So on the face of it there is nothing wrong. >>>>> >>>>> Now if that's not enough to help you solve your problem then create a >>>>> similarly complete minimal example which does show your problem. I >>>>> expect >>>>> your ontology will be a lot different from my example. However, for the >>>>> sake of debugging your rule most of it won't be relevant so you should >>>>> be >>>>> able to cut it down to something of comparable size to the above, in >>>>> which >>>>> case it is then possible to post it inline in an email message for >>>>> people >>>>> to look at. If you do this please make sure it really is minimal and >>>>> complete. Also for preference use Turtle (not RDF/XML) syntax because >>>>> that >>>>> is so much easier to read and more compact. >>>>> >>>>> Dave >>>>> >>>>> >>>>> On 14/01/17 16:07, Sidra shah wrote: >>>>> >>>>> Hello All, I have a problem, very same to Neha. I was waiting some >>>>>> answer >>>>>> will come and I will get help but I think it did not solve. >>>>>> I have quiz game for three categories(subjects) Physics, Chemistry and >>>>>> Geography. User have to select one category and questions of that >>>>>> category >>>>>> will come. When user select a category Physics, for instance, 1 will >>>>>> be >>>>>> saved in a property Physics_Preferred_Category. When user select second >>>>>> time Physics when login to the system, 2 will be saved. >>>>>> I have designed a rule, shown below, to see which category user has >>>>>> selected most of the time and will consider that BestCategory for that >>>>>> user. The problem which I have currently is it saved the BestCategory >>>>>> property not in the data property assertion but in the Annotations. >>>>>> >>>>>> I have tried to include possible code but not ontology. If it is >>>>>> allowed I >>>>>> will paste the screen shot of my properties. >>>>>> >>>>>> >>>>>> OntModel model=ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_M >>>>>> EM); >>>>>> InputStream in =FileManager.get().open("F://final.owl"); >>>>>> if (in==null) { >>>>>> throw new IllegalArgumentException( "File: " + " not >>>>>> found"); >>>>>> } model.read(in,""); >>>>>> String ns="http://www.semanticweb.org >>>>>> /t/ontologies/2016/7/myOWL#"; >>>>>> OntClass dil = model.getOntClass(ns + "DiligentUser"); >>>>>> OntClass avgr = model.getOntClass(ns + "AverageUser"); >>>>>> OntProperty bestcat=model.getOntProperty(ns+ "BestCategory"); >>>>>> Individual indiv = user1.createIndividual(ns + name); //name comes >>>>>> from a >>>>>> text field >>>>>> //Then rule >>>>>> >>>>>> String rule ="[rule1: ( ?x http://www.semanticweb.org/t/ >>>>>> ontologies/2016/7/myOWL#Physics_Preferred_Category ?cat1 )" + >>>>>> "( ?x http://www.semanticweb.org/t/ontologies/2016/7/myOWL#Chem_ >>>>>> Preferred_Category ?cat2 )" + >>>>>> // "( ?x http://www.semanticweb.org/t/o >>>>>> ntologies/2016/7/myOWL#Geo_ >>>>>> Preferred_Category ?cat3 )" + >>>>>> // "greaterThan(?cat1,?cat2), greaterThan(?cat1,?cat3)" >>>>>> + " -> (?x http://www.semanticweb.org/t/o >>>>>> ntologies/2016/7/myOWL# >>>>>> BestCategory http://www.semanticweb.org/t/ontologies/2016/7/myOWL# >>>>>> BestCategory#Physics )]"; >>>>>> >>>>>> //in ?cat1, ?cat2 ?cat3 there will be numbers like 1 2 3 >>>>>> >>>>>> Reasoner reasoner2 = new GenericRuleReasoner(Rule.parseRules(rule)); >>>>>> InfModel infModel = ModelFactory.createInfModel(reasoner2, >>>>>> model); >>>>>> >>>>>> infModel.listStatements(null,bestcat,(RDFNode)null); >>>>>> } >>>>>> >>>>>> >>>>>> -- Lorenz Bühmann AKSW group, University of Leipzig Group: http://aksw.org - semantic web research center
