You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by Steve Vestal <st...@adventiumlabs.com> on 2022/10/28 12:26:49 UTC

Model#remove statement not working for me

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));
         }
}


Re: Model#remove statement not working for me

Posted by Lorenz Buehmann <bu...@informatik.uni-leipzig.de>.
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));
>         }
> }
>