Hi,

Your code looks fine and since it works with Jena without Pellet that suggests this is a Pellet issue and should be reported to the Pellet folks.

One work around you could try is to explicitly call a rebind() after the changes to age. I don't know if Pellet supports this or why it might necessary but it is one route for asking a reasoner to reconsult the data in the model.

Dave

On 16/11/14 23:17, Kamil Sokolski wrote:
Hello Jena mailing list,

we have a problem concerning the update of datatype property values.
Let's say we have an individual with a datatype property 'age' set to 1
(xsd:int).
If we want to update this property to 2, we Datatype.listRange() to
check if the value type is supported
and update the value with Individual.setPropertyValue()

Without a reasoner in the background this assignment succeeds or if we
don't use listRange, everything runs smoothly, too.
If we bind our model to a pellet reasoner instance, use listRange() and
perform the update, the new value can be seen in
the xml-data of the ontology but if we later try to retrieve this new
value, always the old one is returned.

A SSCCE reproducing our problem is attached.
Jena: 2.10.0, Pellet 2.3.1

     public void sscce() {
         System.out.println(" === SSCCE ===");
         String URI = "http://anarxim.net#";;

         OntModel model =
ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC);
         // the code will work without Pellet
         // OntModel model = ModelFactory.createOntologyModel();

         model.setNsPrefix("anarxim", URI);

         // Create class, individual and datatype property
         OntClass testClass = model.createClass(URI + "Person");
         Individual individual = model.createIndividual(URI + "Jane",
testClass);
         DatatypeProperty property = model.createDatatypeProperty(URI +
"age");
         property.addDomain(testClass);
         property.setRange(XSD.xint);

         // Set property value to 1
         final Literal oldAgeLiteral =
ResourceFactory.createTypedLiteral(new Integer(1));
         individual.setPropertyValue(property, oldAgeLiteral);

         // if the next line is removed, the code will work too
         property.listRange();

         // Update property value to 2
         final Literal newAgeLiteral =
ResourceFactory.createTypedLiteral(new Integer(2));
         individual.setPropertyValue(property, newAgeLiteral);

         // this will fail
         assertEquals("Value not chaned", newAgeLiteral,
individual.getPropertyValue(property).asLiteral());

         // Output to check property value in model, value is 2 as expacted
         model.write(System.out);
     }

Reply via email to