0

I am using Gremlin to access data in AWS Neptune. I need to modify 2 edges going out from a single vertex to point to 2 vertices which are different from the ones it points to at the moment.

For instance if the current relation is as shown below:

(X)---(A)---(Y)
   (B)   (C)

I want it to modified to:

(X)   (A)   (Y)
     /   \
   (B)   (C)

To ensure the whole operation is done in a single transaction, I need this done in a single traversal (because manual transaction logic using tx.commit() and tx.rollback() is not supported in AWS Neptune).

I tried the following queries to get this done but failed:

1) Add the new edges and drop the previous ones by selecting them using alias:

g.V(<id of B>).as('B').V(<id of C>).as('C').V(<id of A>).as('A').outE('LINK1','LINK2')
.as('oldEdges').addE('LINK1').from('A').to('B').addE('LINK2').from('A').to('C')
.select('oldEdges').drop();

Here, since outE('LINK1','LINK2') returns 2 edges, the edges being added after it, executes twice. So I get double the number of expected edges between A to B and C.

2) Add the new edges and drop the existing edges where edge id not equal to newly added ones.

g.V(<id of B>).as('B').V(<id of C>).as('C').V(<id of A>).as('A')
.addE('LINK1').from('A').to('B').as('edge1').addE('LINK2').from('A').to('C').as('edge2')
.select('A').outE().where(__.hasId(neq(select('edge1').id()))
.and(hasId(neq(select('edge2').id())))).drop();

Here I get the following exception in my gremlin console:

could not be serialized by org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0. java.lang.IllegalArgumentException: Class is not registered: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal Note: To register this class use: kryo.register(org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.class); at org.apache.tinkerpop.shaded.kryo.Kryo.getRegistration(Kryo.java:488) at org.apache.tinkerpop.gremlin.structure.io.gryo.AbstractGryoClassResolver.writeClass(AbstractGryoClassResolver.java:110) at org.apache.tinkerpop.shaded.kryo.Kryo.writeClass(Kryo.java:517) at org.apache.tinkerpop.shaded.kryo.Kryo.writeClassAndObject(Kryo.java:622) at org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded.ShadedKryoAdapter.writeClassAndObject(ShadedKryoAdapter.java:49) at org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded.ShadedKryoAdapter.writeClassAndObject(ShadedKryoAdapter.java:24) ...

Please help.

Samuel Konat
  • 113
  • 1
  • 9

1 Answers1

0

You can try:

g.V(<id of A>).union(
    addE('Link1').to(V(<id of B>)),
    addE('Link2').to(V(<id of C>)),
    outE('Link1', 'Link2').where(inV().hasId(<id of X>,<id of Y>)).drop()
)
noam621
  • 2,766
  • 1
  • 16
  • 26
  • Thank you for the answer, it helped. Although this query can only be used when both the edges are to be modified (not when either one on none has a change, but I had not mentioned that in the question). – Samuel Konat Nov 07 '19 at 15:54