From df17e125eef44df55ce51946ab6c074c0cbf58fe Mon Sep 17 00:00:00 2001 From: Damien Goutte-Gattat Date: Fri, 27 Sep 2024 19:33:00 +0100 Subject: [PATCH] Consistently use 'about_edge' slot. The KGCL model is somewhat inconsistent in that the EdgeChange class has a 'about_edge' slot intended to represent the edge (as a {subject, predicate, object} triple) that is being changed, but several of its subclasses (EdgeCreation, EdgeDeletion, MoveUnder, PlaceUnder) _also_ have distinct 'subject', 'predicate', and 'object' slots, which are redundant with the fields of the 'about_edge' slot. I believe these slots are not only useless but also harmful, since it is unclear how the corresponding classes are supposed to be used (i.e., should the subject be set in change.subject or in change.about_edge.subject?). Since I strongly suspect these slots are actually a mistake (and got no indication of the contrary when I raised the issue to the KGCL folks [1]), here we update our code to only deal with the 'about_edge' slot, and completely ignore the "flattened" subject/object/predicate slots. [1] https://github.com/INCATools/kgcl/issues/53 --- .../obofoundry/kgcl/KGCLTextTranslator.java | 17 +++--- .../kgcl/owl/DirectOWLTranslator.java | 23 +++---- .../kgcl/owl/ProvisionalOWLTranslator.java | 12 ++-- .../kgcl/parser/ParseTree2ChangeVisitor.java | 16 +++-- .../obofoundry/kgcl/KGCLReaderTest.java | 26 ++++---- .../kgcl/KGCLTextTranslatorTest.java | 25 ++++---- .../kgcl/owl/DirectOWLTranslatorTest.java | 60 +++++++++++-------- 7 files changed, 103 insertions(+), 76 deletions(-) diff --git a/core/src/main/java/org/incenp/obofoundry/kgcl/KGCLTextTranslator.java b/core/src/main/java/org/incenp/obofoundry/kgcl/KGCLTextTranslator.java index c4ce628..23d21f4 100644 --- a/core/src/main/java/org/incenp/obofoundry/kgcl/KGCLTextTranslator.java +++ b/core/src/main/java/org/incenp/obofoundry/kgcl/KGCLTextTranslator.java @@ -314,26 +314,27 @@ public String visit(ObjectPropertyCreation v) { @Override public String visit(EdgeCreation v) { - return String.format("create edge %s %s %s", renderNode(v.getSubject()), renderNode(v.getPredicate()), - renderNode(v.getObject())); + return String.format("create edge %s %s %s", renderNode(v.getAboutEdge().getSubject()), + renderNode(v.getAboutEdge().getPredicate()), + renderNode(v.getAboutEdge().getObject())); } @Override public String visit(EdgeDeletion v) { - return String.format("delete edge %s %s %s", renderNode(v.getSubject()), renderNode(v.getPredicate()), - renderNode(v.getObject())); + return String.format("delete edge %s %s %s", renderNode(v.getAboutEdge().getSubject()), + renderNode(v.getAboutEdge().getPredicate()), renderNode(v.getAboutEdge().getObject())); } @Override public String visit(PlaceUnder v) { - return String.format("create edge %s rdfs:subClassOf %s", renderNode(v.getSubject()), - renderNode(v.getObject())); + return String.format("create edge %s rdfs:subClassOf %s", renderNode(v.getAboutEdge().getSubject()), + renderNode(v.getAboutEdge().getObject())); } @Override public String visit(RemoveUnder v) { - return String.format("delete edge %s rdfs:subClassOf %s", renderNode(v.getSubject()), - renderNode(v.getObject())); + return String.format("delete edge %s rdfs:subClassOf %s", renderNode(v.getAboutEdge().getSubject()), + renderNode(v.getAboutEdge().getObject())); } @Override diff --git a/core/src/main/java/org/incenp/obofoundry/kgcl/owl/DirectOWLTranslator.java b/core/src/main/java/org/incenp/obofoundry/kgcl/owl/DirectOWLTranslator.java index d686f42..ab62db2 100644 --- a/core/src/main/java/org/incenp/obofoundry/kgcl/owl/DirectOWLTranslator.java +++ b/core/src/main/java/org/incenp/obofoundry/kgcl/owl/DirectOWLTranslator.java @@ -632,17 +632,17 @@ public List visit(ObjectPropertyCreation v) { @Override public List visit(EdgeCreation v) { // TODO: Support subject and object being something else than OWL classes - IRI subjectIRI = findClass(v, v.getSubject().getId()); + IRI subjectIRI = findClass(v, v.getAboutEdge().getSubject().getId()); if ( subjectIRI == null ) { return empty; } - IRI predicateIRI = IRI.create(v.getPredicate().getId()); - IRI objectIRI = IRI.create(v.getObject().getId()); + IRI predicateIRI = IRI.create(v.getAboutEdge().getPredicate().getId()); + IRI objectIRI = IRI.create(v.getAboutEdge().getObject().getId()); OWLAxiom edgeAxiom = null; EdgeType edgeType = getEdgeType(predicateIRI); if ( edgeType == null ) { - onReject(v, "Edge predicate <%s> not found", v.getPredicate().getId()); + onReject(v, "Edge predicate <%s> not found", v.getAboutEdge().getPredicate().getId()); return empty; } @@ -668,9 +668,10 @@ public List visit(EdgeCreation v) { @Override public List visit(EdgeDeletion v) { - IRI subjectIRI = findClass(v, v.getSubject().getId()); - IRI objectIRI = findClass(v, v.getObject().getId()); - IRI predicateIRI = v.getPredicate() != null ? IRI.create(v.getPredicate().getId()) : null; + IRI subjectIRI = findClass(v, v.getAboutEdge().getSubject().getId()); + IRI objectIRI = findClass(v, v.getAboutEdge().getObject().getId()); + IRI predicateIRI = v.getAboutEdge().getPredicate() != null ? IRI.create(v.getAboutEdge().getPredicate().getId()) + : null; if ( subjectIRI == null || objectIRI == null ) { return empty; @@ -697,10 +698,10 @@ public List visit(PlaceUnder v) { * explicitly set to rdfs:subClassOf, so in case it has not been set we do so * here. */ - if ( v.getPredicate() == null ) { + if ( v.getAboutEdge().getPredicate() == null ) { Node predicate = new Node(); predicate.setId(OWLRDFVocabulary.RDFS_SUBCLASS_OF.toString()); - v.setPredicate(predicate); + v.getAboutEdge().setPredicate(predicate); } return visit((EdgeCreation) v); @@ -715,10 +716,10 @@ public List visit(RemoveUnder v) { * memory. In this case it's unclear whether the predicate should be explicitly * set to rdfs:subClassOf, so in case it has not been set we do so here. */ - if ( v.getPredicate() == null ) { + if ( v.getAboutEdge().getPredicate() == null ) { Node predicate = new Node(); predicate.setId(OWLRDFVocabulary.RDFS_SUBCLASS_OF.toString()); - v.setPredicate(predicate); + v.getAboutEdge().setPredicate(predicate); } return visit((EdgeDeletion) v); diff --git a/core/src/main/java/org/incenp/obofoundry/kgcl/owl/ProvisionalOWLTranslator.java b/core/src/main/java/org/incenp/obofoundry/kgcl/owl/ProvisionalOWLTranslator.java index 48b3722..7e94389 100644 --- a/core/src/main/java/org/incenp/obofoundry/kgcl/owl/ProvisionalOWLTranslator.java +++ b/core/src/main/java/org/incenp/obofoundry/kgcl/owl/ProvisionalOWLTranslator.java @@ -126,7 +126,7 @@ public List visit(NodeObsoletionWithNoDirectReplacement v) { @Override public List visit(EdgeCreation v) { - IRI nodeIRI = IRI.create(v.getSubject().getId()); + IRI nodeIRI = IRI.create(v.getAboutEdge().getSubject().getId()); if ( !ontology.containsEntityInSignature(nodeIRI) ) { onReject(v, "Node <%s> not found in signature", nodeIRI.toString()); return empty; @@ -135,8 +135,10 @@ public List visit(EdgeCreation v) { ArrayList changes = new ArrayList(); HashSet annots = new HashSet(); - annots.add(factory.getOWLAnnotation(getKGCLProperty("predicate"), IRI.create(v.getPredicate().getId()))); - annots.add(factory.getOWLAnnotation(getKGCLProperty("object"), IRI.create(v.getObject().getId()))); + annots.add(factory.getOWLAnnotation(getKGCLProperty("predicate"), + IRI.create(v.getAboutEdge().getPredicate().getId()))); + annots.add( + factory.getOWLAnnotation(getKGCLProperty("object"), IRI.create(v.getAboutEdge().getObject().getId()))); addMetadata(v, annots); changes.add(new AddAxiom(ontology, factory.getOWLAnnotationAssertionAxiom(pendingChangeProperty, nodeIRI, @@ -147,10 +149,10 @@ public List visit(EdgeCreation v) { @Override public List visit(PlaceUnder v) { - if ( v.getPredicate() == null ) { + if ( v.getAboutEdge().getPredicate() == null ) { Node predicate = new Node(); predicate.setId(OWLRDFVocabulary.RDFS_SUBCLASS_OF.toString()); - v.setPredicate(predicate); + v.getAboutEdge().setPredicate(predicate); } return visit((EdgeCreation) v); diff --git a/core/src/main/java/org/incenp/obofoundry/kgcl/parser/ParseTree2ChangeVisitor.java b/core/src/main/java/org/incenp/obofoundry/kgcl/parser/ParseTree2ChangeVisitor.java index a180f2c..fcac84f 100644 --- a/core/src/main/java/org/incenp/obofoundry/kgcl/parser/ParseTree2ChangeVisitor.java +++ b/core/src/main/java/org/incenp/obofoundry/kgcl/parser/ParseTree2ChangeVisitor.java @@ -285,9 +285,11 @@ public Void visitNewNode(KGCLParser.NewNodeContext ctx) { @Override public Void visitNewEdge(KGCLParser.NewEdgeContext ctx) { EdgeCreation change = new EdgeCreation(); - change.setSubject(getNode(ctx.subject_id)); - change.setPredicate(getNode(ctx.predicate_id)); - change.setObject(getNode(ctx.object_id)); + Edge edge = new Edge(); + edge.setSubject(getNode(ctx.subject_id)); + edge.setPredicate(getNode(ctx.predicate_id)); + edge.setObject(getNode(ctx.object_id)); + change.setAboutEdge(edge); maybeAddChange(change); return null; @@ -296,9 +298,11 @@ public Void visitNewEdge(KGCLParser.NewEdgeContext ctx) { @Override public Void visitDeleteEdge(KGCLParser.DeleteEdgeContext ctx) { EdgeDeletion change = new EdgeDeletion(); - change.setSubject(getNode(ctx.subject_id)); - change.setPredicate(getNode(ctx.predicate_id)); - change.setObject(getNode(ctx.object_id)); + Edge edge = new Edge(); + edge.setSubject(getNode(ctx.subject_id)); + edge.setPredicate(getNode(ctx.predicate_id)); + edge.setObject(getNode(ctx.object_id)); + change.setAboutEdge(edge); maybeAddChange(change); return null; diff --git a/core/src/test/java/org/incenp/obofoundry/kgcl/KGCLReaderTest.java b/core/src/test/java/org/incenp/obofoundry/kgcl/KGCLReaderTest.java index 50f430b..ba1baad 100644 --- a/core/src/test/java/org/incenp/obofoundry/kgcl/KGCLReaderTest.java +++ b/core/src/test/java/org/incenp/obofoundry/kgcl/KGCLReaderTest.java @@ -28,6 +28,7 @@ import org.incenp.obofoundry.kgcl.model.AddNodeToSubset; import org.incenp.obofoundry.kgcl.model.Change; import org.incenp.obofoundry.kgcl.model.ClassCreation; +import org.incenp.obofoundry.kgcl.model.Edge; import org.incenp.obofoundry.kgcl.model.EdgeCreation; import org.incenp.obofoundry.kgcl.model.EdgeDeletion; import org.incenp.obofoundry.kgcl.model.NewSynonym; @@ -94,9 +95,10 @@ void testFileParser() throws IOException { c4.setNewValue("xyz"); EdgeCreation c5 = new EdgeCreation(); - c5.setSubject(util.getNode("0004")); - c5.setPredicate(util.getForeignNode(OWLRDFVocabulary.RDFS_SUBCLASS_OF.toString())); - c5.setObject(util.getNode("0003")); + c5.setAboutEdge(new Edge()); + c5.getAboutEdge().setSubject(util.getNode("0004")); + c5.getAboutEdge().setPredicate(util.getForeignNode(OWLRDFVocabulary.RDFS_SUBCLASS_OF.toString())); + c5.getAboutEdge().setObject(util.getNode("0003")); Change[] expected = { c1, c2, c3, c4, c5 }; for (int i = 0; i < 5; i++) { @@ -332,8 +334,8 @@ void testCreateNodesWithoutExplicitIds() { Assertions.assertInstanceOf(EdgeCreation.class, changeset.get(2)); EdgeCreation c3 = EdgeCreation.class.cast(changeset.get(2)); - Assertions.assertEquals(c1.getAboutNode().getId(), c3.getSubject().getId()); - Assertions.assertEquals(c2.getAboutNode().getId(), c3.getObject().getId()); + Assertions.assertEquals(c1.getAboutNode().getId(), c3.getAboutEdge().getSubject().getId()); + Assertions.assertEquals(c2.getAboutNode().getId(), c3.getAboutEdge().getObject().getId()); } @Test @@ -490,9 +492,10 @@ void testNewAnnotationPropertyChange() { @Test void testNewEdgeChange() { EdgeCreation change = new EdgeCreation(); - change.setSubject(util.getNode("0001")); - change.setPredicate(util.getNode("is_related_to")); - change.setObject(util.getNode("0002")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("0001")); + change.getAboutEdge().setPredicate(util.getNode("is_related_to")); + change.getAboutEdge().setObject(util.getNode("0002")); testParse("create edge EX:0001 EX:is_related_to EX:0002", change); } @@ -500,9 +503,10 @@ void testNewEdgeChange() { @Test void testDeleteEdgeChange() { EdgeDeletion change = new EdgeDeletion(); - change.setSubject(util.getNode("0001")); - change.setPredicate(util.getNode("is_related_to")); - change.setObject(util.getNode("0002")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("0001")); + change.getAboutEdge().setPredicate(util.getNode("is_related_to")); + change.getAboutEdge().setObject(util.getNode("0002")); testParse("delete edge EX:0001 EX:is_related_to EX:0002", change); } diff --git a/core/src/test/java/org/incenp/obofoundry/kgcl/KGCLTextTranslatorTest.java b/core/src/test/java/org/incenp/obofoundry/kgcl/KGCLTextTranslatorTest.java index 03c7e5d..2fb3cad 100644 --- a/core/src/test/java/org/incenp/obofoundry/kgcl/KGCLTextTranslatorTest.java +++ b/core/src/test/java/org/incenp/obofoundry/kgcl/KGCLTextTranslatorTest.java @@ -23,6 +23,7 @@ import org.incenp.obofoundry.kgcl.model.AddNodeToSubset; import org.incenp.obofoundry.kgcl.model.Change; import org.incenp.obofoundry.kgcl.model.ClassCreation; +import org.incenp.obofoundry.kgcl.model.Edge; import org.incenp.obofoundry.kgcl.model.EdgeCreation; import org.incenp.obofoundry.kgcl.model.EdgeDeletion; import org.incenp.obofoundry.kgcl.model.NewSynonym; @@ -225,9 +226,10 @@ void testRenderAnnotationPropertyCreation() { @Test void testRenderEdgeCreation() { EdgeCreation change = new EdgeCreation(); - change.setSubject(util.getNode("0001")); - change.setPredicate(util.getNode("is_related_to")); - change.setObject(util.getNode("0002")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("0001")); + change.getAboutEdge().setPredicate(util.getNode("is_related_to")); + change.getAboutEdge().setObject(util.getNode("0002")); render(change, "create edge EX:0001 EX:is_related_to EX:0002"); } @@ -235,9 +237,10 @@ void testRenderEdgeCreation() { @Test void testRenderEdgeDeletion() { EdgeDeletion change = new EdgeDeletion(); - change.setSubject(util.getNode("0001")); - change.setPredicate(util.getNode("is_related_to")); - change.setObject(util.getNode("0002")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("0001")); + change.getAboutEdge().setPredicate(util.getNode("is_related_to")); + change.getAboutEdge().setObject(util.getNode("0002")); render(change, "delete edge EX:0001 EX:is_related_to EX:0002"); } @@ -245,8 +248,9 @@ void testRenderEdgeDeletion() { @Test void testRendePlaceUnder() { PlaceUnder change = new PlaceUnder(); - change.setSubject(util.getNode("0001")); - change.setObject(util.getNode("0002")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("0001")); + change.getAboutEdge().setObject(util.getNode("0002")); render(change, "create edge EX:0001 rdfs:subClassOf EX:0002"); } @@ -254,8 +258,9 @@ void testRendePlaceUnder() { @Test void testRenderRemoveUnder() { RemoveUnder change = new RemoveUnder(); - change.setSubject(util.getNode("0001")); - change.setObject(util.getNode("0002")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("0001")); + change.getAboutEdge().setObject(util.getNode("0002")); render(change, "delete edge EX:0001 rdfs:subClassOf EX:0002"); } diff --git a/core/src/test/java/org/incenp/obofoundry/kgcl/owl/DirectOWLTranslatorTest.java b/core/src/test/java/org/incenp/obofoundry/kgcl/owl/DirectOWLTranslatorTest.java index bbb5f9f..95c6cb7 100644 --- a/core/src/test/java/org/incenp/obofoundry/kgcl/owl/DirectOWLTranslatorTest.java +++ b/core/src/test/java/org/incenp/obofoundry/kgcl/owl/DirectOWLTranslatorTest.java @@ -29,6 +29,7 @@ import org.incenp.obofoundry.kgcl.model.AddNodeToSubset; import org.incenp.obofoundry.kgcl.model.Change; import org.incenp.obofoundry.kgcl.model.ClassCreation; +import org.incenp.obofoundry.kgcl.model.Edge; import org.incenp.obofoundry.kgcl.model.EdgeCreation; import org.incenp.obofoundry.kgcl.model.EdgeDeletion; import org.incenp.obofoundry.kgcl.model.NewSynonym; @@ -771,8 +772,9 @@ void testCreateExistingObjectProperty() { @Test void testCreateSubClassOfEdge() { PlaceUnder change = new PlaceUnder(); - change.setSubject(util.getNode("LaReine")); - change.setObject(util.getNode("UnclosedPizza")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("LaReine")); + change.getAboutEdge().setObject(util.getNode("UnclosedPizza")); testChange(change, new AddAxiom(ontology, factory.getOWLSubClassOfAxiom(getKlass("LaReine"), getKlass("UnclosedPizza")))); @@ -781,9 +783,10 @@ void testCreateSubClassOfEdge() { @Test void testCreateExistentialRestrictionEdge() { EdgeCreation change = new EdgeCreation(); - change.setSubject(util.getNode("LaReine")); - change.setPredicate(util.getNode("hasBase")); - change.setObject(util.getNode("DeepPanBase")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("LaReine")); + change.getAboutEdge().setPredicate(util.getNode("hasBase")); + change.getAboutEdge().setObject(util.getNode("DeepPanBase")); testChange(change, new AddAxiom(ontology, factory.getOWLSubClassOfAxiom(getKlass("LaReine"), factory.getOWLObjectSomeValuesFrom(getObjectProperty("hasBase"), getKlass("DeepPanBase"))))); @@ -792,9 +795,10 @@ void testCreateExistentialRestrictionEdge() { @Test void testAnnotationEdge() { EdgeCreation change = new EdgeCreation(); - change.setSubject(util.getNode("LaReine")); - change.setPredicate(util.getForeignNode(OWLRDFVocabulary.RDFS_SEE_ALSO.toString())); - change.setObject(util.getNode("Rosa")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("LaReine")); + change.getAboutEdge().setPredicate(util.getForeignNode(OWLRDFVocabulary.RDFS_SEE_ALSO.toString())); + change.getAboutEdge().setObject(util.getNode("Rosa")); testChange(change, new AddAxiom(ontology, @@ -806,9 +810,10 @@ void testAnnotationEdge() { @Test void testCreateExistentialRestrictionEdgeWithMissingProperty() { EdgeCreation change = new EdgeCreation(); - change.setSubject(util.getNode("LaReine")); - change.setPredicate(util.getNode("has_base")); - change.setObject(util.getNode("DeepPanBase")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("LaReine")); + change.getAboutEdge().setPredicate(util.getNode("has_base")); + change.getAboutEdge().setObject(util.getNode("DeepPanBase")); testChange(change, null, "Edge predicate <" + PIZZA_BASE + "has_base> not found"); } @@ -816,8 +821,9 @@ void testCreateExistentialRestrictionEdgeWithMissingProperty() { @Test void testDeleteSubClassOfEdge() { RemoveUnder change = new RemoveUnder(); - change.setSubject(util.getNode("LaReine")); - change.setObject(util.getNode("NamedPizza")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("LaReine")); + change.getAboutEdge().setObject(util.getNode("NamedPizza")); testChange(change, new RemoveAxiom(ontology, factory.getOWLSubClassOfAxiom(getKlass("LaReine"), getKlass("NamedPizza")))); @@ -826,9 +832,10 @@ void testDeleteSubClassOfEdge() { @Test void testDeleteExistentialRestrictionEdge() { EdgeDeletion change = new EdgeDeletion(); - change.setSubject(util.getNode("UnclosedPizza")); - change.setPredicate(util.getNode("hasTopping")); - change.setObject(util.getNode("MozzarellaTopping")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("UnclosedPizza")); + change.getAboutEdge().setPredicate(util.getNode("hasTopping")); + change.getAboutEdge().setObject(util.getNode("MozzarellaTopping")); testChange(change, new RemoveAxiom(ontology, factory.getOWLSubClassOfAxiom(getKlass("UnclosedPizza"), factory.getOWLObjectSomeValuesFrom(getObjectProperty("hasTopping"), getKlass("MozzarellaTopping"))))); @@ -844,9 +851,10 @@ void testDeleteAnnotationEdge() { ontology.getOWLOntologyManager().addAxiom(ontology, newEdge); EdgeDeletion change = new EdgeDeletion(); - change.setSubject(util.getNode("LaReine")); - change.setPredicate(util.getForeignNode(OWLRDFVocabulary.RDFS_SEE_ALSO.toString())); - change.setObject(util.getNode("Rosa")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("LaReine")); + change.getAboutEdge().setPredicate(util.getForeignNode(OWLRDFVocabulary.RDFS_SEE_ALSO.toString())); + change.getAboutEdge().setObject(util.getNode("Rosa")); testChange(change, new RemoveAxiom(ontology, newEdge)); } @@ -854,9 +862,10 @@ void testDeleteAnnotationEdge() { @Test void testDeleteMissingExistentialRestrictionEdge() { EdgeDeletion change = new EdgeDeletion(); - change.setSubject(util.getNode("LaReine")); - change.setPredicate(util.getNode("hasTopping")); - change.setObject(util.getNode("ParmesanTopping")); + change.setAboutEdge(new Edge()); + change.getAboutEdge().setSubject(util.getNode("LaReine")); + change.getAboutEdge().setPredicate(util.getNode("hasTopping")); + change.getAboutEdge().setObject(util.getNode("ParmesanTopping")); testChange(change, null, "No edge found between <" + PIZZA_BASE + "LaReine> and <" + PIZZA_BASE + "ParmesanTopping>"); @@ -1177,9 +1186,10 @@ void testAddAndUseNewObjectProperty() { nc.getAboutNode().setOwlType(OwlType.OBJECT_PROPERTY); changes.add(nc); EdgeCreation ec = new EdgeCreation(); - ec.setSubject(util.getNode("LaReine")); - ec.setPredicate(util.getNode("hasRival")); - ec.setObject(util.getNode("Margherita")); + ec.setAboutEdge(new Edge()); + ec.getAboutEdge().setSubject(util.getNode("LaReine")); + ec.getAboutEdge().setPredicate(util.getNode("hasRival")); + ec.getAboutEdge().setObject(util.getNode("Margherita")); changes.add(ec); ArrayList expected = new ArrayList();