I have class *Expert*, *Research* and *Student*. Student has Master and Phd
subclasses. Expert hasResearch Research, like BernersLee hasResearch
Ontologies. Phd Student also have Research like: Khan hasResearch
Ontologies.
I added a class *StudentExpert* which have no instance but can be created
with Jena rules.
In Protege, when I give: . SELECT *
WHERE { ?sub std:hasResearch ?x } it gives me research of
both Phd and Expert.
I give then: . SELECT *
WHERE { ?sub std:hasResearch ?x . ?sub rdf:type std:Phd }
And it filters research for Phd class only.
In Jena, after read the file, I gives the rules as:
String rule = "[rule1:(?x http://www.semanticweb.org/141#hasResearch ?y) " +
"(?x
http://www.w3.org/1999/02/22-rdf-syntax-ns#rdf:type
http://www.semanticweb.org/141#Phd)" +
"->(?x http://www.w3.org/1999/02/22-rdf-syntax-ns#rdf:type
http://www.semanticweb.org/141#StudentExpert)]";
And query like this:
String str= "Prefix std:<http://www.semanticweb.org/ 141#> " +
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"+ "PREFIX
rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"+
"Select *" + "where { ?x rdf:type std:StudentExpert }";
I expect it will answer me: instance Khan to be StudentExpert instance but
it gives me exception:
Exception in thread "main" com.hp.hpl.jena.query.QueryParseException:
Encountered " <PNAME_NS> "http: "" at line 2, column 13.
Was expecting:
<IRIref> ...
at
com.hp.hpl.jena.sparql.lang.ParserSPARQL11.perform(ParserSPARQL11.java:87)
at
com.hp.hpl.jena.sparql.lang.ParserSPARQL11.parse(ParserSPARQL11.java:40)
at
com.hp.hpl.jena.query.QueryFactory.parse(QueryFactory.java:132)
at
com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:69)
at
com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:40)