0

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.

Paul Schwarz
  • 1,828
  • 1
  • 15
  • 24

1 Answers1

0

I think I have found the difference.

If we take the following example, the Map.of(T.id, 300) is fine to be immutable, but the map passed to the option() method must be mutable. Map.of("age", 11) is immutable, which results in an UnsupportedOperationException in 3.6.2. However, in 3.7.0 this is no longer the case. In 3.7.0 an immutable map is accepted.

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)) // This fails, it must be mutable in 3.6.2
  .next();
Paul Schwarz
  • 1,828
  • 1
  • 15
  • 24