This is an automated email from the ASF dual-hosted git repository.

kenhuuu pushed a commit to branch bp3015f37
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 8de98345a46a90298fba96c6bb97be8b6175fb7d
Author: Ken Hu <106191785+kenh...@users.noreply.github.com>
AuthorDate: Mon Sep 8 16:49:36 2025 -0700

    3015f37
---
 CHANGELOG.asciidoc                                 |  1 +
 docs/src/reference/the-traversal.asciidoc          | 30 +++++-----------
 .../process/traversal/step/map/MergeEdgeStep.java  | 10 +++---
 .../traversal/step/map/MergeElementStep.java       | 41 ----------------------
 .../traversal/step/map/MergeVertexStep.java        | 10 +++---
 .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 12 +++----
 gremlin-go/driver/cucumber/gremlin.go              | 12 +++----
 .../gremlin-javascript/test/cucumber/gremlin.js    | 12 +++----
 gremlin-python/src/main/python/radish/gremlin.py   | 12 +++----
 .../gremlin/test/features/map/MergeEdge.feature    | 33 +++++++++--------
 .../gremlin/test/features/map/MergeVertex.feature  | 24 +++++++------
 11 files changed, 74 insertions(+), 123 deletions(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 8ac0e2f860..355dda9c2a 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -52,6 +52,7 @@ This release also includes changes from <<release-3-7-XXX, 
3.7.XXX>>.
 * Modified the `split()` step to split a string into a list of its characters 
if the given separator is an empty string.
 * Changed `GremlinLangScriptEngine` via `GenericLiteralVisitor` to treat 
floating-point literals as `Double` by default instead of `BigDecimal` for 
better alignment with common programming language conventions.
 * Modified the Gremlin grammar to to treat `Infinity` and `NaN` as 
floating-points.
+* Made `mergeE()` and `mergeV()` consistent in their use as a start step and 
as mid-traversal by always promoting the currently created or matched `Element` 
to the `onCreate` or `onMatch` child traversal.
 * Added `withoutStrategies()` syntax to the Gremlin ANTLR grammar.
 * Modified the Gremlin ANTLR grammar to more dynamically interact with any 
strategies registered globally to the `TraversalStrategies` cache sets.
 * Made `new` keyword optional in the Gremlin grammar.
diff --git a/docs/src/reference/the-traversal.asciidoc 
b/docs/src/reference/the-traversal.asciidoc
index 296e061f09..976020b1bb 100644
--- a/docs/src/reference/the-traversal.asciidoc
+++ b/docs/src/reference/the-traversal.asciidoc
@@ -3099,13 +3099,6 @@ g.E().elementMap()
 <1> Create three dogs.
 <2> Stream the edge maps into `mergeE()` steps.
 
-WARNING: There is a bit of an inconsistency present when `mergeE()` is used as 
a start step versus when it is used
-mid-traversal. As a start step, `mergeE()` will promote the currently created 
or matched `Edge` to the child traversal,
-allowing you to directly update it like `option(onMatch, property('k', 
'v').constant([:]))`. However, when `mergeE()` is
-used mid-traversal, the `Edge` is not promoted to the child traversal and the 
incoming traverser is used instead. Such
-behavior is essentially blocked to prevent accidental misuse and will result 
in an exception at execution time that will
-have a message like, "The incoming traverser for MergeEdgeStep cannot be an 
Element".
-
 The `mergeE` step can be combined with the `mergeV` step (or any other step 
producing a `Vertex`) using the
 `Merge.outV` and `Merge.inV` option modulators. These options can be used to 
"late-bind" the `OUT` and `IN`
 vertices in the main merge argument and in the `onCreate` argument:
@@ -3318,15 +3311,15 @@ contains additional information that will be applied if 
an existing vertex is fo
 
 [gremlin-groovy]
 ----
-g.inject([[(T.id):400],[(T.label):'Dog',name:'Pixel',age:1],[updated:'2022-02-1']]).
-  mergeV(limit(local,1).unfold()). <1>
-  option(Merge.onCreate,range(local,1,2)). <2>
-  option(Merge.onMatch,tail(local)) <3>
+g.inject([[(T.id):400],[(T.label):'Dog',name:'Pixel',age:1],[updated:'2022-02-1']]).as('m').
+  mergeV(select('m').limit(local,1)). <1>
+  option(Merge.onCreate, select('m').range(local,1,2)). <2>
+  option(Merge.onMatch, select('m').tail(local)) <3>
 g.V(400).valueMap().with(WithOptions.tokens)
-g.inject([[(T.id):400],[(T.label):'Dog',name:'Pixel',age:1],[updated:'2022-02-1']]).
-  mergeV(limit(local,1).unfold()).
-  option(Merge.onCreate,range(local,1,2)).
-  option(Merge.onMatch,tail(local))  <4>
+g.inject([[(T.id):400],[(T.label):'Dog',name:'Pixel',age:1],[updated:'2022-02-1']]).as('m').
+  mergeV(select('m').limit(local,1)).
+  option(Merge.onCreate, select('m').range(local,1,2)).
+  option(Merge.onMatch, select('m').tail(local))  <4>
 g.V(400).valueMap().with(WithOptions.tokens)  <5>
 ----
 
@@ -3336,13 +3329,6 @@ g.V(400).valueMap().with(WithOptions.tokens)  <5>
 <4> Pixel exists now, so we will take this option.
 <5> The `updated` property has now been added.
 
-WARNING: There is a bit of an inconsistency present when `mergeV()` is used as 
a start step versus when it is used
-mid-traversal. As a start step, `mergeV()` will promote the currently created 
or matched `Vertex` to the child
-traversal, allowing you to directly update it like `option(onMatch, 
property('k', 'v').constant([:]))`. However, when
-`mergeV()` is used mid-traversal, the `Vertex` is not promoted to the child 
traversal and the incoming traverser is used
-instead. Such behavior is essentially blocked to prevent accidental misuse and 
will result in an exception at execution
-time that will have a message like, "The incoming traverser for 
MergeVertexStep cannot be an Element".
-
 *Additional References*
 
 
link:++https://tinkerpop.apache.org/javadocs/x.y.z/core/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.html#mergeV()++[`mergeV()`],
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java
index b197352d36..1e9d47eeac 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java
@@ -272,11 +272,11 @@ public class MergeEdgeStep<S> extends MergeElementStep<S, 
Edge, Map<Object, Obje
             edges = IteratorUtils.peek(edges, e -> {
 
                 // override current traverser with the matched Edge so that 
the option() traversal can operate
-                // on it properly. this should only work this way for the 
start step form to retain the original
-                // behavior for 3.6.0 where you might do 
g.inject(Map).mergeE() and want that Map to pass through.
-                // in 4.x this will be rectified such that the edge will 
always be promoted and you will be forced
-                // to select() the map if you did want the behavior.
-                if (isStart) traverser.set((S) e);
+                // on it properly. prior to 3.8.x this only worked for start 
steps, but now it works consistently
+                // with mid-traversal usage. this breaks past behavior like 
g.inject(Map).mergeE() where you
+                // could operate on the Map directly with the child traversal. 
from 3.8.x onward you will have to do
+                // something like 
g.inject(Map).as('a').mergeE().option(onMatch, select('a'))
+                traverser.set((S) e);
 
                 // assume good input from GraphTraversal - folks might drop in 
a T here even though it is immutable
                 final Map<String, ?> onMatchMap = materializeMap(traverser, 
onMatchTraversal);
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeElementStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeElementStep.java
index d41673a405..c524727820 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeElementStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeElementStep.java
@@ -147,14 +147,6 @@ public abstract class MergeElementStep<S, E, C> extends 
FlatMapStep<S, E>
         if (token == Merge.onCreate) {
             this.onCreateTraversal = this.integrateChild(traversalOption);
         } else if (token == Merge.onMatch) {
-            // add a guard rail to ensure that the incoming object is not an 
Element. this will prevent
-            // a possibly inadvertent mutation of the graph if you did 
something like g.V().mergeE(). for
-            // 3.x we won't allow this behavior at all but in 4.x we will make 
it consistent like it will
-            // be in 4.x
-            if (!isStart && traversalOption != null && !(traversalOption 
instanceof ConstantTraversal)) {
-                traversalOption.addStep(0, new 
GuardRailStep<>(traversalOption, getClass().getSimpleName()));
-            }
-
             this.onMatchTraversal = this.integrateChild(traversalOption);
         } else {
             throw new UnsupportedOperationException(String.format("Option %s 
for Merge is not supported", token.name()));
@@ -388,13 +380,6 @@ public abstract class MergeElementStep<S, E, C> extends 
FlatMapStep<S, E>
 
     @Override
     public void setOnMatch(final Traversal.Admin<?,Map<Object, Object>> 
onMatchTraversal) {
-        // add a guard rail to ensure that the incoming object is not an 
Element. this will prevent
-        // a possibly inadvertent mutation of the graph if you did something 
like g.V().mergeE(). for
-        // 3.x we won't allow this behavior at all but in 4.x we will make it 
consistent like it will
-        // be in 4.x
-        if (!isStart && onMatchTraversal != null && !(onMatchTraversal 
instanceof ConstantTraversal)) {
-            onMatchTraversal.addStep(0, new GuardRailStep<>(onMatchTraversal, 
getClass().getSimpleName()));
-        }
         this.onMatchTraversal = integrateChild(onMatchTraversal);
     }
 
@@ -424,30 +409,4 @@ public abstract class MergeElementStep<S, E, C> extends 
FlatMapStep<S, E>
         return false;
     }
 
-    /**
-     * Guard rail to ensure that the incoming object is not an {@link Element}.
-     */
-    public static class GuardRailStep<S, E> extends ScalarMapStep<S, E> {
-        private final String stepType;
-
-        public GuardRailStep(final Traversal.Admin traversal, final String 
stepType) {
-            super(traversal);
-            this.stepType = stepType;
-        }
-
-        @Override
-        protected E map(final Traverser.Admin<S> t) {
-            if (t.get() instanceof Element) {
-                throw new IllegalArgumentException(
-                        String.format("The incoming traverser for %s cannot be 
an Element", stepType));
-            }
-            return (E) t.get();
-        }
-
-        @Override
-        public String toString() {
-            return StringFactory.stepString(this);
-        }
-    }
-
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java
index 8f668b35ba..e54288eeae 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java
@@ -92,11 +92,11 @@ public class MergeVertexStep<S> extends MergeElementStep<S, 
Vertex, Map<Object,
             vertices = IteratorUtils.peek(vertices, v -> {
 
                 // override current traverser with the matched Vertex so that 
the option() traversal can operate
-                // on it properly. this should only work this way for the 
start step form to retain the original
-                // behavior for 3.6.0 where you might do 
g.inject(Map).mergeV() and want that Map to pass through.
-                // in 4.x this will be rectified such that the vertex will 
always be promoted and you will be forced
-                // to select() the map if you did want the behavior.
-                if (isStart) traverser.set((S) v);
+                // on it properly. prior to 3.8.x this only worked for start 
steps, but now it works consistently
+                // with mid-traversal usage. this breaks past behavior like 
g.inject(Map).mergeV() where you
+                // could operate on the Map directly with the child traversal. 
from 3.8.x onward you will have to do
+                // something like 
g.inject(Map).as('a').mergeV().option(onMatch, select('a'))
+                traverser.set((S) v);
 
                 // assume good input from GraphTraversal - folks might drop in 
a T here even though it is immutable
                 final Map<String, Object> onMatchMap = 
materializeMap(traverser, onMatchTraversal);
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs 
b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
index 5c9e723904..84ddeca839 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
@@ -1146,10 +1146,10 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_mergeV_mergeE_combination_new_vertices", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.MergeV((IDictionary<object, object>) 
p["xx1"]).As("outV").MergeV((IDictionary<object, object>) 
p["xx2"]).As("inV").MergeE((IDictionary<object, object>) 
p["xx3"]).Option(Merge.OutV, (ITraversal) 
__.Select<object>("outV")).Option(Merge.InV, (ITraversal) 
__.Select<object>("inV")), (g,p) =>g.V(), (g,p) =>g.E(), (g,p) 
=>g.V().Has("name", "marko") [...]
                {"g_mergeV_mergeE_combination_existing_vertices", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", 
"marko").AddV("person").Property("name", "vadas"), (g,p) 
=>g.MergeV((IDictionary<object, object>) 
p["xx1"]).As("outV").MergeV((IDictionary<object, object>) 
p["xx2"]).As("inV").MergeE((IDictionary<object, object>) 
p["xx3"]).Option(Merge.OutV, (ITraversal) 
__.Select<object>("outV")).Option(Merge.InV, (ITrav [...]
                
{"g_V_asXvX_mergeEXxx1X_optionXMerge_onMatch_xx2X_optionXMerge_outV_selectXvXX_optionXMerge_inV_selectXvXX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 29), (g,p) 
=>g.V().As("v").MergeE((IDictionary<object, object>) 
p["xx1"]).Option(Merge.OnMatch, (IDictionary<object, object>) 
p["xx2"]).Option(Merge.OutV, (ITraversal) 
__.Select<object>("v")).Option(Merge.InV, (ITraversal) [...]
-               
{"g_V_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", 
"marko").As("a").AddV("person").Property("name", 
"vadas").As("b").AddE("knows").Property("weight", 1).From("a").To("b"), (g,p) 
=>g.V().MergeE((IDictionary<object, object>) p["xx1"]).Option(Merge.OnMatch, 
(ITraversal) __.SideEffect(__.Property("we [...]
+               
{"g_V_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", 
"marko").As("a").AddV("person").Property("name", 
"vadas").As("b").AddE("knows").Property("weight", 1).From("a").To("b"), (g,p) 
=>g.V().MergeE((IDictionary<object, object>) p["xx1"]).Option(Merge.OnMatch, 
(ITraversal) __.SideEffect(__.Property("we [...]
                
{"g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", 
"marko").As("a").AddV("person").Property("name", 
"vadas").As("b").AddE("knows").Property("weight", 1).From("a").To("b"), (g,p) 
=>g.MergeE((IDictionary<object, object>) p["xx1"]).Option(Merge.OnMatch, 
(ITraversal) __.SideEffect(__.Property("weight", [...]
-               
{"g_unionXselectXmX_selectXmX_constantXcreated_NXX_fold_mergeEXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_match",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).As("marko").AddV("person").Property("name", "vadas").Property("age", 
27).As("vadas").AddV("software").Property("name", "lop").Property("lang", 
"java").As( [...]
-               
{"g_unionXselectXmX_selectXmX_constantXcreated_NXX_fold_mergeEXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_create",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).As("marko").AddV("person").Property("name", "vadas").Property("age", 
27).As("vadas").AddV("software").Property("name", "lop").Property("lang", 
"java").As [...]
+               
{"g_unionXselectXmapX_selectXmapX_constantXcreated_NXX_fold_asXmX_mergeEXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).As("marko").AddV("person").Property("name", "vadas").Property("age", 
27).As("vadas").AddV("software").Property("na [...]
+               
{"g_unionXselectXmapX_selectXmapX_constantXcreated_NXX_fold_asXmX_mergeEXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).As("marko").AddV("person").Property("name", "vadas").Property("age", 
27).As("vadas").AddV("software").Property("n [...]
                
{"g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_weight_nullX_allowed",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", 
"marko").As("a").AddV("person").Property("name", 
"vadas").As("b").AddE("knows").From("a").To("b").Property("weight", 1.0d), 
(g,p) =>g.MergeE((IDictionary<object, object>) p["xx1"]).Option(Merge.OnMatch, 
(IDictionary<object, object>) p["xx2"]), (g,p) =>g.V(), (g,p) =>g.E().Ha [...]
                
{"g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_weight_nullX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", 
"marko").As("a").AddV("person").Property("name", 
"vadas").As("b").AddE("knows").From("a").To("b").Property("weight", 1.0d), 
(g,p) =>g.MergeE((IDictionary<object, object>) p["xx1"]).Option(Merge.OnMatch, 
(IDictionary<object, object>) p["xx2"]), (g,p) =>g.V(), (g,p) 
=>g.E().HasLabel(" [...]
                {"g_mergeVXemptyX_optionXonMatch_nullX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 29), (g,p) 
=>g.MergeV((IDictionary<object, object>) new Dictionary<object, object> 
{}).Option(Merge.OnMatch, (IDictionary<object, object>) null), (g,p) 
=>g.V().Has("person", "name", "marko").Has("age", 29)}}, 
@@ -1187,7 +1187,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_mergeXlabel_person_name_vadasX_optionXonMatch_age_35X", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "vadas").Property("age", 
29).AddV("person").Property("name", "vadas").Property("age", 27), (g,p) 
=>g.MergeV((IDictionary<object, object>) p["xx1"]).Option(Merge.OnMatch, 
(IDictionary<object, object>) p["xx2"]), (g,p) =>g.V().Has("age", 35), (g,p) 
=>g.V()}}, 
                {"g_V_mapXmergeXlabel_person_name_joshXX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "vadas").Property("age", 
29).AddV("person").Property("name", "stephen").Property("age", 27), (g,p) 
=>g.V().Map<object>(__.MergeV((IDictionary<object, object>) p["xx1"])), (g,p) 
=>g.V().Has("person", "name", "josh"), (g,p) =>g.V()}}, 
                
{"g_withSideEffectXc_label_person_name_markoX_withSideEffectXm_age_19X_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property(Cardinality.List, 
"age", 29).Property(Cardinality.List, "age", 31).Property(Cardinality.List, 
"age", 32), (g,p) =>g.MergeV((ITraversal) 
__.Select<object>("c")).Option(Merge.OnMatch, [...]
-               
{"g_withSideEffectXm_age_19X_V_hasXperson_name_markoX_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property(Cardinality.List, 
"age", 29).Property(Cardinality.List, "age", 31).Property(Cardinality.List, 
"age", 32), (g,p) =>g.V().Has("person", "name", 
"marko").MergeV((IDictionary<object, object>) new Dictio [...]
+               
{"g_withSideEffectXm_age_19X_V_hasXperson_name_markoX_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property(Cardinality.List, 
"age", 29).Property(Cardinality.List, "age", 31).Property(Cardinality.List, 
"age", 32), (g,p) =>g.V().Has("person", "name", 
"marko").MergeV((IDictionary<object, object>) new Dictio [...]
                {"g_mergeV_onCreate_inheritance_existing", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "mike").Property(T.Id, "1"), (g,p) 
=>g.MergeV((IDictionary<object, object>) p["xx1"]).Option(Merge.OnCreate, 
(IDictionary<object, object>) p["xx2"]), (g,p) =>g.V(), (g,p) 
=>g.V("1").Has("person", "name", "mike")}}, 
                {"g_mergeV_onCreate_inheritance_new_1", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.MergeV((IDictionary<object, object>) 
p["xx1"]).Option(Merge.OnCreate, (IDictionary<object, object>) p["xx2"]), (g,p) 
=>g.V(), (g,p) =>g.V("1").Has("person", "name", "mike")}}, 
                {"g_mergeV_onCreate_inheritance_new_2", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.MergeV((IDictionary<object, object>) 
p["xx1"]).Option(Merge.OnCreate, (IDictionary<object, object>) p["xx2"]), (g,p) 
=>g.V(), (g,p) =>g.V("1").Has("person", "name", "mike")}}, 
@@ -1212,8 +1212,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_mergeVXname_aliceX_optionXonCreate_age_setX81XX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.MergeV((IDictionary<object, object>) new Dictionary<object, object> 
{{ "name", "alice" }, { T.Label, "person" }}).Option(Merge.OnCreate, 
(IDictionary<object, object>) new Dictionary<object, object> {{ "age", 
CardinalityValue.Set(81) }}), (g,p) =>g.V().Has("person", "name", 
"alice").Has("age", 81), (g,p) =>g.V().Has("person", "name", [...]
                
{"g_mergeVXname_aliceX_optionXonCreate_age_singleX81X_age_81_setX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.MergeV((IDictionary<object, object>) new Dictionary<object, object> 
{{ "name", "alice" }, { T.Label, "person" }}).Option(Merge.OnCreate, new 
Dictionary<object, object> {{ "age", 81 }}, Cardinality.Set), (g,p) 
=>g.V().Has("person", "name", "alice").Has("age", 81), (g,p) 
=>g.V().Has("person", "name", "alice").Has("age"), [...]
                {"g_mergeV_hidden_label_key_onMatch_matched_prohibited", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.MergeV((IDictionary<object, object>) new Dictionary<object, object> 
{}).Option(Merge.OnMatch, (IDictionary<object, object>) p["xx1"])}}, 
-               
{"g_injectXlist1_list2X_mergeVXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_match",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 29), (g,p) 
=>g.Inject<object>(new Dictionary<object, object> {{ T.Label, "person" }, { 
"name", "marko" }}, new Dictionary<object, object> {{ T.Label, "person" }, { 
"name", "marko" }}, new Di [...]
-               
{"g_injectXlist1_list2X_mergeVXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_create",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 29), (g,p) 
=>g.Inject<object>(new Dictionary<object, object> {{ T.Label, "person" }, { 
"name", "stephen" }}, new Dictionary<object, object> {{ T.Label, "person" }, { 
"name", "stephen" }}, n [...]
+               
{"g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 29), (g,p) 
=>g.Inject<object>(new Dictionary<object, object> {{ T.Label, "person" }, { 
"name", "marko" }}, new Dictionary<object, object> {{ T. [...]
+               
{"g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 29), (g,p) 
=>g.Inject<object>(new Dictionary<object, object> {{ T.Label, "person" }, { 
"name", "stephen" }}, new Dictionary<object, object> {{ [...]
                {"g_V_age_min", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.V().Values<object>("age").Min<object>()}}, 
                {"g_V_foo_min", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.V().Values<object>("foo").Min<object>()}}, 
                {"g_V_name_min", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.V().Values<object>("name").Min<object>()}}, 
diff --git a/gremlin-go/driver/cucumber/gremlin.go 
b/gremlin-go/driver/cucumber/gremlin.go
index 9ad0b1fd5f..63357550d1 100644
--- a/gremlin-go/driver/cucumber/gremlin.go
+++ b/gremlin-go/driver/cucumber/gremlin.go
@@ -1116,10 +1116,10 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     "g_mergeV_mergeE_combination_new_vertices": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.MergeV(p["xx1"]).As("outV").MergeV(p["xx2"]).As("inV").MergeE(p["xx3"]).Option(gremlingo.Merge.OutV,
 gremlingo.T__.Select("outV")).Option(gremlingo.Merge.InV, 
gremlingo.T__.Select("inV"))}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return g.V()}, func(g 
*gremlingo.GraphTraversalSource, p m [...]
     "g_mergeV_mergeE_combination_existing_vertices": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").AddV("person").Property("name", "vadas")}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.MergeV(p["xx1"]).As("outV").MergeV(p["xx2"]).As("inV").MergeE(p["xx3"]).Option(gremlingo.Merge.OutV,
 gremlingo.T__.Select("outV")).Option(gremlingo.Me [...]
     
"g_V_asXvX_mergeEXxx1X_optionXMerge_onMatch_xx2X_optionXMerge_outV_selectXvXX_optionXMerge_inV_selectXvXX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().As("v").MergeE(p["xx1"]).Option(gremlingo.Merge.OnMatch, 
p["xx2"]).Option(gremlingo.Merge.OutV, gremlingo.T_ [...]
-    
"g_V_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").As("a").AddV("person").Property("name", 
"vadas").As("b").AddE("knows").Property("weight", 1).From("a").To("b")}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().MergeE(p["xx1"]) [...]
+    
"g_V_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").As("a").AddV("person").Property("name", 
"vadas").As("b").AddE("knows").Property("weight", 1).From("a").To("b")}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().MergeE(p["xx1"]) [...]
     
"g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").As("a").AddV("person").Property("name", 
"vadas").As("b").AddE("knows").Property("weight", 1).From("a").To("b")}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.MergeE(p["xx1"]).Optio [...]
-    
"g_unionXselectXmX_selectXmX_constantXcreated_NXX_fold_mergeEXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_match":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).As("marko").AddV("person").Property("name", 
"vadas").Property("age", 27).As("vadas").AddV("software").Property("name", 
"lop").Property("lang", "java").A [...]
-    
"g_unionXselectXmX_selectXmX_constantXcreated_NXX_fold_mergeEXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_create":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).As("marko").AddV("person").Property("name", 
"vadas").Property("age", 27).As("vadas").AddV("software").Property("name", 
"lop").Property("lang", "java"). [...]
+    
"g_unionXselectXmapX_selectXmapX_constantXcreated_NXX_fold_asXmX_mergeEXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).As("marko").AddV("person").Property("name", 
"vadas").Property("age", 27).As("vadas").AddV("software").Property(" [...]
+    
"g_unionXselectXmapX_selectXmapX_constantXcreated_NXX_fold_asXmX_mergeEXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).As("marko").AddV("person").Property("name", 
"vadas").Property("age", 27).As("vadas").AddV("software").Property( [...]
     
"g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_weight_nullX_allowed": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").As("a").AddV("person").Property("name", 
"vadas").As("b").AddE("knows").From("a").To("b").Property("weight", 1.0)}, 
func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.MergeE(p["xx1"]).Option(gremlingo.Merge.OnMatch [...]
     "g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_weight_nullX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").As("a").AddV("person").Property("name", 
"vadas").As("b").AddE("knows").From("a").To("b").Property("weight", 1.0)}, 
func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.MergeE(p["xx1"]).Option(gremlingo.Merge.OnMatch, p["xx2 [...]
     "g_mergeVXemptyX_optionXonMatch_nullX": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.MergeV(map[interface{}]interface{}{ }).Option(gremlingo.Merge.OnMatch, nil)}, 
func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g. [...]
@@ -1157,7 +1157,7 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     "g_mergeXlabel_person_name_vadasX_optionXonMatch_age_35X": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"vadas").Property("age", 29).AddV("person").Property("name", 
"vadas").Property("age", 27)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.MergeV(p["xx1"]).Option(gremlingo.Merge.OnMatch, p["xx2"])}, func(g 
*gremlingo.GraphTraversalSource, [...]
     "g_V_mapXmergeXlabel_person_name_joshXX": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"vadas").Property("age", 29).AddV("person").Property("name", 
"stephen").Property("age", 27)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().Map(gremlingo.T__.MergeV(p["xx1"]))}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) *gremli [...]
     
"g_withSideEffectXc_label_person_name_markoX_withSideEffectXm_age_19X_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property(gremlingo.Cardinality.List, "age", 
29).Property(gremlingo.Cardinality.List, "age", 
31).Property(gremlingo.Cardinality.List, "age", 32)}, func(g 
*gremlingo.GraphTraversalSource, p  [...]
-    
"g_withSideEffectXm_age_19X_V_hasXperson_name_markoX_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property(gremlingo.Cardinality.List, "age", 
29).Property(gremlingo.Cardinality.List, "age", 
31).Property(gremlingo.Cardinality.List, "age", 32)}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interf [...]
+    
"g_withSideEffectXm_age_19X_V_hasXperson_name_markoX_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property(gremlingo.Cardinality.List, "age", 
29).Property(gremlingo.Cardinality.List, "age", 
31).Property(gremlingo.Cardinality.List, "age", 32)}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interf [...]
     "g_mergeV_onCreate_inheritance_existing": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"mike").Property(gremlingo.T.Id, "1")}, func(g *gremlingo.GraphTraversalSource, 
p map[string]interface{}) *gremlingo.GraphTraversal {return 
g.MergeV(p["xx1"]).Option(gremlingo.Merge.OnCreate, p["xx2"])}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V()}, [...]
     "g_mergeV_onCreate_inheritance_new_1": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.MergeV(p["xx1"]).Option(gremlingo.Merge.OnCreate, p["xx2"])}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V()}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V("1").Has("person", "name", "mike")}}, 
     "g_mergeV_onCreate_inheritance_new_2": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.MergeV(p["xx1"]).Option(gremlingo.Merge.OnCreate, p["xx2"])}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V()}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V("1").Has("person", "name", "mike")}}, 
@@ -1182,8 +1182,8 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     "g_mergeVXname_aliceX_optionXonCreate_age_setX81XX": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.MergeV(map[interface{}]interface{}{"name": 
"alice", gremlingo.T.Label: "person" }).Option(gremlingo.Merge.OnCreate, 
map[interface{}]interface{}{"age": gremlingo.CardinalityValue.Set(81) })}, 
func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", "alice").Has( 
[...]
     "g_mergeVXname_aliceX_optionXonCreate_age_singleX81X_age_81_setX": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.MergeV(map[interface{}]interface{}{"name": 
"alice", gremlingo.T.Label: "person" }).Option(gremlingo.Merge.OnCreate, 
map[interface{}]interface{}{"age": 81 }, gremlingo.Cardinality.Set)}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", "ali [...]
     "g_mergeV_hidden_label_key_onMatch_matched_prohibited": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.MergeV(map[interface{}]interface{}{ 
}).Option(gremlingo.Merge.OnMatch, p["xx1"])}}, 
-    
"g_injectXlist1_list2X_mergeVXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_match":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Inject(map[interface{}]interface{}{gremlingo.T.Label: "person", "name": 
"marko"  [...]
-    
"g_injectXlist1_list2X_mergeVXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_create":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Inject(map[interface{}]interface{}{gremlingo.T.Label: "person", "name": 
"stephe [...]
+    
"g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Inject(map[interface{}]interface{ [...]
+    
"g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Inject(map[interface{}]interface [...]
     "g_V_age_min": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().Values("age").Min()}}, 
     "g_V_foo_min": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().Values("foo").Min()}}, 
     "g_V_name_min": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().Values("name").Min()}}, 
diff --git 
a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
 
b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
index 3eb709e247..9e499f4603 100644
--- 
a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
+++ 
b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
@@ -1147,10 +1147,10 @@ const gremlins = {
     g_mergeV_mergeE_combination_new_vertices: [function({g, xx1, xx3, xx2}) { 
return 
g.mergeV(xx1).as("outV").mergeV(xx2).as("inV").mergeE(xx3).option(Merge.outV, 
__.select("outV")).option(Merge.inV, __.select("inV")) }, function({g, xx1, 
xx3, xx2}) { return g.V() }, function({g, xx1, xx3, xx2}) { return g.E() }, 
function({g, xx1, xx3, xx2}) { return g.V().has("name", 
"marko").out("knows").has("name", "vadas") }], 
     g_mergeV_mergeE_combination_existing_vertices: [function({g, xx1, xx3, 
xx2}) { return g.addV("person").property("name", 
"marko").addV("person").property("name", "vadas") }, function({g, xx1, xx3, 
xx2}) { return 
g.mergeV(xx1).as("outV").mergeV(xx2).as("inV").mergeE(xx3).option(Merge.outV, 
__.select("outV")).option(Merge.inV, __.select("inV")) }, function({g, xx1, 
xx3, xx2}) { return g.V() }, function({g, xx1, xx3, xx2}) { return g.E() }, 
function({g, xx1, xx3, xx2}) { return g.V().has [...]
     
g_V_asXvX_mergeEXxx1X_optionXMerge_onMatch_xx2X_optionXMerge_outV_selectXvXX_optionXMerge_inV_selectXvXX:
 [function({g, xx1, xx2}) { return g.addV("person").property("name", 
"marko").property("age", 29) }, function({g, xx1, xx2}) { return 
g.V().as("v").mergeE(xx1).option(Merge.onMatch, xx2).option(Merge.outV, 
__.select("v")).option(Merge.inV, __.select("v")) }], 
-    
g_V_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX:
 [function({g, xx1}) { return g.addV("person").property("name", 
"marko").as("a").addV("person").property("name", 
"vadas").as("b").addE("knows").property("weight", 1).from_("a").to("b") }, 
function({g, xx1}) { return g.V().mergeE(xx1).option(Merge.onMatch, 
__.sideEffect(__.property("weight", 0)).constant(new Map([]))) }], 
+    
g_V_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX:
 [function({g, xx1}) { return g.addV("person").property("name", 
"marko").as("a").addV("person").property("name", 
"vadas").as("b").addE("knows").property("weight", 1).from_("a").to("b") }, 
function({g, xx1}) { return g.V().mergeE(xx1).option(Merge.onMatch, 
__.sideEffect(__.property("weight", 0)).constant(new Map([]))) }, function({g, 
xx1}) { return g.V() }, function({g, xx1}) { re [...]
     
g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX:
 [function({g, xx1}) { return g.addV("person").property("name", 
"marko").as("a").addV("person").property("name", 
"vadas").as("b").addE("knows").property("weight", 1).from_("a").to("b") }, 
function({g, xx1}) { return g.mergeE(xx1).option(Merge.onMatch, 
__.sideEffect(__.property("weight", 0)).constant(new Map([]))) }, function({g, 
xx1}) { return g.V() }, function({g, xx1}) { return g [...]
-    
g_unionXselectXmX_selectXmX_constantXcreated_NXX_fold_mergeEXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_match:
 [function({g}) { return g.addV("person").property("name", 
"marko").property("age", 29).as("marko").addV("person").property("name", 
"vadas").property("age", 27).as("vadas").addV("software").property("name", 
"lop").property("lang", "java").as("lop").addV("person").property("name", 
"josh").property("age", 32).as("josh") [...]
-    
g_unionXselectXmX_selectXmX_constantXcreated_NXX_fold_mergeEXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_create:
 [function({g}) { return g.addV("person").property("name", 
"marko").property("age", 29).as("marko").addV("person").property("name", 
"vadas").property("age", 27).as("vadas").addV("software").property("name", 
"lop").property("lang", "java").as("lop").addV("person").property("name", 
"josh").property("age", 32).as("josh" [...]
+    
g_unionXselectXmapX_selectXmapX_constantXcreated_NXX_fold_asXmX_mergeEXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match:
 [function({g}) { return g.addV("person").property("name", 
"marko").property("age", 29).as("marko").addV("person").property("name", 
"vadas").property("age", 27).as("vadas").addV("software").property("name", 
"lop").property("lang", "java").as("lop").addV("person").property("name" [...]
+    
g_unionXselectXmapX_selectXmapX_constantXcreated_NXX_fold_asXmX_mergeEXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create:
 [function({g}) { return g.addV("person").property("name", 
"marko").property("age", 29).as("marko").addV("person").property("name", 
"vadas").property("age", 27).as("vadas").addV("software").property("name", 
"lop").property("lang", "java").as("lop").addV("person").property("name [...]
     
g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_weight_nullX_allowed: 
[function({g, xx1, xx2}) { return g.addV("person").property("name", 
"marko").as("a").addV("person").property("name", 
"vadas").as("b").addE("knows").from_("a").to("b").property("weight", 1.0) }, 
function({g, xx1, xx2}) { return g.mergeE(xx1).option(Merge.onMatch, xx2) }, 
function({g, xx1, xx2}) { return g.V() }, function({g, xx1, xx2}) { return 
g.E().hasLabel("knows") }, function({g, xx1, xx2}) { return g.E( [...]
     g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_weight_nullX: 
[function({g, xx1, xx2}) { return g.addV("person").property("name", 
"marko").as("a").addV("person").property("name", 
"vadas").as("b").addE("knows").from_("a").to("b").property("weight", 1.0) }, 
function({g, xx1, xx2}) { return g.mergeE(xx1).option(Merge.onMatch, xx2) }, 
function({g, xx1, xx2}) { return g.V() }, function({g, xx1, xx2}) { return 
g.E().hasLabel("knows") }, function({g, xx1, xx2}) { return g.E().hasLab [...]
     g_mergeVXemptyX_optionXonMatch_nullX: [function({g}) { return 
g.addV("person").property("name", "marko").property("age", 29) }, function({g}) 
{ return g.mergeV(new Map([])).option(Merge.onMatch, null) }, function({g}) { 
return g.V().has("person", "name", "marko").has("age", 29) }], 
@@ -1188,7 +1188,7 @@ const gremlins = {
     g_mergeXlabel_person_name_vadasX_optionXonMatch_age_35X: [function({g, 
xx1, xx2}) { return g.addV("person").property("name", "vadas").property("age", 
29).addV("person").property("name", "vadas").property("age", 27) }, 
function({g, xx1, xx2}) { return g.mergeV(xx1).option(Merge.onMatch, xx2) }, 
function({g, xx1, xx2}) { return g.V().has("age", 35) }, function({g, xx1, 
xx2}) { return g.V() }], 
     g_V_mapXmergeXlabel_person_name_joshXX: [function({g, xx1}) { return 
g.addV("person").property("name", "vadas").property("age", 
29).addV("person").property("name", "stephen").property("age", 27) }, 
function({g, xx1}) { return g.V().map(__.mergeV(xx1)) }, function({g, xx1}) { 
return g.V().has("person", "name", "josh") }, function({g, xx1}) { return g.V() 
}], 
     
g_withSideEffectXc_label_person_name_markoX_withSideEffectXm_age_19X_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option:
 [function({g}) { return g.addV("person").property("name", 
"marko").property(Cardinality.list, "age", 29).property(Cardinality.list, 
"age", 31).property(Cardinality.list, "age", 32) }, function({g}) { return 
g.mergeV(__.select("c")).option(Merge.onMatch, 
__.sideEffect(__.properties("age").drop()).select("m")) }, function({g}) { 
retur [...]
-    
g_withSideEffectXm_age_19X_V_hasXperson_name_markoX_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option:
 [function({g}) { return g.addV("person").property("name", 
"marko").property(Cardinality.list, "age", 29).property(Cardinality.list, 
"age", 31).property(Cardinality.list, "age", 32) }, function({g}) { return 
g.V().has("person", "name", "marko").mergeV(new Map([])).option(Merge.onMatch, 
__.sideEffect(__.properties("age").drop()).select("m")) }], 
+    
g_withSideEffectXm_age_19X_V_hasXperson_name_markoX_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option:
 [function({g}) { return g.addV("person").property("name", 
"marko").property(Cardinality.list, "age", 29).property(Cardinality.list, 
"age", 31).property(Cardinality.list, "age", 32) }, function({g}) { return 
g.V().has("person", "name", "marko").mergeV(new Map([])).option(Merge.onMatch, 
__.sideEffect(__.properties("age").drop()).select("m")) }, functi [...]
     g_mergeV_onCreate_inheritance_existing: [function({g, xx1, xx2}) { return 
g.addV("person").property("name", "mike").property(T.id, "1") }, function({g, 
xx1, xx2}) { return g.mergeV(xx1).option(Merge.onCreate, xx2) }, function({g, 
xx1, xx2}) { return g.V() }, function({g, xx1, xx2}) { return 
g.V("1").has("person", "name", "mike") }], 
     g_mergeV_onCreate_inheritance_new_1: [function({g, xx1, xx2}) { return 
g.mergeV(xx1).option(Merge.onCreate, xx2) }, function({g, xx1, xx2}) { return 
g.V() }, function({g, xx1, xx2}) { return g.V("1").has("person", "name", 
"mike") }], 
     g_mergeV_onCreate_inheritance_new_2: [function({g, xx1, xx2}) { return 
g.mergeV(xx1).option(Merge.onCreate, xx2) }, function({g, xx1, xx2}) { return 
g.V() }, function({g, xx1, xx2}) { return g.V("1").has("person", "name", 
"mike") }], 
@@ -1213,8 +1213,8 @@ const gremlins = {
     g_mergeVXname_aliceX_optionXonCreate_age_setX81XX: [function({g}) { return 
g.mergeV(new Map([["name", "alice"], [T.label, 
"person"]])).option(Merge.onCreate, new Map([["age", 
CardinalityValue.set(81)]])) }, function({g}) { return g.V().has("person", 
"name", "alice").has("age", 81) }, function({g}) { return g.V().has("person", 
"name", "alice").has("age") }, function({g}) { return g.V().has("person", 
"name", "alice").properties("age") }], 
     g_mergeVXname_aliceX_optionXonCreate_age_singleX81X_age_81_setX: 
[function({g}) { return g.mergeV(new Map([["name", "alice"], [T.label, 
"person"]])).option(Merge.onCreate, new Map([["age", 81]]), Cardinality.set) }, 
function({g}) { return g.V().has("person", "name", "alice").has("age", 81) }, 
function({g}) { return g.V().has("person", "name", "alice").has("age") }, 
function({g}) { return g.V().has("person", "name", "alice").properties("age") 
}], 
     g_mergeV_hidden_label_key_onMatch_matched_prohibited: [function({g, xx1}) 
{ return g.mergeV(new Map([])).option(Merge.onMatch, xx1) }], 
-    
g_injectXlist1_list2X_mergeVXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_match:
 [function({g}) { return g.addV("person").property("name", 
"marko").property("age", 29) }, function({g}) { return g.inject(new 
Map([[T.label, "person"], ["name", "marko"]]), new Map([[T.label, "person"], 
["name", "marko"]]), new Map([["created", 
"N"]])).fold().mergeV(__.limit(Scope.local, 1).unfold()).option(Merge.onCreate, 
__.range(Scope.local, 1,  [...]
-    
g_injectXlist1_list2X_mergeVXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_create:
 [function({g}) { return g.addV("person").property("name", 
"marko").property("age", 29) }, function({g}) { return g.inject(new 
Map([[T.label, "person"], ["name", "stephen"]]), new Map([[T.label, "person"], 
["name", "stephen"]]), new Map([["created", 
"N"]])).fold().mergeV(__.limit(Scope.local, 1).unfold()).option(Merge.onCreate, 
__.range(Scope.local [...]
+    
g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match:
 [function({g}) { return g.addV("person").property("name", 
"marko").property("age", 29) }, function({g}) { return g.inject(new 
Map([[T.label, "person"], ["name", "marko"]]), new Map([[T.label, "person"], 
["name", "marko"]]), new Map([["created", 
"N"]])).fold().as("m").mergeV(__.select("m").limit(Scope.l [...]
+    
g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create:
 [function({g}) { return g.addV("person").property("name", 
"marko").property("age", 29) }, function({g}) { return g.inject(new 
Map([[T.label, "person"], ["name", "stephen"]]), new Map([[T.label, "person"], 
["name", "stephen"]]), new Map([["created", 
"N"]])).fold().as("m").mergeV(__.select("m").limit(Sc [...]
     g_V_age_min: [function({g}) { return g.V().values("age").min() }], 
     g_V_foo_min: [function({g}) { return g.V().values("foo").min() }], 
     g_V_name_min: [function({g}) { return g.V().values("name").min() }], 
diff --git a/gremlin-python/src/main/python/radish/gremlin.py 
b/gremlin-python/src/main/python/radish/gremlin.py
index f5e2755fd9..038a1af2fa 100644
--- a/gremlin-python/src/main/python/radish/gremlin.py
+++ b/gremlin-python/src/main/python/radish/gremlin.py
@@ -1119,10 +1119,10 @@ world.gremlins = {
     'g_mergeV_mergeE_combination_new_vertices': [(lambda g, 
xx1=None,xx3=None,xx2=None:g.merge_v(xx1).as_('outV').merge_v(xx2).as_('inV').merge_e(xx3).option(Merge.out_v,
 __.select('outV')).option(Merge.in_v, __.select('inV'))), (lambda g, 
xx1=None,xx3=None,xx2=None:g.V()), (lambda g, 
xx1=None,xx3=None,xx2=None:g.E()), (lambda g, 
xx1=None,xx3=None,xx2=None:g.V().has('name', 'marko').out('knows').has('name', 
'vadas'))], 
     'g_mergeV_mergeE_combination_existing_vertices': [(lambda g, 
xx1=None,xx3=None,xx2=None:g.add_v('person').property('name', 
'marko').add_v('person').property('name', 'vadas')), (lambda g, 
xx1=None,xx3=None,xx2=None:g.merge_v(xx1).as_('outV').merge_v(xx2).as_('inV').merge_e(xx3).option(Merge.out_v,
 __.select('outV')).option(Merge.in_v, __.select('inV'))), (lambda g, 
xx1=None,xx3=None,xx2=None:g.V()), (lambda g, 
xx1=None,xx3=None,xx2=None:g.E()), (lambda g, xx1=None,xx3=None,xx2=None:g. 
[...]
     
'g_V_asXvX_mergeEXxx1X_optionXMerge_onMatch_xx2X_optionXMerge_outV_selectXvXX_optionXMerge_inV_selectXvXX':
 [(lambda g, xx1=None,xx2=None:g.add_v('person').property('name', 
'marko').property('age', 29)), (lambda g, 
xx1=None,xx2=None:g.V().as_('v').merge_e(xx1).option(Merge.on_match, 
xx2).option(Merge.out_v, __.select('v')).option(Merge.in_v, __.select('v')))], 
-    
'g_V_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX':
 [(lambda g, xx1=None:g.add_v('person').property('name', 
'marko').as_('a').add_v('person').property('name', 
'vadas').as_('b').add_e('knows').property('weight', 1).from_('a').to('b')), 
(lambda g, xx1=None:g.V().merge_e(xx1).option(Merge.on_match, 
__.side_effect(__.property('weight', 0)).constant({  })))], 
+    
'g_V_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX':
 [(lambda g, xx1=None:g.add_v('person').property('name', 
'marko').as_('a').add_v('person').property('name', 
'vadas').as_('b').add_e('knows').property('weight', 1).from_('a').to('b')), 
(lambda g, xx1=None:g.V().merge_e(xx1).option(Merge.on_match, 
__.side_effect(__.property('weight', 0)).constant({  }))), (lambda g, 
xx1=None:g.V()), (lambda g, xx1=None:g.E()), (lambda g, xx1=None [...]
     
'g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX':
 [(lambda g, xx1=None:g.add_v('person').property('name', 
'marko').as_('a').add_v('person').property('name', 
'vadas').as_('b').add_e('knows').property('weight', 1).from_('a').to('b')), 
(lambda g, xx1=None:g.merge_e(xx1).option(Merge.on_match, 
__.side_effect(__.property('weight', 0)).constant({  }))), (lambda g, 
xx1=None:g.V()), (lambda g, xx1=None:g.E().has_label('knows').has('wei [...]
-    
'g_unionXselectXmX_selectXmX_constantXcreated_NXX_fold_mergeEXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_match':
 [(lambda g:g.add_v('person').property('name', 'marko').property('age', 
29).as_('marko').add_v('person').property('name', 'vadas').property('age', 
27).as_('vadas').add_v('software').property('name', 'lop').property('lang', 
'java').as_('lop').add_v('person').property('name', 'josh').property('age', 
32).as_('josh').ad [...]
-    
'g_unionXselectXmX_selectXmX_constantXcreated_NXX_fold_mergeEXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_create':
 [(lambda g:g.add_v('person').property('name', 'marko').property('age', 
29).as_('marko').add_v('person').property('name', 'vadas').property('age', 
27).as_('vadas').add_v('software').property('name', 'lop').property('lang', 
'java').as_('lop').add_v('person').property('name', 'josh').property('age', 
32).as_('josh').a [...]
+    
'g_unionXselectXmapX_selectXmapX_constantXcreated_NXX_fold_asXmX_mergeEXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match':
 [(lambda g:g.add_v('person').property('name', 'marko').property('age', 
29).as_('marko').add_v('person').property('name', 'vadas').property('age', 
27).as_('vadas').add_v('software').property('name', 'lop').property('lang', 
'java').as_('lop').add_v('person').property('name', 'j [...]
+    
'g_unionXselectXmapX_selectXmapX_constantXcreated_NXX_fold_asXmX_mergeEXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create':
 [(lambda g:g.add_v('person').property('name', 'marko').property('age', 
29).as_('marko').add_v('person').property('name', 'vadas').property('age', 
27).as_('vadas').add_v('software').property('name', 'lop').property('lang', 
'java').as_('lop').add_v('person').property('name', ' [...]
     
'g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_weight_nullX_allowed': 
[(lambda g, xx1=None,xx2=None:g.add_v('person').property('name', 
'marko').as_('a').add_v('person').property('name', 
'vadas').as_('b').add_e('knows').from_('a').to('b').property('weight', 1.0)), 
(lambda g, xx1=None,xx2=None:g.merge_e(xx1).option(Merge.on_match, xx2)), 
(lambda g, xx1=None,xx2=None:g.V()), (lambda g, 
xx1=None,xx2=None:g.E().has_label('knows')), (lambda g, 
xx1=None,xx2=None:g.E().has_label('k [...]
     'g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_weight_nullX': 
[(lambda g, xx1=None,xx2=None:g.add_v('person').property('name', 
'marko').as_('a').add_v('person').property('name', 
'vadas').as_('b').add_e('knows').from_('a').to('b').property('weight', 1.0)), 
(lambda g, xx1=None,xx2=None:g.merge_e(xx1).option(Merge.on_match, xx2)), 
(lambda g, xx1=None,xx2=None:g.V()), (lambda g, 
xx1=None,xx2=None:g.E().has_label('knows')), (lambda g, 
xx1=None,xx2=None:g.E().has_label('knows').h [...]
     'g_mergeVXemptyX_optionXonMatch_nullX': [(lambda 
g:g.add_v('person').property('name', 'marko').property('age', 29)), (lambda 
g:g.merge_v({  }).option(Merge.on_match, None)), (lambda g:g.V().has('person', 
'name', 'marko').has('age', 29))], 
@@ -1160,7 +1160,7 @@ world.gremlins = {
     'g_mergeXlabel_person_name_vadasX_optionXonMatch_age_35X': [(lambda g, 
xx1=None,xx2=None:g.add_v('person').property('name', 'vadas').property('age', 
29).add_v('person').property('name', 'vadas').property('age', 27)), (lambda g, 
xx1=None,xx2=None:g.merge_v(xx1).option(Merge.on_match, xx2)), (lambda g, 
xx1=None,xx2=None:g.V().has('age', 35)), (lambda g, xx1=None,xx2=None:g.V())], 
     'g_V_mapXmergeXlabel_person_name_joshXX': [(lambda g, 
xx1=None:g.add_v('person').property('name', 'vadas').property('age', 
29).add_v('person').property('name', 'stephen').property('age', 27)), (lambda 
g, xx1=None:g.V().map(__.merge_v(xx1))), (lambda g, 
xx1=None:g.V().has('person', 'name', 'josh')), (lambda g, xx1=None:g.V())], 
     
'g_withSideEffectXc_label_person_name_markoX_withSideEffectXm_age_19X_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option':
 [(lambda g:g.add_v('person').property('name', 
'marko').property(Cardinality.list_, 'age', 29).property(Cardinality.list_, 
'age', 31).property(Cardinality.list_, 'age', 32)), (lambda 
g:g.merge_v(__.select('c')).option(Merge.on_match, 
__.side_effect(__.properties('age').drop()).select('m'))), (lambda 
g:g.V().has('person', 'name', 'm [...]
-    
'g_withSideEffectXm_age_19X_V_hasXperson_name_markoX_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option':
 [(lambda g:g.add_v('person').property('name', 
'marko').property(Cardinality.list_, 'age', 29).property(Cardinality.list_, 
'age', 31).property(Cardinality.list_, 'age', 32)), (lambda 
g:g.V().has('person', 'name', 'marko').merge_v({  }).option(Merge.on_match, 
__.side_effect(__.properties('age').drop()).select('m')))], 
+    
'g_withSideEffectXm_age_19X_V_hasXperson_name_markoX_mergeVXselectXcXX_optionXonMatch_sideEffectXpropertiesXageX_dropX_selectXmXX_option':
 [(lambda g:g.add_v('person').property('name', 
'marko').property(Cardinality.list_, 'age', 29).property(Cardinality.list_, 
'age', 31).property(Cardinality.list_, 'age', 32)), (lambda 
g:g.V().has('person', 'name', 'marko').merge_v({  }).option(Merge.on_match, 
__.side_effect(__.properties('age').drop()).select('m'))), (lambda 
g:g.V().has('person', 'n [...]
     'g_mergeV_onCreate_inheritance_existing': [(lambda g, 
xx1=None,xx2=None:g.add_v('person').property('name', 'mike').property(T.id_, 
'1')), (lambda g, xx1=None,xx2=None:g.merge_v(xx1).option(Merge.on_create, 
xx2)), (lambda g, xx1=None,xx2=None:g.V()), (lambda g, 
xx1=None,xx2=None:g.V('1').has('person', 'name', 'mike'))], 
     'g_mergeV_onCreate_inheritance_new_1': [(lambda g, 
xx1=None,xx2=None:g.merge_v(xx1).option(Merge.on_create, xx2)), (lambda g, 
xx1=None,xx2=None:g.V()), (lambda g, xx1=None,xx2=None:g.V('1').has('person', 
'name', 'mike'))], 
     'g_mergeV_onCreate_inheritance_new_2': [(lambda g, 
xx1=None,xx2=None:g.merge_v(xx1).option(Merge.on_create, xx2)), (lambda g, 
xx1=None,xx2=None:g.V()), (lambda g, xx1=None,xx2=None:g.V('1').has('person', 
'name', 'mike'))], 
@@ -1185,8 +1185,8 @@ world.gremlins = {
     'g_mergeVXname_aliceX_optionXonCreate_age_setX81XX': [(lambda 
g:g.merge_v({ 'name': 'alice', T.label: 'person' }).option(Merge.on_create, { 
'age': CardinalityValue.set_(81) })), (lambda g:g.V().has('person', 'name', 
'alice').has('age', 81)), (lambda g:g.V().has('person', 'name', 
'alice').has('age')), (lambda g:g.V().has('person', 'name', 
'alice').properties('age'))], 
     'g_mergeVXname_aliceX_optionXonCreate_age_singleX81X_age_81_setX': 
[(lambda g:g.merge_v({ 'name': 'alice', T.label: 'person' 
}).option(Merge.on_create, { 'age': 81 }, Cardinality.set_)), (lambda 
g:g.V().has('person', 'name', 'alice').has('age', 81)), (lambda 
g:g.V().has('person', 'name', 'alice').has('age')), (lambda 
g:g.V().has('person', 'name', 'alice').properties('age'))], 
     'g_mergeV_hidden_label_key_onMatch_matched_prohibited': [(lambda g, 
xx1=None:g.merge_v({  }).option(Merge.on_match, xx1))], 
-    
'g_injectXlist1_list2X_mergeVXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_match':
 [(lambda g:g.add_v('person').property('name', 'marko').property('age', 29)), 
(lambda g:g.inject({ T.label: 'person', 'name': 'marko' }, { T.label: 'person', 
'name': 'marko' }, { 'created': 'N' }).fold().merge_v(__.limit(Scope.local, 
1).unfold()).option(Merge.on_create, __.range_(Scope.local, 1, 
2).unfold()).option(Merge.on_match, __.tail(Scope.lo [...]
-    
'g_injectXlist1_list2X_mergeVXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_create':
 [(lambda g:g.add_v('person').property('name', 'marko').property('age', 29)), 
(lambda g:g.inject({ T.label: 'person', 'name': 'stephen' }, { T.label: 
'person', 'name': 'stephen' }, { 'created': 'N' 
}).fold().merge_v(__.limit(Scope.local, 1).unfold()).option(Merge.on_create, 
__.range_(Scope.local, 1, 2).unfold()).option(Merge.on_match, __.tail(Sco [...]
+    
'g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match':
 [(lambda g:g.add_v('person').property('name', 'marko').property('age', 29)), 
(lambda g:g.inject({ T.label: 'person', 'name': 'marko' }, { T.label: 'person', 
'name': 'marko' }, { 'created': 'N' 
}).fold().as_('m').merge_v(__.select('m').limit(Scope.local, 
1).unfold()).option(Merge.on_create, __.select( [...]
+    
'g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create':
 [(lambda g:g.add_v('person').property('name', 'marko').property('age', 29)), 
(lambda g:g.inject({ T.label: 'person', 'name': 'stephen' }, { T.label: 
'person', 'name': 'stephen' }, { 'created': 'N' 
}).fold().as_('m').merge_v(__.select('m').limit(Scope.local, 
1).unfold()).option(Merge.on_create, __.se [...]
     'g_V_age_min': [(lambda g:g.V().values('age').min_())], 
     'g_V_foo_min': [(lambda g:g.V().values('foo').min_())], 
     'g_V_name_min': [(lambda g:g.V().values('name').min_())], 
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeEdge.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeEdge.feature
index 6d8fe7c488..e472a1b5d4 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeEdge.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeEdge.feature
@@ -841,7 +841,10 @@ Feature: Step - mergeE()
               option(Merge.onMatch, __.sideEffect(__.property("weight", 
0)).constant([:]))
       """
     When iterated to list
-    Then the traversal will raise an error with message containing text of 
"The incoming traverser for MergeEdgeStep cannot be an Element"
+    Then the result should have a count of 2
+    And the graph should return 2 for count of "g.V()"
+    And the graph should return 1 for count of "g.E()"
+    And the graph should return 1 for count of 
"g.E().hasLabel(\"knows\").has(\"weight\",0)"
 
   Scenario: 
g_mergeEXlabel_knows_out_marko_in_vadasX_optionXonMatch_sideEffectXpropertyXweight_0XX_constantXemptyXX
     Given the empty graph
@@ -864,7 +867,7 @@ Feature: Step - mergeE()
     And the graph should return 1 for count of 
"g.E().hasLabel(\"knows\").has(\"weight\",0)"
     And the graph should return 0 for count of "g.V().has(\"weight\")"
 
-    Scenario: 
g_unionXselectXmX_selectXmX_constantXcreated_NXX_fold_mergeEXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_match
+    Scenario: 
g_unionXselectXmapX_selectXmapX_constantXcreated_NXX_fold_asXmX_mergeEXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match
     Given the empty graph
     And the graph initializer of
       """
@@ -881,14 +884,14 @@ Feature: Step - mergeE()
         addE("created").from("josh").to("lop").property("weight", 0.4d).
         addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
-    And using the side effect m defined as "m[{\"t[label]\": \"knows\", 
\"D[OUT]\":\"v[marko].id\", \"D[IN]\":\"v[vadas].id\"}]"
+    And using the side effect map defined as "m[{\"t[label]\": \"knows\", 
\"D[OUT]\":\"v[marko].id\", \"D[IN]\":\"v[vadas].id\"}]"
     And the traversal of
       """
-      g.union(select("m"), select("m"), constant([created: "N"])).
-        fold().
-        mergeE(__.limit(Scope.local,1).unfold()).
-          option(Merge.onCreate, __.range(Scope.local, 1, 2).unfold()).
-          option(Merge.onMatch, __.tail(Scope.local).unfold())
+      g.union(select("map"), select("map"), constant([created: "N"])).
+        fold().as("m").
+        mergeE(__.select("m").limit(Scope.local,1).unfold()).
+          option(Merge.onCreate, __.select("m").range(Scope.local, 1, 
2).unfold()).
+          option(Merge.onMatch, __.select("m").tail(Scope.local).unfold())
       """
     When iterated to list
     Then the result should have a count of 1
@@ -897,7 +900,7 @@ Feature: Step - mergeE()
     And the graph should return 1 for count of "g.E().has(\"created\",\"N\")"
     And the graph should return 1 for count of 
"g.V().has(\"person\",\"name\",\"marko\").outE(\"knows\").has(\"created\",\"N\").inV().has(\"person\",\"name\",\"vadas\")"
 
-   Scenario: 
g_unionXselectXmX_selectXmX_constantXcreated_NXX_fold_mergeEXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_create
+   Scenario: 
g_unionXselectXmapX_selectXmapX_constantXcreated_NXX_fold_asXmX_mergeEXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create
     Given the empty graph
     And the graph initializer of
       """
@@ -914,14 +917,14 @@ Feature: Step - mergeE()
         addE("created").from("josh").to("lop").property("weight", 0.4d).
         addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
-    And using the side effect m defined as "m[{\"t[label]\": \"self\", 
\"D[OUT]\":\"v[vadas].id\", \"D[IN]\":\"v[vadas].id\"}]"
+    And using the side effect map defined as "m[{\"t[label]\": \"self\", 
\"D[OUT]\":\"v[vadas].id\", \"D[IN]\":\"v[vadas].id\"}]"
     And the traversal of
       """
-      g.union(select("m"), select("m"), constant([created:"N"])).
-        fold().
-        mergeE(__.limit(Scope.local,1).unfold()).
-          option(Merge.onCreate, __.range(Scope.local, 1, 2).unfold()).
-          option(Merge.onMatch, __.tail(Scope.local).unfold())
+      g.union(select("map"), select("map"), constant([created:"N"])).
+        fold().as("m").
+        mergeE(__.select("m").limit(Scope.local,1).unfold()).
+          option(Merge.onCreate, __.select("m").range(Scope.local, 1, 
2).unfold()).
+          option(Merge.onMatch, __.select("m").tail(Scope.local).unfold())
       """
     When iterated to list
     Then the result should have a count of 1
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeVertex.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeVertex.feature
index 713f711cb0..3012f087b0 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeVertex.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeVertex.feature
@@ -571,7 +571,9 @@ Feature: Step - mergeV()
           option(Merge.onMatch, 
__.sideEffect(__.properties("age").drop()).select("m"))
       """
     When iterated to list
-    Then the traversal will raise an error with message containing text of 
"The incoming traverser for MergeVertexStep cannot be an Element"
+    Then the result should have a count of 1
+    And the graph should return 1 for count of 
"g.V().has(\"person\",\"name\",\"marko\").has(\"age\", 19)"
+    And the graph should return 1 for count of 
"g.V().has(\"person\",\"name\",\"marko\").properties(\"age\")"
 
   # onCreate inheritance from merge
   @UserSuppliedVertexIds
@@ -925,7 +927,7 @@ Feature: Step - mergeV()
     When iterated to list
     Then the traversal will raise an error with message containing text of 
"Property key can not be a hidden key: ~label"
 
-  Scenario: 
g_injectXlist1_list2X_mergeVXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_match
+  Scenario: 
g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match
     Given the empty graph
     And the graph initializer of
       """
@@ -934,17 +936,17 @@ Feature: Step - mergeV()
     And the traversal of
       """
       g.inject([T.label:"person", name:"marko"], [T.label:"person", 
name:"marko"], [created:"N"]).
-        fold().
-        mergeV(__.limit(Scope.local,1).unfold()).
-          option(Merge.onCreate, __.range(Scope.local, 1, 2).unfold()).
-          option(Merge.onMatch, __.tail(Scope.local).unfold())
+        fold().as("m").
+        mergeV(__.select("m").limit(Scope.local,1).unfold()).
+          option(Merge.onCreate, __.select("m").range(Scope.local, 1, 
2).unfold()).
+          option(Merge.onMatch, __.select("m").tail(Scope.local).unfold())
       """
     When iterated to list
     Then the result should have a count of 1
     And the graph should return 1 for count of 
"g.V().has(\"person\",\"name\",\"marko\").has(\"created\",\"N\")"
     And the graph should return 1 for count of "g.V()"
 
-  Scenario: 
g_injectXlist1_list2X_mergeVXlimitXlocal_1X_unfoldX_optionXonCreate_rangeXlocal_1_2X_unfoldX_optionXonMatch_tailXlocalX_unfoldX_to_create
+  Scenario: 
g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create
     Given the empty graph
     And the graph initializer of
       """
@@ -953,10 +955,10 @@ Feature: Step - mergeV()
     And the traversal of
       """
       g.inject([T.label:"person", name:"stephen"], [T.label:"person", 
name:"stephen"], [created:"N"]).
-        fold().
-        mergeV(__.limit(Scope.local,1).unfold()).
-          option(Merge.onCreate, __.range(Scope.local, 1, 2).unfold()).
-          option(Merge.onMatch, __.tail(Scope.local).unfold())
+        fold().as("m").
+        mergeV(__.select("m").limit(Scope.local,1).unfold()).
+          option(Merge.onCreate, __.select("m").range(Scope.local, 1, 
2).unfold()).
+          option(Merge.onMatch, __.select("m").tail(Scope.local).unfold())
       """
     When iterated to list
     Then the result should have a count of 1

Reply via email to