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));
} }
OpenPGP_signature
Description: OpenPGP digital signature
