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