your mistake is here:

Triple sameAsTriple =new Triple(
         ontModel.getResource("http://test/kbA#memberA";).asNode(), 
ontModel.getResource("owl:sameAs").asNode(), 
ontModel.getResource("http://test/kbB#memberB";).asNode());

the methods expects a proper URI, not a prefixed one - the reason for this is that there is nothing that would prevent users from using the the prefix owl: for some other namespace, so Jena can't guess here

You could indeed also make use of Jena built-in vocab methods:

Triple sameAsTriple =new Triple(
         ontModel.getResource("http://test/kbA#memberA";).asNode(), OWL.sameAs.asNode(), 
ontModel.getResource("http://test/kbB#memberB";).asNode());
or indeed just use the full URI of owl:sameAs


Cheers,

Lorenz

On 28.10.22 14:26, Steve Vestal wrote:
I make a call model.remove(statement) for a statement that is listed in that model, but that statement stays listed.

The following example code is a bit lengthy due to setup and alternatives tried, but it is executable (with Jena imports added).  I think this is a simple misunderstanding of models, statements, and triples.  Look for the "Why doesn't this work?" comment and the print of "base contents after remove".   How should this be done?  I am using Jena 4.5.0.

public class BaseModelEdits {

        public static void main(String args[]) {

            // Jena documentation says,
            // "And when we update the model, only the base model changes."

            // Create two knowledge bases that will not change during use.             OntModel kbA = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
            OntClass classA = kbA.createClass("http://test/kbA#classA";);
            kbA.createIndividual("http://test/kbA#memberA";, classA);
            kbA.createIndividual("http://test/kbA#memberC";, classA);
            OntModel kbB = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
            OntClass classB = kbB.createClass("http://test/kbB#classB";);
            kbB.createIndividual("http://test/kbB#memberB";, classB);
            kbB.createIndividual("http://test/kbB#memberD";, classB);

            // Create initial content for an editable base model
            OntModel initialBase = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);             OntResource memA = initialBase.createOntResource("http://test/kbA#memberA";);             OntResource memB = initialBase.createOntResource("http://test/kbB#memberB";);
            memA.addSameAs(memB);

            // Create an OntModel with the initial base plain Model content.             OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_MICRO_RULE_INF, initialBase.getBaseModel());

            // None of the above have import statements (for reasons I won't go into).
            // Add the knowledge bases as plan Model subModels.
            ontModel.addSubModel(kbA.getBaseModel());
            ontModel.addSubModel(kbB.getBaseModel());

            Individual memberA = ontModel.getIndividual("http://test/kbA#memberA";);             Individual memberB = ontModel.getIndividual("http://test/kbB#memberB";);             Individual memberC = ontModel.getIndividual("http://test/kbA#memberC";);             Individual memberD = ontModel.getIndividual("http://test/kbB#memberD";);             System.out.println("memberA sameAs memberB true = " + memberA.isSameAs(memberB));             System.out.println("memberA sameAs memberC false = " + memberA.isSameAs(memberC));             System.out.println("memberA sameAs memberD false = " + memberA.isSameAs(memberD));             System.out.println("memberB sameAs memberC false = " + memberB.isSameAs(memberC));             System.out.println("memberB sameAs memberD false = " + memberB.isSameAs(memberD));
            System.out.println();

            // Approach 1: Selectively remove the sameAs assertion
            // Why doesn't this work?

            System.out.println("initial base contents");
            StmtIterator baseStmts = ontModel.getBaseModel().listStatements();
            while (baseStmts.hasNext()) {
                System.out.println("    " + baseStmts.next().asTriple().toString());
            }
            // Removing the sameAs assertion will require knowing how it is encoded.
            // None of the following three Triple formulations work.
//            Triple sameAsTriple = new Triple(NodeFactory.createURI("http://test/kbA#memberA";), //                    NodeFactory.createURI("owl:sameAs"), NodeFactory.createURI("http://test/kbB#memberB";));
            Triple sameAsTriple = new Triple(
ontModel.getResource("http://test/kbA#memberA";).asNode(),
ontModel.getResource("owl:sameAs").asNode(),
ontModel.getResource("http://test/kbB#memberB";).asNode());
//            Triple sameAsTriple = new Triple(
// ontModel.getBaseModel().getResource("http://test/kbA#memberA";).asNode(),
// ontModel.getBaseModel().getResource("owl:sameAs").asNode(),
// ontModel.getBaseModel().getResource("http://test/kbB#memberB";).asNode());
            // The following three statements do not work.
            Statement assertSameAs = ontModel.asStatement(sameAsTriple);
            ontModel.add(assertSameAs);  // Makes no difference
            ontModel.remove(assertSameAs);
            // These three do not not work either.
            // Making changes via the OntModel is needed anyway (for reasons I won't go into). //            Statement assertSameAs = ontModel.getBaseModel().asStatement(sameAsTriple); //            ontModel.getBaseModel().add(assertSameAs);     // Makes no difference
//            ontModel.getBaseModel().remove(assertSameAs);
            ontModel.rebind();
            System.out.println("base contents after remove " + assertSameAs.asTriple().toString());
            baseStmts = ontModel.getBaseModel().listStatements();
            while (baseStmts.hasNext()) {
                System.out.println("    " + baseStmts.next().asTriple().toString());
            }
            System.out.println("memberA sameAs memberB false = " + memberA.isSameAs(memberB));             System.out.println("memberA sameAs memberC false = " + memberA.isSameAs(memberC));             System.out.println("memberA sameAs memberD false = " + memberA.isSameAs(memberD));             System.out.println("memberB sameAs memberC false = " + memberB.isSameAs(memberC));             System.out.println("memberB sameAs memberD false = " + memberB.isSameAs(memberD));
            System.out.println();

            // Approach 2: Remove everything in the base model.
            // This works.

            ontModel.getBaseModel().removeAll();
            // A rebind is necessary here.
            // Would any of the reasoners do incremental rebinding
            // if they knew only certain assertions changed?
            ontModel.rebind();
            System.out.println("base contents after removeAll ");
            baseStmts = ontModel.getBaseModel().listStatements();
            while (baseStmts.hasNext()) {
                System.out.println("    " + baseStmts.next().asTriple().toString());
            }
            System.out.println("memberA sameAs memberB false = " + memberA.isSameAs(memberB));             System.out.println("memberA sameAs memberC false = " + memberA.isSameAs(memberC));             System.out.println("memberA sameAs memberD false = " + memberA.isSameAs(memberD));             System.out.println("memberB sameAs memberC false = " + memberB.isSameAs(memberC));             System.out.println("memberB sameAs memberD false = " + memberB.isSameAs(memberD));
        }
}

Reply via email to