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/ontologies/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,bestcat,(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_MEM);
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);
}