When using org.apache.tinkerpop:tinkergraph-gremlin:3.7.0 the following statement works. It comprises 3 merge statements. In plain English: insert vertex endpoint e1, upsert vertex permission p1, upsert REQUIRES_PERMISSION edge from e1->p1.
TinkerGraph.open().traversal()
.mergeV(Map.of(
T.id, "e1",
T.label, "endpoint"))
.as("e")
.mergeV(Map.of(
T.id, "p1",
T.label, "permission"))
.option(Merge.onCreate, Map.of("value", "read-only"))
.as("p")
.mergeE(Map.of(
T.label, "REQUIRES_PERMISSION",
Direction.from, Merge.outV,
Direction.to, Merge.inV
))
.option(Merge.outV, select("e"))
.option(Merge.inV, select("p"))
.iterate();
However, when I downgrade to org.apache.tinkerpop:tinkergraph-gremlin:3.6.2 the same statement throws an exception. Here is the stack trace.
java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:72)
at java.base/java.util.ImmutableCollections$AbstractImmutableMap.putAll(ImmutableCollections.java:732)
at org.apache.tinkerpop.gremlin.process.traversal.step.map.MergeVertexStep.onCreateMap(MergeVertexStep.java:205)
at org.apache.tinkerpop.gremlin.process.traversal.step.map.MergeVertexStep.flatMap(MergeVertexStep.java:168)
at org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapStep.processNextStart(FlatMapStep.java:49)
at org.apache.tinkerpop.gremlin.process.traversal.step.map.MergeStep.processNextStart(MergeStep.java:165)
at org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.hasNext(AbstractStep.java:150)
at org.apache.tinkerpop.gremlin.process.traversal.step.util.ExpandableStepIterator.next(ExpandableStepIterator.java:55)
at org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapStep.processNextStart(FlatMapStep.java:48)
at org.apache.tinkerpop.gremlin.process.traversal.step.map.MergeStep.processNextStart(MergeStep.java:165)
at org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.hasNext(AbstractStep.java:150)
at org.apache.tinkerpop.gremlin.process.traversal.step.util.ExpandableStepIterator.next(ExpandableStepIterator.java:55)
at org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep.processNextStart(FilterStep.java:40)
at org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.next(AbstractStep.java:135)
at org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.next(AbstractStep.java:40)
at org.apache.tinkerpop.gremlin.process.traversal.Traversal.iterate(Traversal.java:210)
at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.iterate(GraphTraversal.java:3331)
at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal$Admin.iterate(GraphTraversal.java:202)
at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.iterate(DefaultGraphTraversal.java:48)
What could explain the difference in behaviour, and how can I fix my statement to achieve the desired result?
I've actually managed to find an even simpler to reproduce example:
g.mergeV(Map.of(T.id, 300))
.option(Merge.onCreate, Map.of(T.label, "Dog", "name", "Toby", "age", 10))
.option(Merge.onMatch, Map.of("age", 11))
.next();
I have translated this from Groovy to Java as best as I can, see https://tinkerpop.apache.org/docs/3.6.2/reference/#mergevertex-step, and the issue is present.