You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2024/04/09 22:40:08 UTC

(tinkerpop) 07/09: Refactored after rebase of withoutStrategies addition

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

spmallette pushed a commit to branch TINKERPOP-3028
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 03959a62dbdfc2bafcfdd3b159dff877f04b145b
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Fri Mar 8 15:05:07 2024 -0500

    Refactored after rebase of withoutStrategies addition
---
 .../translator/AbstractTranslateVisitor.java       | 49 +++++----------
 .../translator/DotNetTranslateVisitor.java         | 54 +++++++++-------
 .../language/translator/GoTranslateVisitor.java    | 46 +++++++-------
 .../language/translator/JavaTranslateVisitor.java  | 63 ++++++++++++-------
 .../translator/JavascriptTranslateVisitor.java     | 47 ++++++++------
 .../translator/PythonTranslateVisitor.java         | 69 ++++++++++++++------
 .../language/translator/TranslateVisitor.java      | 73 +++++++++++++---------
 .../language/translator/GremlinTranslatorTest.java | 40 +++++++++++-
 .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 44 ++++++++-----
 gremlin-go/driver/cucumber/gremlin.go              | 44 ++++++++-----
 .../gremlin-javascript/test/cucumber/gremlin.js    | 44 ++++++++-----
 .../src/main/python/radish/feature_steps.py        | 20 ++++--
 gremlin-python/src/main/python/radish/gremlin.py   | 46 +++++++++-----
 13 files changed, 407 insertions(+), 232 deletions(-)

diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/AbstractTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/AbstractTranslateVisitor.java
index 173eb775c8..8e3f81faa4 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/AbstractTranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/AbstractTranslateVisitor.java
@@ -47,44 +47,25 @@ public abstract class AbstractTranslateVisitor extends TranslateVisitor {
         return null;
     }
 
-    @Override
-    public Void visitTraversalStrategyArgs_ProductiveByStrategy(final GremlinParser.TraversalStrategyArgs_ProductiveByStrategyContext ctx) {
-        return appendStrategyArguments(ctx);
-    }
-
-    @Override
-    public Void visitTraversalStrategyArgs_PartitionStrategy(final GremlinParser.TraversalStrategyArgs_PartitionStrategyContext ctx) {
-        return appendStrategyArguments(ctx);
-    }
-
-    @Override
-    public Void visitTraversalStrategyArgs_SubgraphStrategy(final GremlinParser.TraversalStrategyArgs_SubgraphStrategyContext ctx) {
-        return appendStrategyArguments(ctx);
-    }
-
-    @Override
-    public Void visitTraversalStrategyArgs_EdgeLabelVerificationStrategy(final GremlinParser.TraversalStrategyArgs_EdgeLabelVerificationStrategyContext ctx) {
-        return appendStrategyArguments(ctx);
-    }
-
-    @Override
-    public Void visitTraversalStrategyArgs_ReservedKeysVerificationStrategy(final GremlinParser.TraversalStrategyArgs_ReservedKeysVerificationStrategyContext ctx) {
-        return appendStrategyArguments(ctx);
-    }
-
-    @Override
-    public Void visitTraversalStrategyArgs_SeedStrategy(final GremlinParser.TraversalStrategyArgs_SeedStrategyContext ctx) {
-        return appendStrategyArguments(ctx);
-    }
-
     protected void handleStringLiteralText(final String text) {
         sb.append("\"");
         sb.append(text);
         sb.append("\"");
     }
 
-    /**
-     * Translate an argument pair for a traversal strategy.
-     */
-    protected abstract Void appendStrategyArguments(final ParseTree ctx);
+    @Override
+    public Void visitKeyword(final GremlinParser.KeywordContext ctx) {
+        final String keyword = ctx.getText();
+
+        // translate differently based on the context of the keyword's parent.
+        if (ctx.getParent() instanceof GremlinParser.MapEntryContext) {
+            // if the keyword is a key in a map, then it's a string literal essentially
+            handleStringLiteralText(keyword);
+        } else {
+            // in all other cases it's used more like "new Class()"
+            sb.append(keyword).append(" ");
+        }
+
+        return null;
+    }
 }
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java
index fc027ab3be..bb6ee7f20d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java
@@ -30,6 +30,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * Converts a Gremlin traversal string into a C# source code representation of that traversal with an aim at
@@ -204,15 +205,18 @@ public class DotNetTranslateVisitor extends AbstractTranslateVisitor {
     @Override
     public Void visitMapEntry(final GremlinParser.MapEntryContext ctx) {
         sb.append("{ ");
-        // if it is a terminal node then it has to be processed as a string for Java but otherwise it can
-        // just be handled as a generic literal
-        if (ctx.getChild(0) instanceof TerminalNode) {
+        // if it is a terminal node that isn't a starting form like "(T.id)" then it has to be processed as a string
+        // for Java but otherwise it can just be handled as a generic literal
+        final boolean isKeyWrappedInParens = ctx.getChild(0).getText().equals("(");
+        if (ctx.getChild(0) instanceof TerminalNode && !isKeyWrappedInParens) {
             handleStringLiteralText(ctx.getChild(0).getText());
         }  else {
-            visit(ctx.getChild(0));
+            final int indexOfActualKey = isKeyWrappedInParens ? 1 : 0;
+            visit(ctx.getChild(indexOfActualKey));
         }
         sb.append(", ");
-        visit(ctx.getChild(2)); // value
+        final int indexOfValue = isKeyWrappedInParens ? 4 : 2;
+        visit(ctx.getChild(indexOfValue)); // value
         sb.append(" }");
         return null;
     }
@@ -225,30 +229,33 @@ public class DotNetTranslateVisitor extends AbstractTranslateVisitor {
         else {
             sb.append("new ").append(ctx.getChild(1).getText()).append("(");
 
-            // get a list of all the arguments to the strategy - i.e. anything not a terminal node
-            final List<ParseTree> strategyArgs = ctx.children.stream()
-                    .filter(c -> !(c instanceof TerminalNode))
-                    .collect(java.util.stream.Collectors.toList());
+            final List<ParseTree> configs = ctx.children.stream().
+                    filter(c -> c instanceof GremlinParser.ConfigurationContext).collect(Collectors.toList());
 
-            for (int ix = 0; ix < strategyArgs.size(); ix++) {
-                visit(strategyArgs.get(ix));
-                if (ix < strategyArgs.size() - 1)
+            // the rest are the arguments to the strategy
+            for (int ix = 0; ix < configs.size(); ix++) {
+                visit(configs.get(ix));
+                if (ix < configs.size() - 1)
                     sb.append(", ");
             }
-            sb.append(")");
+
+            sb.append(")");;
         }
         return null;
     }
 
     @Override
-    public Void visitTraversalStrategyArgs_PartitionStrategy(final GremlinParser.TraversalStrategyArgs_PartitionStrategyContext ctx) {
-        appendStrategyArguments(ctx);
+    public Void visitConfiguration(final GremlinParser.ConfigurationContext ctx) {
+        // form of three tokens of key:value to become key=value
+        sb.append(ctx.getChild(0).getText());
+        sb.append(": ");
+        visit(ctx.getChild(2));
 
         // need to convert List to Set for readPartitions until TINKERPOP-3032
         if (ctx.getChild(0).getText().equals("readPartitions")) {
             // find the last "List" in sb and replace it with "HashSet"
-            final int ix = sb.lastIndexOf("List");
-            sb.replace(ix, ix + 4, "HashSet");
+            final int ix = sb.lastIndexOf("List<object>");
+            sb.replace(ix, ix + 12, "HashSet<string>");
         }
 
         return null;
@@ -1076,6 +1083,12 @@ public class DotNetTranslateVisitor extends AbstractTranslateVisitor {
         return handleGenerics(ctx);
     }
 
+    @Override
+    public Void visitClassType(final GremlinParser.ClassTypeContext ctx) {
+        sb.append("typeof(").append(ctx.getText()).append(")");
+        return null;
+    }
+
     /**
      * Steps with a {@code <TNewEnd>} defined need special handling to append generics.
      */
@@ -1094,13 +1107,6 @@ public class DotNetTranslateVisitor extends AbstractTranslateVisitor {
         return null;
     }
 
-    @Override
-    protected Void appendStrategyArguments(final ParseTree ctx) {
-        sb.append(ctx.getChild(0).getText()).append(": ");
-        visit(ctx.getChild(2));
-        return null;
-    }
-
     @Override
     protected String processGremlinSymbol(final String step) {
         return SymbolHelper.toCSharp(step);
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GoTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GoTranslateVisitor.java
index 12f60296f9..6df4b524c9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GoTranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GoTranslateVisitor.java
@@ -30,6 +30,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 public class GoTranslateVisitor extends AbstractTranslateVisitor {
     private final static String GO_PACKAGE_NAME = "gremlingo.";
@@ -125,15 +126,18 @@ public class GoTranslateVisitor extends AbstractTranslateVisitor {
 
     @Override
     public Void visitMapEntry(final GremlinParser.MapEntryContext ctx) {
-        // if it is a terminal node then it has to be processed as a string for Java but otherwise it can
-        // just be handled as a generic literal
-        if (ctx.getChild(0) instanceof TerminalNode) {
+        // if it is a terminal node that isn't a starting form like "(T.id)" then it has to be processed as a string
+        // for Java but otherwise it can just be handled as a generic literal
+        final boolean isKeyWrappedInParens = ctx.getChild(0).getText().equals("(");
+        if (ctx.getChild(0) instanceof TerminalNode && !isKeyWrappedInParens) {
             handleStringLiteralText(ctx.getChild(0).getText());
         }  else {
-            visit(ctx.getChild(0));
+            final int indexOfActualKey = isKeyWrappedInParens ? 1 : 0;
+            visit(ctx.getChild(indexOfActualKey));
         }
         sb.append(": ");
-        visit(ctx.getChild(2)); // value
+        final int indexOfValue = isKeyWrappedInParens ? 4 : 2;
+        visit(ctx.getChild(indexOfValue)); // value
         return null;
     }
 
@@ -180,15 +184,16 @@ public class GoTranslateVisitor extends AbstractTranslateVisitor {
             sb.append(GO_PACKAGE_NAME + ctx.getChild(1).getText() + "Config{");
 
             // get a list of all the arguments to the strategy - i.e. anything not a terminal node
-            final List<ParseTree> strategyArgs = ctx.children.stream()
-                    .filter(c -> !(c instanceof TerminalNode))
-                    .collect(java.util.stream.Collectors.toList());
+            final List<ParseTree> configs = ctx.children.stream().
+                    filter(c -> c instanceof GremlinParser.ConfigurationContext).collect(Collectors.toList());
 
-            for (int i = 0; i < strategyArgs.size(); i++) {
-                visit(strategyArgs.get(i));
-                if (i < strategyArgs.size() - 1)
+            // the rest are the arguments to the strategy
+            for (int ix = 0; ix < configs.size(); ix++) {
+                visit(configs.get(ix));
+                if (ix < configs.size() - 1)
                     sb.append(", ");
             }
+
             sb.append("})");
         }
 
@@ -196,15 +201,19 @@ public class GoTranslateVisitor extends AbstractTranslateVisitor {
     }
 
     @Override
-    public Void visitTraversalStrategyArgs_PartitionStrategy(final GremlinParser.TraversalStrategyArgs_PartitionStrategyContext ctx) {
-        appendStrategyArguments(ctx);
+    public Void visitConfiguration(final GremlinParser.ConfigurationContext ctx) {
+        // form of three tokens of key:value to become key=value
+        sb.append(SymbolHelper.toGo(ctx.getChild(0).getText()));
+        sb.append(": ");
+        visit(ctx.getChild(2));
 
+        // need to convert List to Set for readPartitions until TINKERPOP-3032
         if (ctx.getChild(0).getText().equals("readPartitions")) {
             final int ix = sb.lastIndexOf("ReadPartitions: [");
             if (ix > 0) {
-                final int endIx = sb.indexOf("\"]", ix);
+                final int endIx = sb.indexOf("\"}", ix);
                 sb.replace(endIx, endIx + 2, "\")");
-                sb.replace(ix, ix + 17, "ReadPartitions: gremlingo.NewSimpleSet(");
+                sb.replace(ix, ix + "ReadPartitions: []interface{}{".length(), "ReadPartitions: gremlingo.NewSimpleSet(");
             }
 
         }
@@ -241,13 +250,6 @@ public class GoTranslateVisitor extends AbstractTranslateVisitor {
         return SymbolHelper.toGo(step);
     }
 
-    @Override
-    protected Void appendStrategyArguments(final ParseTree ctx) {
-        sb.append(SymbolHelper.toGo(ctx.getChild(0).getText())).append(": ");
-        visit(ctx.getChild(2));
-        return null;
-    }
-
     @Override
     protected void appendExplicitNaming(final String txt, final String prefix) {
         sb.append(GO_PACKAGE_NAME);
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java
index 480a1b5fa3..7a145e8bd5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java
@@ -21,10 +21,14 @@ package org.apache.tinkerpop.gremlin.language.translator;
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.TerminalNode;
 import org.apache.tinkerpop.gremlin.language.grammar.GremlinParser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.util.DatetimeHelper;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * Converts a Gremlin traversal string into a Java source code representation of that traversal with an aim at
@@ -62,23 +66,46 @@ public class JavaTranslateVisitor extends AbstractTranslateVisitor {
         if (ctx.getChildCount() == 1)
             sb.append(ctx.getText()).append(".instance()");
         else {
-            sb.append(ctx.getChild(1).getText()).append(".build()");
+            visit(ctx.classType());
+            sb.append(".build()");
 
-            // get a list of all the arguments to the strategy - i.e. anything not a terminal node
-            final List<ParseTree> strategyArgs = ctx.children.stream()
-                    .filter(c -> !(c instanceof TerminalNode))
-                    .collect(java.util.stream.Collectors.toList());
+            final List<ParseTree> configs = ctx.children.stream().
+                    filter(c -> c instanceof GremlinParser.ConfigurationContext).collect(Collectors.toList());
 
-            for (ParseTree arg : strategyArgs) {
+            // the rest are the arguments to the strategy
+            for (ParseTree config : configs) {
                 sb.append(".");
-                visit(arg);
+                visit(config);
             }
+
             sb.append(".create()");
         }
 
         return null;
     }
 
+    @Override
+    public Void visitConfiguration(final GremlinParser.ConfigurationContext ctx) {
+        // form of three tokens of key:value to become key(value)
+        sb.append(ctx.getChild(0).getText()).append("(");
+        visit(ctx.getChild(2));
+        sb.append(")");
+        return null;
+    }
+
+    @Override
+    public Void visitClassType(final GremlinParser.ClassTypeContext ctx) {
+        // require different handling based on the parent. if used inside of withoutStrategies() then it needs
+        // a class reference, otherwise it's just a keyword.
+        if (ctx.getParent() instanceof GremlinParser.TraversalSourceSelfMethod_withoutStrategiesContext ||
+            ctx.getParent() instanceof GremlinParser.ClassTypeExprContext)
+            sb.append(ctx.getText()).append(".class");
+        else
+            sb.append(ctx.getText());
+
+        return null;
+    }
+
     @Override
     public Void visitGenericLiteralMap(final GremlinParser.GenericLiteralMapContext ctx) {
         sb.append("new LinkedHashMap<Object, Object>() {{ ");
@@ -95,15 +122,18 @@ public class JavaTranslateVisitor extends AbstractTranslateVisitor {
     @Override
     public Void visitMapEntry(final GremlinParser.MapEntryContext ctx) {
         sb.append("put(");
-        // if it is a terminal node then it has to be processed as a string for Java but otherwise it can 
-        // just be handled as a generic literal 
-        if (ctx.getChild(0) instanceof TerminalNode) {
+        // if it is a terminal node that isn't a starting form like "(T.id)" then it has to be processed as a string
+        // for Java but otherwise it can just be handled as a generic literal
+        final boolean isKeyWrappedInParens = ctx.getChild(0).getText().equals("(");
+        if (ctx.getChild(0) instanceof TerminalNode && !isKeyWrappedInParens) {
             handleStringLiteralText(ctx.getChild(0).getText());
         }  else {
-            visit(ctx.getChild(0));
+            final int indexOfActualKey = isKeyWrappedInParens ? 1 : 0;
+            visit(ctx.getChild(indexOfActualKey));
         }
         sb.append(", ");
-        visit(ctx.getChild(2)); // value
+        final int indexOfValue = isKeyWrappedInParens ? 4 : 2;
+        visit(ctx.getChild(indexOfValue)); // value
         sb.append(");");
         return null;
     }
@@ -238,13 +268,4 @@ public class JavaTranslateVisitor extends AbstractTranslateVisitor {
         sb.append(" }}");
         return null;
     }
-
-    @Override
-    protected Void appendStrategyArguments(final ParseTree ctx) {
-        sb.append(ctx.getChild(0)).append("(");
-        visit(ctx.getChild(2));
-        sb.append(")");
-        return null;
-    }
-
 }
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java
index b0f0852dd2..b340f26b6e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java
@@ -22,6 +22,8 @@ package org.apache.tinkerpop.gremlin.language.translator;
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.TerminalNode;
 import org.apache.tinkerpop.gremlin.language.grammar.GremlinParser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.util.DatetimeHelper;
 
@@ -29,6 +31,8 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * Converts a Gremlin traversal string into a Javascript source code representation of that traversal with an aim at
@@ -68,22 +72,31 @@ public class JavascriptTranslateVisitor extends AbstractTranslateVisitor {
         else {
             sb.append(ctx.getChild(1).getText()).append("({");
 
-            // get a list of all the arguments to the strategy - i.e. anything not a terminal node
-            final List<ParseTree> strategyArgs = ctx.children.stream()
-                    .filter(c -> !(c instanceof TerminalNode))
-                    .collect(java.util.stream.Collectors.toList());
+            final List<ParseTree> configs = ctx.children.stream().
+                    filter(c -> c instanceof GremlinParser.ConfigurationContext).collect(Collectors.toList());
 
-            for (int i = 0; i < strategyArgs.size(); i++) {
-                visit(strategyArgs.get(i));
-                if (i < strategyArgs.size() - 1)
+            // the rest are the arguments to the strategy
+            for (int ix = 0; ix < configs.size(); ix++) {
+                visit(configs.get(ix));
+                if (ix < configs.size() - 1)
                     sb.append(", ");
             }
+
             sb.append("})");
         }
 
         return null;
     }
 
+    @Override
+    public Void visitConfiguration(final GremlinParser.ConfigurationContext ctx) {
+        // form of three tokens of key:value to become key=value
+        sb.append(SymbolHelper.toJavascript(ctx.getChild(0).getText()));
+        sb.append(": ");
+        visit(ctx.getChild(2));
+        return null;
+    }
+
     @Override
     public Void visitGenericLiteralMap(final GremlinParser.GenericLiteralMapContext ctx) {
         sb.append("new Map([");
@@ -99,16 +112,19 @@ public class JavascriptTranslateVisitor extends AbstractTranslateVisitor {
 
     @Override
     public Void visitMapEntry(final GremlinParser.MapEntryContext ctx) {
-        // if it is a terminal node then it has to be processed as a string for Java but otherwise it can
-        // just be handled as a generic literal
+        // if it is a terminal node that isn't a starting form like "(T.id)" then it has to be processed as a string
+        // for Java but otherwise it can just be handled as a generic literal
+        final boolean isKeyWrappedInParens = ctx.getChild(0).getText().equals("(");
         sb.append("[");
-        if (ctx.getChild(0) instanceof TerminalNode) {
+        if (ctx.getChild(0) instanceof TerminalNode && !isKeyWrappedInParens) {
             wrapTextInQuotes(ctx.getChild(0).getText());
         }  else {
-            visit(ctx.getChild(0));
+            final int indexOfActualKey = isKeyWrappedInParens ? 1 : 0;
+            visit(ctx.getChild(indexOfActualKey));
         }
         sb.append(", ");
-        visit(ctx.getChild(2)); // value
+        final int indexOfValue = isKeyWrappedInParens ? 4 : 2;
+        visit(ctx.getChild(indexOfValue)); // value
         sb.append("]");
         return null;
     }
@@ -213,13 +229,6 @@ public class JavascriptTranslateVisitor extends AbstractTranslateVisitor {
         return SymbolHelper.toJavascript(step);
     }
 
-    @Override
-    protected Void appendStrategyArguments(final ParseTree ctx) {
-        sb.append(SymbolHelper.toJavascript(ctx.getChild(0).getText())).append(": ");
-        visit(ctx.getChild(2));
-        return null;
-    }
-
     private void wrapTextInQuotes(final String text) {
         sb.append("\"");
         sb.append(text);
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/PythonTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/PythonTranslateVisitor.java
index 4a99dade0c..bfaac4fcb2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/PythonTranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/PythonTranslateVisitor.java
@@ -21,6 +21,8 @@ package org.apache.tinkerpop.gremlin.language.translator;
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.TerminalNode;
 import org.apache.tinkerpop.gremlin.language.grammar.GremlinParser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.util.DatetimeHelper;
 
@@ -29,6 +31,8 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * Converts a Gremlin traversal string into a Python source code representation of that traversal with an aim at
@@ -76,22 +80,53 @@ public class PythonTranslateVisitor extends AbstractTranslateVisitor {
         else {
             sb.append(ctx.getChild(1).getText()).append("(");
 
-            // get a list of all the arguments to the strategy - i.e. anything not a terminal node
-            final List<ParseTree> strategyArgs = ctx.children.stream()
-                    .filter(c -> !(c instanceof TerminalNode))
-                    .collect(java.util.stream.Collectors.toList());
+            final List<ParseTree> configs = ctx.children.stream().
+                    filter(c -> c instanceof GremlinParser.ConfigurationContext).collect(Collectors.toList());
 
-            for (int i = 0; i < strategyArgs.size(); i++) {
-                visit(strategyArgs.get(i));
-                if (i < strategyArgs.size() - 1)
+            // the rest are the arguments to the strategy
+            for (int ix = 0; ix < configs.size(); ix++) {
+                visit(configs.get(ix));
+                if (ix < configs.size() - 1)
                     sb.append(", ");
             }
+
             sb.append(")");
         }
 
         return null;
     }
 
+    @Override
+    public Void visitConfiguration(final GremlinParser.ConfigurationContext ctx) {
+        // form of three tokens of key:value to become key=value
+        sb.append(SymbolHelper.toPython(ctx.getChild(0).getText()));
+        sb.append("=");
+        visit(ctx.getChild(2));
+        return null;
+    }
+
+    @Override
+    public Void visitTraversalSourceSelfMethod_withoutStrategies(final GremlinParser.TraversalSourceSelfMethod_withoutStrategiesContext ctx) {
+        sb.append(SymbolHelper.toPython(ctx.getChild(0).getText())).append("(*[");
+        visit(ctx.classType());
+
+        if (ctx.classTypeList() != null && ctx.classTypeList().getChildCount() > 0) {
+            sb.append(", ");
+            visit(ctx.classTypeList());
+        }
+
+        sb.append("])");
+        return null;
+    }
+
+    @Override
+    public Void visitClassType(final GremlinParser.ClassTypeContext ctx) {
+        final Optional<? extends Class<? extends TraversalStrategy>> strategy = TraversalStrategies.GlobalCache.getRegisteredStrategyClass(ctx.getText());
+        final String fqcn = strategy.map(Class::getName).orElse(ctx.getText());
+        sb.append("GremlinType('").append(fqcn).append("')");
+        return null;
+    }
+
     @Override
     public Void visitGenericLiteralMap(final GremlinParser.GenericLiteralMapContext ctx) {
         sb.append("{ ");
@@ -107,15 +142,18 @@ public class PythonTranslateVisitor extends AbstractTranslateVisitor {
 
     @Override
     public Void visitMapEntry(final GremlinParser.MapEntryContext ctx) {
-        // if it is a terminal node then it has to be processed as a string for Java but otherwise it can
-        // just be handled as a generic literal 
-        if (ctx.getChild(0) instanceof TerminalNode) {
+        // if it is a terminal node that isn't a starting form like "(T.id)" then it has to be processed as a string
+        // for Java but otherwise it can just be handled as a generic literal
+        final boolean isKeyWrappedInParens = ctx.getChild(0).getText().equals("(");
+        if (ctx.getChild(0) instanceof TerminalNode && !isKeyWrappedInParens) {
             handleStringLiteralText(ctx.getChild(0).getText());
         }  else {
-            visit(ctx.getChild(0));
+            final int indexOfActualKey = isKeyWrappedInParens ? 1 : 0;
+            visit(ctx.getChild(indexOfActualKey));
         }
         sb.append(": ");
-        visit(ctx.getChild(2)); // value
+        final int indexOfValue = isKeyWrappedInParens ? 4 : 2;
+        visit(ctx.getChild(indexOfValue)); // value
         return null;
     }
 
@@ -264,13 +302,6 @@ public class PythonTranslateVisitor extends AbstractTranslateVisitor {
         return SymbolHelper.toPython(step);
     }
 
-    @Override
-    protected Void appendStrategyArguments(final ParseTree ctx) {
-        sb.append(SymbolHelper.toPython(ctx.getChild(0).getText())).append("=");
-        visit(ctx.getChild(2));
-        return null;
-    }
-
     protected void handleStringLiteralText(final String text) {
         sb.append("'");
         sb.append(text);
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/TranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/TranslateVisitor.java
index 27e68d818f..7ac440dbc0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/TranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/TranslateVisitor.java
@@ -1487,36 +1487,6 @@ public class TranslateVisitor extends AbstractParseTreeVisitor<Void> implements
         return visitChildren(ctx);
     }
 
-    @Override
-    public Void visitTraversalStrategyArgs_ProductiveByStrategy(final GremlinParser.TraversalStrategyArgs_ProductiveByStrategyContext ctx) {
-        return visitChildren(ctx);
-    }
-
-    @Override
-    public Void visitTraversalStrategyArgs_PartitionStrategy(final GremlinParser.TraversalStrategyArgs_PartitionStrategyContext ctx) {
-        return visitChildren(ctx);
-    }
-
-    @Override
-    public Void visitTraversalStrategyArgs_SubgraphStrategy(final GremlinParser.TraversalStrategyArgs_SubgraphStrategyContext ctx) {
-        return visitChildren(ctx);
-    }
-
-    @Override
-    public Void visitTraversalStrategyArgs_EdgeLabelVerificationStrategy(final GremlinParser.TraversalStrategyArgs_EdgeLabelVerificationStrategyContext ctx) {
-        return visitChildren(ctx);
-    }
-
-    @Override
-    public Void visitTraversalStrategyArgs_ReservedKeysVerificationStrategy(final GremlinParser.TraversalStrategyArgs_ReservedKeysVerificationStrategyContext ctx) {
-        return visitChildren(ctx);
-    }
-
-    @Override
-    public Void visitTraversalStrategyArgs_SeedStrategy(final GremlinParser.TraversalStrategyArgs_SeedStrategyContext ctx) {
-        return visitChildren(ctx);
-    }
-
     @Override
     public Void visitTraversalScope(final GremlinParser.TraversalScopeContext ctx) {
         appendExplicitNaming(ctx.getText(), Scope.class.getSimpleName());
@@ -2328,6 +2298,47 @@ public class TranslateVisitor extends AbstractParseTreeVisitor<Void> implements
         return null;
     }
 
+    @Override
+    public Void visitTraversalSourceSelfMethod_withoutStrategies(final GremlinParser.TraversalSourceSelfMethod_withoutStrategiesContext ctx) {
+        return visitChildren(ctx);
+    }
+
+    @Override
+    public Void visitConfiguration(final GremlinParser.ConfigurationContext ctx) {
+        return visitChildren(ctx);
+    }
+
+    @Override
+    public Void visitClassTypeList(final GremlinParser.ClassTypeListContext ctx) {
+        return visitChildren(ctx);
+    }
+
+    @Override
+    public Void visitClassTypeExpr(final GremlinParser.ClassTypeExprContext ctx) {
+        return visitChildren(ctx);
+    }
+
+    @Override
+    public Void visitClassType(final GremlinParser.ClassTypeContext ctx) {
+        return visitChildren(ctx);
+    }
+
+    @Override
+    public Void visitKeyword(final GremlinParser.KeywordContext ctx) {
+        final String keyword = ctx.getText();
+
+        // translate differently based on the context of the keyword's parent.
+        if (ctx.getParent() instanceof GremlinParser.MapEntryContext || ctx.getParent() instanceof GremlinParser.ConfigurationContext) {
+            // if the keyword is a key in a map, then it's a string literal essentially
+            sb.append(keyword);
+        } else {
+            // in all other cases it's used more like "new Class()"
+            sb.append(keyword).append(" ");
+        }
+
+        return null;
+    }
+
     @Override
     public Void visitTerminal(final TerminalNode node) {
         // skip EOF node
@@ -2348,6 +2359,8 @@ public class TranslateVisitor extends AbstractParseTreeVisitor<Void> implements
                 appendStepSeparator();
                 break;
             case "new":
+                // seems we still sometimes interpret this as a TerminalNode like when newing up a class
+                // which is optional syntax and will go away in the future.
                 sb.append("new");
                 if (!(node.getParent() instanceof GremlinParser.MapEntryContext))
                     sb.append(" "); // includes a space for when not use in context of a Map entry key...one off
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java
index 8f0892c268..286bfbc5de 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java
@@ -615,13 +615,31 @@ public class GremlinTranslatorTest {
                             "g.with_strategies(SubgraphStrategy(check_adjacent_vertices=False, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).E()"},
                     {"g.withStrategies(new PartitionStrategy(partitionKey: \"_partition\", writePartition: \"a\", readPartitions: [\"a\",\"b\"])).V().values(\"name\")",
                             "g.withStrategies(new PartitionStrategy(partitionKey:\"_partition\", writePartition:\"a\", readPartitions:[\"a\", \"b\"])).V().values(\"name\")",
-                            "g.withStrategies(new PartitionStrategy(partitionKey:string0, writePartition:string1, readPartitions:[string1, string2])).V().values(string3)",
+                            "g.withStrategies(new PartitionStrategy(partitionKey:string0, writePartition:string1, readPartitions:list0)).V().values(string2)",
                             "g.WithStrategies(new PartitionStrategy(partitionKey: \"_partition\", writePartition: \"a\", readPartitions: new HashSet<string> { \"a\", \"b\" })).V().Values<object>(\"name\")",
                             "g.WithStrategies(gremlingo.PartitionStrategy(gremlingo.PartitionStrategyConfig{PartitionKey: \"_partition\", WritePartition: \"a\", ReadPartitions: gremlingo.NewSimpleSet(\"a\", \"b\")})).V().Values(\"name\")",
                             "g.withStrategies(new PartitionStrategy(partitionKey:\"_partition\", writePartition:\"a\", readPartitions:[\"a\", \"b\"])).V().values(\"name\")",
-                            "g.withStrategies(PartitionStrategy.build().partitionKey(\"_partition\").writePartition(\"a\").readPartitions(new ArrayList<String>() {{ add(\"a\"); add(\"b\"); }}).create()).V().values(\"name\")",
+                            "g.withStrategies(PartitionStrategy.build().partitionKey(\"_partition\").writePartition(\"a\").readPartitions(new ArrayList<Object>() {{ add(\"a\"); add(\"b\"); }}).create()).V().values(\"name\")",
                             "g.withStrategies(new PartitionStrategy({partitionKey: \"_partition\", writePartition: \"a\", readPartitions: [\"a\", \"b\"]})).V().values(\"name\")",
                             "g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['a', 'b'])).V().values('name')"},
+                    {"g.withoutStrategies(ReadOnlyStrategy)",
+                            null,
+                            null,
+                            "g.WithoutStrategies(typeof(ReadOnlyStrategy))",
+                            "g.WithoutStrategies(ReadOnlyStrategy)", // go - needs TINKERPOP-3055
+                            null,
+                            "g.withoutStrategies(ReadOnlyStrategy.class)",
+                            "g.withoutStrategies(ReadOnlyStrategy)",  // javascript needs TINKERPOP-3055
+                            "g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy')])"},
+                    {"g.withoutStrategies(ReadOnlyStrategy, PathRetractionStrategy, FilterRankingStrategy)",
+                            null,
+                            null,
+                            "g.WithoutStrategies(typeof(ReadOnlyStrategy), typeof(PathRetractionStrategy), typeof(FilterRankingStrategy))",
+                            "g.WithoutStrategies(ReadOnlyStrategy, PathRetractionStrategy, FilterRankingStrategy)", // go - needs TINKERPOP-3055
+                            null,
+                            "g.withoutStrategies(ReadOnlyStrategy.class, PathRetractionStrategy.class, FilterRankingStrategy.class)",
+                            "g.withoutStrategies(ReadOnlyStrategy, PathRetractionStrategy, FilterRankingStrategy)",  // javascript - needs TINKERPOP-3055
+                            "g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy'), GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathRetractionStrategy'), GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.FilterRankingStrategy')])"},
                     {"g.inject(0..5)",
                             null,
                             "g.inject(number0..number1)",
@@ -991,6 +1009,24 @@ public class GremlinTranslatorTest {
                             null,
                             null,
                             null},
+                    {"g.mergeV([name:\"alice\", T.label:\"person\"]).option(Merge.onCreate, [age:Cardinality.single(81)])",
+                            null,
+                            "g.mergeV(map0).option(Merge.onCreate, map1)",
+                            "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.Single(81) }})",
+                            "g.MergeV(map[interface{}]interface{}{\"name\": \"alice\", gremlingo.T.Label: \"person\" }).Option(gremlingo.Merge.OnCreate, map[interface{}]interface{}{\"age\": gremlingo.CardinalityValue.Single(81) })",
+                            null,
+                            "g.mergeV(new LinkedHashMap<Object, Object>() {{ put(\"name\", \"alice\"); put(T.label, \"person\"); }}).option(Merge.onCreate, new LinkedHashMap<Object, Object>() {{ put(\"age\", Cardinality.single(81)); }})",
+                            "g.mergeV(new Map([[\"name\", \"alice\"], [T.label, \"person\"]])).option(Merge.onCreate, new Map([[\"age\", CardinalityValue.single(81)]]))",
+                            "g.merge_v({ 'name': 'alice', T.label: 'person' }).option(Merge.on_create, { 'age': CardinalityValue.single(81) })"},
+                    {"g.mergeV([name:\"alice\", (T.label):\"person\"]).option(Merge.onCreate, [age:Cardinality.single(81)])",
+                            null,
+                            "g.mergeV(map0).option(Merge.onCreate, map1)",
+                            "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.Single(81) }})",
+                            "g.MergeV(map[interface{}]interface{}{\"name\": \"alice\", gremlingo.T.Label: \"person\" }).Option(gremlingo.Merge.OnCreate, map[interface{}]interface{}{\"age\": gremlingo.CardinalityValue.Single(81) })",
+                            null,
+                            "g.mergeV(new LinkedHashMap<Object, Object>() {{ put(\"name\", \"alice\"); put(T.label, \"person\"); }}).option(Merge.onCreate, new LinkedHashMap<Object, Object>() {{ put(\"age\", Cardinality.single(81)); }})",
+                            "g.mergeV(new Map([[\"name\", \"alice\"], [T.label, \"person\"]])).option(Merge.onCreate, new Map([[\"age\", CardinalityValue.single(81)]]))",
+                            "g.merge_v({ 'name': 'alice', T.label: 'person' }).option(Merge.on_create, { 'age': CardinalityValue.single(81) })"},
                     {"g.V().toList()",
                             null,
                             null,
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
index b5dc75d49d..1ee5f5052f 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
@@ -197,6 +197,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_V_both_dedup_age_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Both().Dedup().By("age").Values<object>("name")}}, 
                {"g_VX1X_asXaX_both_asXbX_both_asXcX_dedupXa_bX_age_selectXa_b_cX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).As("a").Both().As("b").Both().As("c").Dedup("a", "b").By("age").Select<object>("a", "b", "c").By("name")}}, 
                {"g_VX1X_valuesXageX_dedupXlocalX_unfold", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Values<object>("age").Dedup(Scope.Local).Unfold<object>()}}, 
+               {"g_V_properties_dedup_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "josh").AddV("person").Property("name", "josh").AddV("person").Property("name", "josh"), (g,p) =>g.V().Properties<object>("name").Dedup().Count()}}, 
+               {"g_V_properties_dedup_byXvalueX_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "josh").AddV("person").Property("name", "josh").AddV("person").Property("name", "josh"), (g,p) =>g.V().Properties<object>("name").Dedup().By(T.Value).Count()}}, 
                {"g_V_count_discard", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Count().Discard()}}, 
                {"g_V_hasLabelXpersonX_discard", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Discard()}}, 
                {"g_VX1X_outXcreatedX_discard", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Out("created").Discard()}}, 
@@ -352,6 +354,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_V_asXaX_in_asXaX_in_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_limitXlocal_2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("a").In().As("a").In().As("a").Select<object>(Pop.Mixed, "a").By(__.Unfold<object>().Values<object>("name").Fold()).Limit<object>(Scope.Local, 2)}}, 
                {"g_V_hasLabelXpersonX_order_byXageX_valuesXnameX_skipX1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Order().By("age").Values<object>("name").Skip<object>(1)}}, 
                {"g_VX1X_valuesXageX_rangeXlocal_20_30X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Values<object>("age").Range<object>(Scope.Local, 20, 30)}}, 
+               {"g_V_mapXin_hasIdX1XX_limitX2X_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Map<object>(__.In().HasId(p["vid1"])).Limit<object>(2).Values<object>("name")}}, 
                {"g_E_sampleX1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.E().Sample(1)}}, 
                {"g_E_sampleX2X_byXweightX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.E().Sample(2).By("weight")}}, 
                {"g_V_localXoutE_sampleX1X_byXweightXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Local<object>(__.OutE().Sample(1).By("weight"))}}, 
@@ -406,23 +409,25 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_withStrategiesXProductiveByStrategyX_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new ProductiveByStrategy()).V(p["vid3"]).As("a").In().Out().As("b").Where("a", P.Eq("b")).By("age").Values<object>("name")}}, 
                {"g_V_asXnX_whereXorXhasLabelXsoftwareX_hasLabelXpersonXXX_selectXnX_byXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("n").Where(__.Or(__.HasLabel("software"), __.HasLabel("person"))).Select<object>("n").By("name")}}, 
                {"g_V_asXnX_whereXorXselectXnX_hasLabelXsoftwareX_selectXnX_hasLabelXpersonXXX_selectXnX_byXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("n").Where(__.Or(__.Select<object>("n").HasLabel("software"), __.Select<object>("n").HasLabel("person"))).Select<object>("n").By("name")}}, 
+               {"g_V_hasLabelXpersonX_asXxX_whereXinEXknowsX_count_isXgteX1XXX_selectXxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").As("x").Where(__.InE("knows").Count().Is(P.Gte(1))).Select<object>("x")}}, 
+               {"g_withoutStrategiesXCountStrategyX_V_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(CountStrategy)).V().Count()}}, 
                {"g_V_coworker", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Filter(__.OutE("created")).Aggregate("p").As("p1").Values<object>("name").As("p1n").Select<object>("p").Unfold<object>().Where(P.Neq("p1")).As("p2").Values<object>("name").As("p2n").Select<object>("p2").Out("created").Choose<object>(__.In("created").Where(P.Eq("p1")), __.Values<object>("name"), __.Constant<object>(p["xx1"])).Group<object, object> [...]
                {"g_V_coworker_with_midV", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Filter(__.OutE("created")).As("p1").V().HasLabel("person").Where(P.Neq("p1")).Filter(__.OutE("created")).As("p2").Map<object>(__.Out("created").Where(__.In("created").As("p1")).Values<object>("name").Fold()).Group<object, object>().By(__.Select<object>("p1").By("name")).By(__.Group<object, object>().By(__.Select<object>("p2").By("name") [...]
                {"g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").AddV("person").Property("_partition", "b").Property("name", "bob"), (g,p) =>g.WithStrategies(new PartitionStrategy(partitionKey: "_partition", writePartition: "a", readPartitions: new HashSet<string> { "a" })).V().Values<object>("name")}}, 
                {"g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").AddV("person").Property("_partition", "b").Property("name", "bob"), (g,p) =>g.WithStrategies(new PartitionStrategy(partitionKey: "_partition", writePartition: "a", readPartitions: new HashSet<string> { "a", "b" })).V().Values<object>("name")}}, 
                {"g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").AddV("person").Property("_partition", "b").Property("name", "bob"), (g,p) =>g.WithStrategies(new PartitionStrategy(partitionKey: "_partition", writePartition: "a", readPartitions: new HashSet<string> { "c" })).V().Values<object>("name")}}, 
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_bothE_weight", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2),  [...]
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_bothE_weight", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2),  [...]
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_bothE_dedup_weight", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weigh [...]
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_bothE_weight", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2),  [...]
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_both_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2), (g, [...]
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_both_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2), (g, [...]
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_both_dedup_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", [...]
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_both_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2), (g, [...]
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_out_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2), (g,p [...]
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_in_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2), (g,p) [...]
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_out_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2), (g [...]
-               {"g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_out_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2), (g,p [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_bothE_weight", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2 [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_bothE_weight", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2 [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_bothE_dedup_weight", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("we [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_bothE_weight", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2 [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_both_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0d [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_both_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0d [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_both_dedup_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weigh [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_both_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0d [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_out_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0d) [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_in_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0d), [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_out_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0 [...]
+               {"g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_out_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0d).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0d) [...]
                {"g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_addVXpersonX_propertyXname_aliceX_addXselfX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new PartitionStrategy(partitionKey: "_partition", writePartition: "a", readPartitions: new HashSet<string> { "a" })).AddV("person").Property("name", "alice").AddE("self"), (g,p) =>g.V().Has("person", "name", "alice").Has("_partition", "a"), (g,p) =>g.V(), (g,p) =>g.E().Has [...]
                {"g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_injectXzeroX_addVXpersonX_propertyXname_aliceX_addXselfX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new PartitionStrategy(partitionKey: "_partition", writePartition: "a", readPartitions: new HashSet<string> { "a" })).Inject<object>(0).AddV("person").Property("name", "alice").AddE("self"), (g,p) =>g.V().Has("person", "name", "alice").Has("_partition", "a"), ( [...]
                {"g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_mergeV", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new PartitionStrategy(partitionKey: "_partition", writePartition: "a", readPartitions: new HashSet<string> { "a" })).MergeV((IDictionary<object, object>) p["xx1"]), (g,p) =>g.V().Has("person", "name", "alice").Has("_partition", "a"), (g,p) =>g.V()}}, 
@@ -490,6 +495,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_withStrategiesXSubgraphStrategyXedges_hasLabelXusesX_hasXskill_5XXX_V_outE_valueMap_selectXvaluesX_unfold", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SubgraphStrategy(edges: __.HasLabel("uses").Has("skill", 5))).V().OutE().ValueMap<object, object>().Select<object>(Column.Values).Unfold<object>()}}, 
                {"g_withStrategiesXSubgraphStrategyXsubgraphDXX_V", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SubgraphStrategy(checkAdjacentVertices: false, vertices: __.Has("name", P.Within("josh", "lop", "ripple")), edges: __.Or(__.Has("weight", 0.4).HasLabel("created"), __.Has("weight", 1.0).HasLabel("created")))).V()}}, 
                {"g_withStrategiesXSubgraphStrategyXsubgraphDXX_E", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SubgraphStrategy(checkAdjacentVertices: false, vertices: __.Has("name", P.Within("josh", "lop", "ripple")), edges: __.Or(__.Has("weight", 0.4).HasLabel("created"), __.Has("weight", 1.0).HasLabel("created")))).E()}}, 
+               {"g_withStrategiesXSubgraphStrategyXcheckAdjacentVertices_subgraphDXX_E", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SubgraphStrategy(checkAdjacentVertices: true, vertices: __.Has("name", P.Within("josh", "lop", "ripple")), edges: __.Or(__.Has("weight", 0.4).HasLabel("created"), __.Has("weight", 1.0).HasLabel("created")))).E()}}, 
                {"g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_outE", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SubgraphStrategy(checkAdjacentVertices: false, vertices: __.Has("name", P.Within("josh", "lop", "ripple")), edges: __.Or(__.Has("weight", 0.4).HasLabel("created"), __.Has("weight", 1.0).HasLabel("created")))).V(p["vid4"]).OutE()}}, 
                {"g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_inE", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SubgraphStrategy(checkAdjacentVertices: false, vertices: __.Has("name", P.Within("josh", "lop", "ripple")), edges: __.Or(__.Has("weight", 0.4).HasLabel("created"), __.Has("weight", 1.0).HasLabel("created")))).V(p["vid4"]).InE()}}, 
                {"g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_out", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SubgraphStrategy(checkAdjacentVertices: false, vertices: __.Has("name", P.Within("josh", "lop", "ripple")), edges: __.Or(__.Has("weight", 0.4).HasLabel("created"), __.Has("weight", 1.0).HasLabel("created")))).V(p["vid4"]).Out()}}, 
@@ -500,6 +506,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX11X_bothV", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SubgraphStrategy(checkAdjacentVertices: false, vertices: __.Has("name", P.Within("josh", "lop", "ripple")), edges: __.Or(__.Has("weight", 0.4).HasLabel("created"), __.Has("weight", 1.0).HasLabel("created")))).E(p["eid11"]).BothV()}}, 
                {"g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX12X_bothV", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SubgraphStrategy(checkAdjacentVertices: false, vertices: __.Has("name", P.Within("josh", "lop", "ripple")), edges: __.Or(__.Has("weight", 0.4).HasLabel("created"), __.Has("weight", 1.0).HasLabel("created")))).E(p["eid12"]).BothV()}}, 
                {"g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX9X_bothV", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SubgraphStrategy(checkAdjacentVertices: false, vertices: __.Has("name", P.Within("josh", "lop", "ripple")), edges: __.Or(__.Has("weight", 0.4).HasLabel("created"), __.Has("weight", 1.0).HasLabel("created")))).E(p["eid9"]).BothV()}}, 
+               {"g_withStrategiesXSubgraphStrategyXcheckAdjacentVertices_subgraphDXX_EX9X_bothV", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SubgraphStrategy(checkAdjacentVertices: true, vertices: __.Has("name", P.Within("josh", "lop", "ripple")), edges: __.Or(__.Has("weight", 0.4).HasLabel("created"), __.Has("weight", 1.0).HasLabel("created")))).E(p["eid9"]).BothV()}}, 
                {"g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX", 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("lop").AddV("person").Property("name", "josh").Property("age", 32).As("josh").AddV("software").Property("name", "ripple") [...]
                {"g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X", 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("lop").AddV("person").Property("name", "josh").Property("age", 32).As("josh").AddV("software").Propert [...]
                {"g_V_outE_propertyXweight_nullX", 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("lop").AddV("person").Property("name", "josh").Property("age", 32).As("josh").AddV("software").Property("name", "ripple").Property("lang", [...]
@@ -540,6 +547,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_addVXpersonX_propertyXname_joshX_propertyXage_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "josh").Property("age", null), (g,p) =>g.V().Has("person", "age", (object) null)}}, 
                {"g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "marko").Property("friendWeight", null, "acl", null), (g,p) =>g.V().Has("person", "name", "marko").Has("friendWeight", (object) null), (g,p) =>g.V().Has("person", "name", "marko").Properties<object>("friendWeight").Has("acl", (object) null), (g,p) =>g.V().Has("person", "name", " [...]
                {"g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "alice").Property(Cardinality.Single, "age", 50), (g,p) =>g.V().Has("person", "name", "alice").Property("age", __.Union<object>(__.Values<object>("age"), __.Constant<object>(1)).Sum<object>()), (g,p) =>g.V().Has("person", "age", 50), (g,p) =>g.V().Has("person", "age", 51)}}, 
+               {"g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX", 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("lop").AddV("person").Property("name", "josh").Proper [...]
                {"g_injectXstrX_asDate", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>("2023-08-02T00:00:00Z").AsDate()}}, 
                {"g_injectX1694017707000X_asDate", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(1694017707000).AsDate()}}, 
                {"g_injectX1694017708000LX_asDate", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(p["xx1"]).AsDate()}}, 
@@ -651,6 +659,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_E_sampleX1X_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.E().Sample(1).Count()}}, 
                {"g_V_sampleX1X_byXageX_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Sample(1).By("age").Count()}}, 
                {"g_V_order_byXnoX_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Order().By("no").Count()}}, 
+               {"g_V_group_byXlabelX_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Group<object, object>().By(T.Label).Count()}}, 
+               {"g_V_group_byXlabelX_countXlocalX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Group<object, object>().By(T.Label).Count(Scope.Local)}}, 
                {"g_injectXdatetimeXstrXX_dateAddXDT_hour_2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(DateTimeOffset.FromUnixTimeMilliseconds(1690934400000)).DateAdd(DT.Hour, 2)}}, 
                {"g_injectXdatetimeXstrXX_dateAddXhour_2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(DateTimeOffset.FromUnixTimeMilliseconds(1690934400000)).DateAdd(DT.Hour, 2)}}, 
                {"g_injectXdatetimeXstrXX_dateAddXhour_1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(DateTimeOffset.FromUnixTimeMilliseconds(1690934400000)).DateAdd(DT.Hour, -1)}}, 
@@ -724,7 +734,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_injectX1X_asXageX_V_formatXstrX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(1).As("age").V().Format("%{name} is %{age} years old")}}, 
                {"g_V_formatXstrX_byXvaluesXnameXX_byXvaluesXageXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Format("%{_} is %{_} years old").By(__.Values<object>("name")).By(__.Values<object>("age"))}}, 
                {"g_V_hasLabelXpersonX_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Format("%{_} %{_} %{_}").By(__.Constant<object>("hello")).By(__.Values<object>("name"))}}, 
-               {"g_VX1X_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(1).Format("%{_}").By(__.Constant<object>("hello")).By(__.Values<object>("name"))}}, 
+               {"g_VX1X_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Format("%{_}").By(__.Constant<object>("hello")).By(__.Values<object>("name"))}}, 
                {"g_V_formatXstrX_byXbothE_countX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Format("%{name} has %{_} connections").By(__.BothE().Count())}}, 
                {"g_V_projectXname_countX_byXvaluesXnameXX_byXbothE_countX_formatXstrX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Project<object>("name", "count").By(__.Values<object>("name")).By(__.BothE().Count()).Format("%{name} has %{count} connections")}}, 
                {"g_V_elementMap_formatXstrX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().ElementMap<object>().Format("%{name} is %{age} years old")}}, 
@@ -907,7 +917,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko1_in_vadas1X_optionXonCreate_selectXcXX_optionXonMatch_selectXmXX", 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"), (g,p) =>g.WithSideEffect("c", p["xx2"]).WithSideEffect("m", p["xx3"]).MergeE((IDictionary<object, object>) p["xx1"]).Option(Merge.OnCre [...]
                {"g_mergeEXlabel_knows_out_marko_in_vadasX_aliased_direction", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "marko").AddV("person").Property("name", "vadas"), (g,p) =>g.MergeE((IDictionary<object, object>) p["xx1"]), (g,p) =>g.V().Has("person", "name", "marko").Out("knows").Has("person", "name", "vadas")}}, 
                {"g_injectXlabel_knows_out_marko_in_vadas_label_self_out_vadas_in_vadasX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "marko").AddV("person").Property("name", "vadas"), (g,p) =>g.Inject<object>(p["xx1"], p["xx2"]).MergeE(), (g,p) =>g.V(), (g,p) =>g.E(), (g,p) =>g.V().Has("person", "name", "marko").Out("knows").Has("person", "name", "vadas"), (g,p) =>g.V().Has("person", "name", "vadas").Out("self" [...]
-               {"g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko_in_vadasX_optionXonCreate_selectXcXX_optionXonMatch_sideEffectXpropertiesXweightX_dropX_selectXmXX_exists", 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.WithSideEffect("c", p["xx2"]). [...]
+               {"g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko_in_vadasX_optionXonCreate_selectXcXX_optionXonMatch_sideEffectXpropertiesXweightX_dropX_selectXmXX_exists", 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.0d).From("a").To("b"), (g,p) =>g.WithSideEffect("c", p["xx2" [...]
                {"g_mergeE_with_outVinV_options_map", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "marko").AddV("person").Property("name", "vadas"), (g,p) =>g.MergeE((IDictionary<object, object>) p["xx1"]).Option(Merge.OutV, (IDictionary<object, object>) p["xx2"]).Option(Merge.InV, (IDictionary<object, object>) p["xx3"]), (g,p) =>g.V(), (g,p) =>g.V().Has("name", "marko").Out("knows").Has("name", "vadas")}}, 
                {"g_mergeE_with_outVinV_options_select", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "marko").AddV("person").Property("name", "vadas"), (g,p) =>g.V(p["vid1"]).As("x").V(p["vid2"]).As("y").MergeE((IDictionary<object, object>) p["xx1"]).Option(Merge.OutV, (ITraversal) __.Select<object>("x")).Option(Merge.InV, (ITraversal) __.Select<object>("y")), (g,p) =>g.V(), (g,p) =>g.V().Has("name", "marko").Out [...]
                {"g_mergeE_with_eid_specified_and_inheritance_1", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "marko").AddV("person").Property("name", "vadas"), (g,p) =>g.MergeE((IDictionary<object, object>) p["xx1"]).Option(Merge.OnCreate, (IDictionary<object, object>) p["xx2"]), (g,p) =>g.V(), (g,p) =>g.E(), (g,p) =>g.E("201"), (g,p) =>g.V().Has("name", "marko").Out("knows").Has("name", "vadas")}}, 
@@ -919,6 +929,8 @@ 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_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_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)}}, 
                {"g_V_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.V().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)}}, 
                {"g_mergeVXnullX_optionXonCreate_label_null_name_markoX", 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>) p["xx1"])}}, 
@@ -974,6 +986,9 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_mergeVXname_markoX_optionXonMatch_age_33_singleX", 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((IDictionary<object, object>) new Dictionary<object, object> {{ "name", "marko" }}).Option(Merge.OnMatch, new Dictionary<object, object> {{ "age", 33 }}, Cardin [...]
                {"g_mergeVXname_markoX_optionXonMatch_name_allen_age_setX31X_singleX", 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((IDictionary<object, object>) new Dictionary<object, object> {{ "name", "marko" }}).Option(Merge.OnMatch, new Dictionary<object, object> {{ "nam [...]
                {"g_mergeVXname_markoX_optionXonMatch_name_allen_age_singleX31X_singleX", 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((IDictionary<object, object>) new Dictionary<object, object> {{ "name", "marko" }}).Option(Merge.OnMatch, new Dictionary<object, object> {{ " [...]
+               {"g_mergeVXname_aliceX_optionXonCreate_age_singleX81XX", 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.Single(81) }}), (g,p) =>g.V().Has("person", "name", "alice").Has("age", 81), (g,p) =>g.V().Has("person", " [...]
+               {"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_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>()}}, 
@@ -1423,6 +1438,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXvaluesXageX_isXgtX29XXX_capXxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new ProductiveByStrategy()).V().Aggregate("x").By(__.Values<object>("age").Is(P.Gt(29))).Cap<object>("x")}}, 
                {"g_V_aggregateXxX_byXout_order_byXnameXX_capXxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Aggregate("x").By(__.Out().Order().By("name")).Cap<object>("x")}}, 
                {"g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXout_order_byXnameXX_capXxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new ProductiveByStrategy()).V().Aggregate("x").By(__.Out().Order().By("name")).Cap<object>("x")}}, 
+               {"g_V_aggregateXaX_hasXperson_age_gteX30XXX_capXaX_unfold_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Aggregate("a").Has("person", "age", P.Gte(30)).Cap<object>("a").Unfold<object>().Values<object>("name")}}, 
                {"g_V_fail", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Fail()}}, 
                {"g_V_failXmsgX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Fail("msg")}}, 
                {"g_V_unionXout_failX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Union<object>(__.Out(), __.Fail())}}, 
diff --git a/gremlin-go/driver/cucumber/gremlin.go b/gremlin-go/driver/cucumber/gremlin.go
index c8d82a9b37..4d0c39f0e9 100644
--- a/gremlin-go/driver/cucumber/gremlin.go
+++ b/gremlin-go/driver/cucumber/gremlin.go
@@ -168,6 +168,8 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[
     "g_V_both_dedup_age_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Both().Dedup().By("age").Values("name")}}, 
     "g_VX1X_asXaX_both_asXbX_both_asXcX_dedupXa_bX_age_selectXa_b_cX_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid1"]).As("a").Both().As("b").Both().As("c").Dedup("a", "b").By("age").Select("a", "b", "c").By("name")}}, 
     "g_VX1X_valuesXageX_dedupXlocalX_unfold": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid1"]).Values("age").Dedup(gremlingo.Scope.Local).Unfold()}}, 
+    "g_V_properties_dedup_count": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("name", "josh").AddV("person").Property("name", "josh").AddV("person").Property("name", "josh")}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Properties("name").Dedup().Count()}}, 
+    "g_V_properties_dedup_byXvalueX_count": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("name", "josh").AddV("person").Property("name", "josh").AddV("person").Property("name", "josh")}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Properties("name").Dedup().By(gremlingo.T.Value).Count()}}, 
     "g_V_count_discard": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Count().Discard()}}, 
     "g_V_hasLabelXpersonX_discard": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().HasLabel("person").Discard()}}, 
     "g_VX1X_outXcreatedX_discard": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid1"]).Out("created").Discard()}}, 
@@ -323,6 +325,7 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[
     "g_V_asXaX_in_asXaX_in_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_limitXlocal_2X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().As("a").In().As("a").In().As("a").Select(gremlingo.Pop.Mixed, "a").By(gremlingo.T__.Unfold().Values("name").Fold()).Limit(gremlingo.Scope.Local, 2)}}, 
     "g_V_hasLabelXpersonX_order_byXageX_valuesXnameX_skipX1X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().HasLabel("person").Order().By("age").Values("name").Skip(1)}}, 
     "g_VX1X_valuesXageX_rangeXlocal_20_30X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid1"]).Values("age").Range(gremlingo.Scope.Local, 20, 30)}}, 
+    "g_V_mapXin_hasIdX1XX_limitX2X_valuesXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Map(gremlingo.T__.In().HasId(p["vid1"])).Limit(2).Values("name")}}, 
     "g_E_sampleX1X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.E().Sample(1)}}, 
     "g_E_sampleX2X_byXweightX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.E().Sample(2).By("weight")}}, 
     "g_V_localXoutE_sampleX1X_byXweightXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Local(gremlingo.T__.OutE().Sample(1).By("weight"))}}, 
@@ -377,23 +380,25 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[
     "g_withStrategiesXProductiveByStrategyX_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.ProductiveByStrategy()).V(p["vid3"]).As("a").In().Out().As("b").Where("a", gremlingo.P.Eq("b")).By("age").Values("name")}}, 
     "g_V_asXnX_whereXorXhasLabelXsoftwareX_hasLabelXpersonXXX_selectXnX_byXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().As("n").Where(gremlingo.T__.Or(gremlingo.T__.HasLabel("software"), gremlingo.T__.HasLabel("person"))).Select("n").By("name")}}, 
     "g_V_asXnX_whereXorXselectXnX_hasLabelXsoftwareX_selectXnX_hasLabelXpersonXXX_selectXnX_byXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().As("n").Where(gremlingo.T__.Or(gremlingo.T__.Select("n").HasLabel("software"), gremlingo.T__.Select("n").HasLabel("person"))).Select("n").By("name")}}, 
+    "g_V_hasLabelXpersonX_asXxX_whereXinEXknowsX_count_isXgteX1XXX_selectXxX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().HasLabel("person").As("x").Where(gremlingo.T__.InE("knows").Count().Is(gremlingo.P.Gte(1))).Select("x")}}, 
+  "g_withoutStrategiesXCountStrategyX_V_count": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(6)}}, 
     "g_V_coworker": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().HasLabel("person").Filter(gremlingo.T__.OutE("created")).Aggregate("p").As("p1").Values("name").As("p1n").Select("p").Unfold().Where(gremlingo.P.Neq("p1")).As("p2").Values("name").As("p2n").Select("p2").Out("created").Choose(gremlingo.T__.In("created").Where(gremlingo.P.Eq("p1")), gremlingo.T__.Values("name"), gremlingo.T__.Constant(p["xx1"])).Group().By(gremling [...]
     "g_V_coworker_with_midV": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().HasLabel("person").Filter(gremlingo.T__.OutE("created")).As("p1").V().HasLabel("person").Where(gremlingo.P.Neq("p1")).Filter(gremlingo.T__.OutE("created")).As("p2").Map(gremlingo.T__.Out("created").Where(gremlingo.T__.In("created").As("p1")).Values("name").Fold()).Group().By(gremlingo.T__.Select("p1").By("name")).By(gremlingo.T__.Group().By(gremlingo.T_ [...]
     "g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").AddV("person").Property("_partition", "b").Property("name", "bob")}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.PartitionStrategy(gremlingo.PartitionStrategyConfig{Partit [...]
     "g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").AddV("person").Property("_partition", "b").Property("name", "bob")}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.PartitionStrategy(gremlingo.PartitionStrategyConfig{Part [...]
     "g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").AddV("person").Property("_partition", "b").Property("name", "bob")}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.PartitionStrategy(gremlingo.PartitionStrategyConfig{Partit [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_bothE_weight": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2) [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_bothE_weight": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2) [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_bothE_dedup_weight": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("wei [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_bothE_weight": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2) [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_both_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2)},  [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_both_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2)},  [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_both_dedup_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_both_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2)},  [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_out_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2)}, f [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_in_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2)}, fu [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_out_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2)}, [...]
-    "g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_out_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2)}, f [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_bothE_weight": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight",  [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_bothE_weight": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight",  [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_bothE_dedup_weight": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("w [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_bothE_weight": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight",  [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_both_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0 [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_both_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0 [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_both_dedup_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weig [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_both_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0 [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_out_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0) [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_in_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0)} [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_out_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2. [...]
+    "g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_out_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", "a").Property("name", "alice").As("a").AddV("person").Property("_partition", "b").Property("name", "bob").As("b").AddE("knows").From("a").To("b").Property("_partition", "a").Property("weight", 1.0).AddE("knows").From("b").To("a").Property("_partition", "b").Property("weight", 2.0) [...]
     "g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_addVXpersonX_propertyXname_aliceX_addXselfX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.PartitionStrategy(gremlingo.PartitionStrategyConfig{PartitionKey: "_partition", WritePartition: "a", ReadPartitions: gremlingo.NewSimpleSet("a")})).AddV("person").Property("name", "alice").AddE("self")}, func(g *gremlingo.GraphTraversalSource, p map[string]inte [...]
     "g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_injectXzeroX_addVXpersonX_propertyXname_aliceX_addXselfX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.PartitionStrategy(gremlingo.PartitionStrategyConfig{PartitionKey: "_partition", WritePartition: "a", ReadPartitions: gremlingo.NewSimpleSet("a")})).Inject(0).AddV("person").Property("name", "alice").AddE("self")}, func(g *gremlingo.GraphTraversalSo [...]
     "g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_mergeV": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.PartitionStrategy(gremlingo.PartitionStrategyConfig{PartitionKey: "_partition", WritePartition: "a", ReadPartitions: gremlingo.NewSimpleSet("a")})).MergeV(p["xx1"])}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Has("person", "name", "al [...]
@@ -461,6 +466,7 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[
     "g_withStrategiesXSubgraphStrategyXedges_hasLabelXusesX_hasXskill_5XXX_V_outE_valueMap_selectXvaluesX_unfold": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.SubgraphStrategy(gremlingo.SubgraphStrategyConfig{Edges: gremlingo.T__.HasLabel("uses").Has("skill", 5)})).V().OutE().ValueMap().Select(gremlingo.Column.Values).Unfold()}}, 
     "g_withStrategiesXSubgraphStrategyXsubgraphDXX_V": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.SubgraphStrategy(gremlingo.SubgraphStrategyConfig{CheckAdjacentVertices: false, Vertices: gremlingo.T__.Has("name", gremlingo.P.Within("josh", "lop", "ripple")), Edges: gremlingo.T__.Or(gremlingo.T__.Has("weight", 0.4).HasLabel("created"), gremlingo.T__.Has("weight", 1.0).HasLabel("created"))})).V()}}, 
     "g_withStrategiesXSubgraphStrategyXsubgraphDXX_E": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.SubgraphStrategy(gremlingo.SubgraphStrategyConfig{CheckAdjacentVertices: false, Vertices: gremlingo.T__.Has("name", gremlingo.P.Within("josh", "lop", "ripple")), Edges: gremlingo.T__.Or(gremlingo.T__.Has("weight", 0.4).HasLabel("created"), gremlingo.T__.Has("weight", 1.0).HasLabel("created"))})).E()}}, 
+    "g_withStrategiesXSubgraphStrategyXcheckAdjacentVertices_subgraphDXX_E": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.SubgraphStrategy(gremlingo.SubgraphStrategyConfig{CheckAdjacentVertices: true, Vertices: gremlingo.T__.Has("name", gremlingo.P.Within("josh", "lop", "ripple")), Edges: gremlingo.T__.Or(gremlingo.T__.Has("weight", 0.4).HasLabel("created"), gremlingo.T__.Has("weight", 1.0).HasLabel("creat [...]
     "g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_outE": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.SubgraphStrategy(gremlingo.SubgraphStrategyConfig{CheckAdjacentVertices: false, Vertices: gremlingo.T__.Has("name", gremlingo.P.Within("josh", "lop", "ripple")), Edges: gremlingo.T__.Or(gremlingo.T__.Has("weight", 0.4).HasLabel("created"), gremlingo.T__.Has("weight", 1.0).HasLabel("created"))})).V(p[ [...]
     "g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_inE": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.SubgraphStrategy(gremlingo.SubgraphStrategyConfig{CheckAdjacentVertices: false, Vertices: gremlingo.T__.Has("name", gremlingo.P.Within("josh", "lop", "ripple")), Edges: gremlingo.T__.Or(gremlingo.T__.Has("weight", 0.4).HasLabel("created"), gremlingo.T__.Has("weight", 1.0).HasLabel("created"))})).V(p[" [...]
     "g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_out": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.SubgraphStrategy(gremlingo.SubgraphStrategyConfig{CheckAdjacentVertices: false, Vertices: gremlingo.T__.Has("name", gremlingo.P.Within("josh", "lop", "ripple")), Edges: gremlingo.T__.Or(gremlingo.T__.Has("weight", 0.4).HasLabel("created"), gremlingo.T__.Has("weight", 1.0).HasLabel("created"))})).V(p[" [...]
@@ -471,6 +477,7 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[
     "g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX11X_bothV": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.SubgraphStrategy(gremlingo.SubgraphStrategyConfig{CheckAdjacentVertices: false, Vertices: gremlingo.T__.Has("name", gremlingo.P.Within("josh", "lop", "ripple")), Edges: gremlingo.T__.Or(gremlingo.T__.Has("weight", 0.4).HasLabel("created"), gremlingo.T__.Has("weight", 1.0).HasLabel("created"))})).E( [...]
     "g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX12X_bothV": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.SubgraphStrategy(gremlingo.SubgraphStrategyConfig{CheckAdjacentVertices: false, Vertices: gremlingo.T__.Has("name", gremlingo.P.Within("josh", "lop", "ripple")), Edges: gremlingo.T__.Or(gremlingo.T__.Has("weight", 0.4).HasLabel("created"), gremlingo.T__.Has("weight", 1.0).HasLabel("created"))})).E( [...]
     "g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX9X_bothV": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.SubgraphStrategy(gremlingo.SubgraphStrategyConfig{CheckAdjacentVertices: false, Vertices: gremlingo.T__.Has("name", gremlingo.P.Within("josh", "lop", "ripple")), Edges: gremlingo.T__.Or(gremlingo.T__.Has("weight", 0.4).HasLabel("created"), gremlingo.T__.Has("weight", 1.0).HasLabel("created"))})).E(p [...]
+    "g_withStrategiesXSubgraphStrategyXcheckAdjacentVertices_subgraphDXX_EX9X_bothV": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.SubgraphStrategy(gremlingo.SubgraphStrategyConfig{CheckAdjacentVertices: true, Vertices: gremlingo.T__.Has("name", gremlingo.P.Within("josh", "lop", "ripple")), Edges: gremlingo.T__.Or(gremlingo.T__.Has("weight", 0.4).HasLabel("created"), gremlingo.T__.Has("weight", 1.0).HasLab [...]
     "g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX": {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").As("lop").AddV("person").Property("name", "josh").Property("age", 32).As("josh").AddV("software").Property("name", "ripple [...]
     "g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X": {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").As("lop").AddV("person").Property("name", "josh").Property("age", 32).As("josh").AddV("software").Prope [...]
     "g_V_outE_propertyXweight_nullX": {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").As("lop").AddV("person").Property("name", "josh").Property("age", 32).As("josh").AddV("software").Property("name", "ripple").Property("lang [...]
@@ -511,6 +518,7 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[
     "g_addVXpersonX_propertyXname_joshX_propertyXage_nullX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("name", "josh").Property("age", nil)}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Has("person", "age", nil)}}, 
     "g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("name", "marko").Property("friendWeight", nil, "acl", nil)}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Has("person", "name", "marko").Has("friendWeight", nil)}, func(g *gremlingo.GraphTraversalSource, p map[string]interfa [...]
     "g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("name", "alice").Property(gremlingo.Cardinality.Single, "age", 50)}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Has("person", "name", "alice").Property("age", gremlingo.T__.Union(gremlingo.T__.Values("age"), gremlingo.T_ [...]
+    "g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX": {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").As("lop").AddV("person").Property("name", "josh").Prop [...]
     "g_injectXstrX_asDate": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject("2023-08-02T00:00:00Z").AsDate()}}, 
     "g_injectX1694017707000X_asDate": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(1694017707000).AsDate()}}, 
     "g_injectX1694017708000LX_asDate": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(p["xx1"]).AsDate()}}, 
@@ -622,6 +630,8 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[
     "g_E_sampleX1X_count": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.E().Sample(1).Count()}}, 
     "g_V_sampleX1X_byXageX_count": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Sample(1).By("age").Count()}}, 
     "g_V_order_byXnoX_count": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Order().By("no").Count()}}, 
+    "g_V_group_byXlabelX_count": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Group().By(gremlingo.T.Label).Count()}}, 
+    "g_V_group_byXlabelX_countXlocalX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Group().By(gremlingo.T.Label).Count(gremlingo.Scope.Local)}}, 
     "g_injectXdatetimeXstrXX_dateAddXDT_hour_2X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(time.UnixMilli(1690934400000)).DateAdd(gremlingo.DT.Hour, 2)}}, 
     "g_injectXdatetimeXstrXX_dateAddXhour_2X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(time.UnixMilli(1690934400000)).DateAdd(gremlingo.DT.Hour, 2)}}, 
     "g_injectXdatetimeXstrXX_dateAddXhour_1X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(time.UnixMilli(1690934400000)).DateAdd(gremlingo.DT.Hour, -1)}}, 
@@ -695,7 +705,7 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[
     "g_injectX1X_asXageX_V_formatXstrX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(1).As("age").V().Format("%{name} is %{age} years old")}}, 
     "g_V_formatXstrX_byXvaluesXnameXX_byXvaluesXageXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Format("%{_} is %{_} years old").By(gremlingo.T__.Values("name")).By(gremlingo.T__.Values("age"))}}, 
     "g_V_hasLabelXpersonX_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().HasLabel("person").Format("%{_} %{_} %{_}").By(gremlingo.T__.Constant("hello")).By(gremlingo.T__.Values("name"))}}, 
-    "g_VX1X_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(1).Format("%{_}").By(gremlingo.T__.Constant("hello")).By(gremlingo.T__.Values("name"))}}, 
+    "g_VX1X_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid1"]).Format("%{_}").By(gremlingo.T__.Constant("hello")).By(gremlingo.T__.Values("name"))}}, 
     "g_V_formatXstrX_byXbothE_countX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Format("%{name} has %{_} connections").By(gremlingo.T__.BothE().Count())}}, 
     "g_V_projectXname_countX_byXvaluesXnameXX_byXbothE_countX_formatXstrX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Project("name", "count").By(gremlingo.T__.Values("name")).By(gremlingo.T__.BothE().Count()).Format("%{name} has %{count} connections")}}, 
     "g_V_elementMap_formatXstrX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().ElementMap().Format("%{name} is %{age} years old")}}, 
@@ -878,7 +888,7 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[
     "g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko1_in_vadas1X_optionXonCreate_selectXcXX_optionXonMatch_selectXmXX": {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")}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithSideEffect("c", p["xx2"]). [...]
     "g_mergeEXlabel_knows_out_marko_in_vadasX_aliased_direction": {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.MergeE(p["xx1"])}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Has("person" [...]
     "g_injectXlabel_knows_out_marko_in_vadas_label_self_out_vadas_in_vadasX": {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.Inject(p["xx1"], p["xx2"]).MergeE()}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTrave [...]
-    "g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko_in_vadasX_optionXonCreate_selectXcXX_optionXonMatch_sideEffectXpropertiesXweightX_dropX_selectXmXX_exists": {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.GraphTraversalSourc [...]
+    "g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko_in_vadasX_optionXonCreate_selectXcXX_optionXonMatch_sideEffectXpropertiesXweightX_dropX_selectXmXX_exists": {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.0).From("a").To("b")}, func(g *gremlingo.GraphTraversalSou [...]
     "g_mergeE_with_outVinV_options_map": {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.MergeE(p["xx1"]).Option(gremlingo.Merge.OutV, p["xx2"]).Option(gremlingo.Merge.InV, p["xx3"])}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{})  [...]
     "g_mergeE_with_outVinV_options_select": {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.V(p["vid1"]).As("x").V(p["vid2"]).As("y").MergeE(p["xx1"]).Option(gremlingo.Merge.OutV, gremlingo.T__.Select("x")).Option(gremlingo.Merge.InV, gremlingo.T__.Se [...]
     "g_mergeE_with_eid_specified_and_inheritance_1": {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.MergeE(p["xx1"]).Option(gremlingo.Merge.OnCreate, p["xx2"])}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraver [...]
@@ -890,6 +900,8 @@ 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_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_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. [...]
     "g_V_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.V().MergeV(map[interface{}]interface{}{ }).Option(gremlingo.Merge.OnMatch, nil)}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {ret [...]
     "g_mergeVXnullX_optionXonCreate_label_null_name_markoX": {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(p["xx1"])}}, 
@@ -945,6 +957,9 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[
     "g_mergeVXname_markoX_optionXonMatch_age_33_singleX": {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]interface{}) *gremlingo.GraphTraversal {return g.MergeV(map[interface{}]interface{}{"name": [...]
     "g_mergeVXname_markoX_optionXonMatch_name_allen_age_setX31X_singleX": {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]interface{}) *gremlingo.GraphTraversal {return g.MergeV(map[interface{}]int [...]
     "g_mergeVXname_markoX_optionXonMatch_name_allen_age_singleX31X_singleX": {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]interface{}) *gremlingo.GraphTraversal {return g.MergeV(map[interface{}] [...]
+    "g_mergeVXname_aliceX_optionXonCreate_age_singleX81XX": {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.Single(81) })}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Has("person", "name", "alice" [...]
+    "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_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()}}, 
@@ -1394,6 +1409,7 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[
     "g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXvaluesXageX_isXgtX29XXX_capXxX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.ProductiveByStrategy()).V().Aggregate("x").By(gremlingo.T__.Values("age").Is(gremlingo.P.Gt(29))).Cap("x")}}, 
     "g_V_aggregateXxX_byXout_order_byXnameXX_capXxX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Aggregate("x").By(gremlingo.T__.Out().Order().By("name")).Cap("x")}}, 
     "g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXout_order_byXnameXX_capXxX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.WithStrategies(gremlingo.ProductiveByStrategy()).V().Aggregate("x").By(gremlingo.T__.Out().Order().By("name")).Cap("x")}}, 
+    "g_V_aggregateXaX_hasXperson_age_gteX30XXX_capXaX_unfold_valuesXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Aggregate("a").Has("person", "age", gremlingo.P.Gte(30)).Cap("a").Unfold().Values("name")}}, 
     "g_V_fail": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Fail()}}, 
     "g_V_failXmsgX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Fail("msg")}}, 
     "g_V_unionXout_failX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Union(gremlingo.T__.Out(), gremlingo.T__.Fail())}}, 
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 ba4ff746a8..36f2633d18 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
@@ -189,6 +189,8 @@ const gremlins = {
     g_V_both_dedup_age_name: [function({g}) { return g.V().both().dedup().by("age").values("name") }], 
     g_VX1X_asXaX_both_asXbX_both_asXcX_dedupXa_bX_age_selectXa_b_cX_name: [function({g, vid1}) { return g.V(vid1).as("a").both().as("b").both().as("c").dedup("a", "b").by("age").select("a", "b", "c").by("name") }], 
     g_VX1X_valuesXageX_dedupXlocalX_unfold: [function({g, vid1}) { return g.V(vid1).values("age").dedup(Scope.local).unfold() }], 
+    g_V_properties_dedup_count: [function({g}) { return g.addV("person").property("name", "josh").addV("person").property("name", "josh").addV("person").property("name", "josh") }, function({g}) { return g.V().properties("name").dedup().count() }], 
+    g_V_properties_dedup_byXvalueX_count: [function({g}) { return g.addV("person").property("name", "josh").addV("person").property("name", "josh").addV("person").property("name", "josh") }, function({g}) { return g.V().properties("name").dedup().by(T.value).count() }], 
     g_V_count_discard: [function({g}) { return g.V().count().discard() }], 
     g_V_hasLabelXpersonX_discard: [function({g}) { return g.V().hasLabel("person").discard() }], 
     g_VX1X_outXcreatedX_discard: [function({g, vid1}) { return g.V(vid1).out("created").discard() }], 
@@ -344,6 +346,7 @@ const gremlins = {
     g_V_asXaX_in_asXaX_in_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_limitXlocal_2X: [function({g}) { return g.V().as("a").in_().as("a").in_().as("a").select(Pop.mixed, "a").by(__.unfold().values("name").fold()).limit(Scope.local, 2) }], 
     g_V_hasLabelXpersonX_order_byXageX_valuesXnameX_skipX1X: [function({g}) { return g.V().hasLabel("person").order().by("age").values("name").skip(1) }], 
     g_VX1X_valuesXageX_rangeXlocal_20_30X: [function({g, vid1}) { return g.V(vid1).values("age").range(Scope.local, 20, 30) }], 
+    g_V_mapXin_hasIdX1XX_limitX2X_valuesXnameX: [function({g, vid1}) { return g.V().map(__.in_().hasId(vid1)).limit(2).values("name") }], 
     g_E_sampleX1X: [function({g}) { return g.E().sample(1) }], 
     g_E_sampleX2X_byXweightX: [function({g}) { return g.E().sample(2).by("weight") }], 
     g_V_localXoutE_sampleX1X_byXweightXX: [function({g}) { return g.V().local(__.outE().sample(1).by("weight")) }], 
@@ -398,23 +401,25 @@ const gremlins = {
     g_withStrategiesXProductiveByStrategyX_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name: [function({g, vid3}) { return g.withStrategies(new ProductiveByStrategy()).V(vid3).as("a").in_().out().as("b").where("a", P.eq("b")).by("age").values("name") }], 
     g_V_asXnX_whereXorXhasLabelXsoftwareX_hasLabelXpersonXXX_selectXnX_byXnameX: [function({g}) { return g.V().as("n").where(__.or(__.hasLabel("software"), __.hasLabel("person"))).select("n").by("name") }], 
     g_V_asXnX_whereXorXselectXnX_hasLabelXsoftwareX_selectXnX_hasLabelXpersonXXX_selectXnX_byXnameX: [function({g}) { return g.V().as("n").where(__.or(__.select("n").hasLabel("software"), __.select("n").hasLabel("person"))).select("n").by("name") }], 
+    g_V_hasLabelXpersonX_asXxX_whereXinEXknowsX_count_isXgteX1XXX_selectXxX: [function({g}) { return g.V().hasLabel("person").as("x").where(__.inE("knows").count().is(P.gte(1))).select("x") }], 
+    g_withoutStrategiesXCountStrategyX_V_count: [function({g}) { return g.withoutStrategies(CountStrategy).V().count() }], 
     g_V_coworker: [function({g, xx1}) { return g.V().hasLabel("person").filter(__.outE("created")).aggregate("p").as("p1").values("name").as("p1n").select("p").unfold().where(P.neq("p1")).as("p2").values("name").as("p2n").select("p2").out("created").choose(__.in_("created").where(P.eq("p1")), __.values("name"), __.constant(xx1)).group().by(__.select("p1n")).by(__.group().by(__.select("p2n")).by(__.unfold().fold().project("numCoCreated", "coCreated").by(__.count(Scope.local)).by())).unfol [...]
     g_V_coworker_with_midV: [function({g}) { return g.V().hasLabel("person").filter(__.outE("created")).as("p1").V().hasLabel("person").where(P.neq("p1")).filter(__.outE("created")).as("p2").map(__.out("created").where(__.in_("created").as("p1")).values("name").fold()).group().by(__.select("p1").by("name")).by(__.group().by(__.select("p2").by("name")).by(__.project("numCoCreated", "coCreated").by(__.count(Scope.local)).by())).unfold() }], 
     g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").addV("person").property("_partition", "b").property("name", "bob") }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey: "_partition", writePartition: "a", readPartitions: ["a"]})).V().values("name") }], 
     g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").addV("person").property("_partition", "b").property("name", "bob") }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey: "_partition", writePartition: "a", readPartitions: ["a", "b"]})).V().values("name") }], 
     g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").addV("person").property("_partition", "b").property("name", "bob") }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey: "_partition", writePartition: "a", readPartitions: ["c"]})).V().values("name") }], 
-    g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_bothE_weight: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionK [...]
-    g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_bothE_weight: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionK [...]
-    g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_bothE_dedup_weight: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({pa [...]
-    g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_bothE_weight: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionK [...]
-    g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_both_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey: [...]
-    g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_both_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey: [...]
-    g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_both_dedup_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({parti [...]
-    g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_both_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey: [...]
-    g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_out_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey:  [...]
-    g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_in_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey: " [...]
-    g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_out_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey [...]
-    g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_out_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey:  [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_bothE_weight: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy({partit [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_bothE_weight: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy({partit [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_bothE_dedup_weight: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_bothE_weight: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy({partit [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_both_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy({partition [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_both_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy({partition [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_both_dedup_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy({p [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_both_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy({partition [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_out_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionK [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_in_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionKe [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_out_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitio [...]
+    g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_out_name: [function({g}) { return g.addV("person").property("_partition", "a").property("name", "alice").as("a").addV("person").property("_partition", "b").property("name", "bob").as("b").addE("knows").from_("a").to("b").property("_partition", "a").property("weight", 1.0).addE("knows").from_("b").to("a").property("_partition", "b").property("weight", 2.0) }, function({g}) { return g.withStrategies(new PartitionStrategy({partitionK [...]
     g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_addVXpersonX_propertyXname_aliceX_addXselfX: [function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey: "_partition", writePartition: "a", readPartitions: ["a"]})).addV("person").property("name", "alice").addE("self") }, function({g}) { return g.V().has("person", "name", "alice").has("_partition", "a") }, function({g}) { return g.V() }, function({g}) { return g.E().has("_partition", "a") }, function({g}) { return  [...]
     g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_injectXzeroX_addVXpersonX_propertyXname_aliceX_addXselfX: [function({g}) { return g.withStrategies(new PartitionStrategy({partitionKey: "_partition", writePartition: "a", readPartitions: ["a"]})).inject(0).addV("person").property("name", "alice").addE("self") }, function({g}) { return g.V().has("person", "name", "alice").has("_partition", "a") }, function({g}) { return g.V() }, function({g}) { return g.E().has("_partition", "a") },  [...]
     g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_mergeV: [function({g, xx1}) { return g.withStrategies(new PartitionStrategy({partitionKey: "_partition", writePartition: "a", readPartitions: ["a"]})).mergeV(xx1) }, function({g, xx1}) { return g.V().has("person", "name", "alice").has("_partition", "a") }, function({g, xx1}) { return g.V() }], 
@@ -482,6 +487,7 @@ const gremlins = {
     g_withStrategiesXSubgraphStrategyXedges_hasLabelXusesX_hasXskill_5XXX_V_outE_valueMap_selectXvaluesX_unfold: [function({g}) { return g.withStrategies(new SubgraphStrategy({edges: __.hasLabel("uses").has("skill", 5)})).V().outE().valueMap().select(Column.values).unfold() }], 
     g_withStrategiesXSubgraphStrategyXsubgraphDXX_V: [function({g}) { return g.withStrategies(new SubgraphStrategy({checkAdjacentVertices: false, vertices: __.has("name", P.within("josh", "lop", "ripple")), edges: __.or(__.has("weight", 0.4).hasLabel("created"), __.has("weight", 1.0).hasLabel("created"))})).V() }], 
     g_withStrategiesXSubgraphStrategyXsubgraphDXX_E: [function({g}) { return g.withStrategies(new SubgraphStrategy({checkAdjacentVertices: false, vertices: __.has("name", P.within("josh", "lop", "ripple")), edges: __.or(__.has("weight", 0.4).hasLabel("created"), __.has("weight", 1.0).hasLabel("created"))})).E() }], 
+    g_withStrategiesXSubgraphStrategyXcheckAdjacentVertices_subgraphDXX_E: [function({g}) { return g.withStrategies(new SubgraphStrategy({checkAdjacentVertices: true, vertices: __.has("name", P.within("josh", "lop", "ripple")), edges: __.or(__.has("weight", 0.4).hasLabel("created"), __.has("weight", 1.0).hasLabel("created"))})).E() }], 
     g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_outE: [function({g, vid4}) { return g.withStrategies(new SubgraphStrategy({checkAdjacentVertices: false, vertices: __.has("name", P.within("josh", "lop", "ripple")), edges: __.or(__.has("weight", 0.4).hasLabel("created"), __.has("weight", 1.0).hasLabel("created"))})).V(vid4).outE() }], 
     g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_inE: [function({g, vid4}) { return g.withStrategies(new SubgraphStrategy({checkAdjacentVertices: false, vertices: __.has("name", P.within("josh", "lop", "ripple")), edges: __.or(__.has("weight", 0.4).hasLabel("created"), __.has("weight", 1.0).hasLabel("created"))})).V(vid4).inE() }], 
     g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_out: [function({g, vid4}) { return g.withStrategies(new SubgraphStrategy({checkAdjacentVertices: false, vertices: __.has("name", P.within("josh", "lop", "ripple")), edges: __.or(__.has("weight", 0.4).hasLabel("created"), __.has("weight", 1.0).hasLabel("created"))})).V(vid4).out() }], 
@@ -492,6 +498,7 @@ const gremlins = {
     g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX11X_bothV: [function({g, eid11}) { return g.withStrategies(new SubgraphStrategy({checkAdjacentVertices: false, vertices: __.has("name", P.within("josh", "lop", "ripple")), edges: __.or(__.has("weight", 0.4).hasLabel("created"), __.has("weight", 1.0).hasLabel("created"))})).E(eid11).bothV() }], 
     g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX12X_bothV: [function({g, eid12}) { return g.withStrategies(new SubgraphStrategy({checkAdjacentVertices: false, vertices: __.has("name", P.within("josh", "lop", "ripple")), edges: __.or(__.has("weight", 0.4).hasLabel("created"), __.has("weight", 1.0).hasLabel("created"))})).E(eid12).bothV() }], 
     g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX9X_bothV: [function({g, eid9}) { return g.withStrategies(new SubgraphStrategy({checkAdjacentVertices: false, vertices: __.has("name", P.within("josh", "lop", "ripple")), edges: __.or(__.has("weight", 0.4).hasLabel("created"), __.has("weight", 1.0).hasLabel("created"))})).E(eid9).bothV() }], 
+    g_withStrategiesXSubgraphStrategyXcheckAdjacentVertices_subgraphDXX_EX9X_bothV: [function({g, eid9}) { return g.withStrategies(new SubgraphStrategy({checkAdjacentVertices: true, vertices: __.has("name", P.within("josh", "lop", "ripple")), edges: __.or(__.has("weight", 0.4).hasLabel("created"), __.has("weight", 1.0).hasLabel("created"))})).E(eid9).bothV() }], 
     g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX: [function({g, vid1}) { 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").addV("software").property("name", "ripple").property("lang", "java").as("ripple").addV("person").property("name",  [...]
     g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X: [function({g, vid1}) { 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").addV("software").property("name", "ripple").property("lang", "java").as("ripple").addV("person" [...]
     g_V_outE_propertyXweight_nullX: [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").addV("software").property("name", "ripple").property("lang", "java").as("ripple").addV("person").property("name", "peter").property("age" [...]
@@ -532,6 +539,7 @@ const gremlins = {
     g_addVXpersonX_propertyXname_joshX_propertyXage_nullX: [function({g}) { return g.addV("person").property("name", "josh").property("age", null) }, function({g}) { return g.V().has("person", "age", null) }], 
     g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX: [function({g}) { return g.addV("person").property("name", "marko").property("friendWeight", null, "acl", null) }, function({g}) { return g.V().has("person", "name", "marko").has("friendWeight", null) }, function({g}) { return g.V().has("person", "name", "marko").properties("friendWeight").has("acl", null) }, function({g}) { return g.V().has("person", "name", "marko").properties("friendWeight").count() }], 
     g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX: [function({g}) { return g.addV("person").property("name", "alice").property(Cardinality.single, "age", 50) }, function({g}) { return g.V().has("person", "name", "alice").property("age", __.union(__.values("age"), __.constant(1)).sum()) }, function({g}) { return g.V().has("person", "age", 50) }, function({g}) { return g.V().has("person", "age", 51) }], 
+    g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX: [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").addV("software").property("name", "ripple").property [...]
     g_injectXstrX_asDate: [function({g}) { return g.inject("2023-08-02T00:00:00Z").asDate() }], 
     g_injectX1694017707000X_asDate: [function({g}) { return g.inject(1694017707000).asDate() }], 
     g_injectX1694017708000LX_asDate: [function({g, xx1}) { return g.inject(xx1).asDate() }], 
@@ -643,6 +651,8 @@ const gremlins = {
     g_E_sampleX1X_count: [function({g}) { return g.E().sample(1).count() }], 
     g_V_sampleX1X_byXageX_count: [function({g}) { return g.V().sample(1).by("age").count() }], 
     g_V_order_byXnoX_count: [function({g}) { return g.V().order().by("no").count() }], 
+    g_V_group_byXlabelX_count: [function({g}) { return g.V().group().by(T.label).count() }], 
+    g_V_group_byXlabelX_countXlocalX: [function({g}) { return g.V().group().by(T.label).count(Scope.local) }], 
     g_injectXdatetimeXstrXX_dateAddXDT_hour_2X: [function({g}) { return g.inject(new Date(1690934400000)).dateAdd(DT.hour, 2) }], 
     g_injectXdatetimeXstrXX_dateAddXhour_2X: [function({g}) { return g.inject(new Date(1690934400000)).dateAdd(DT.hour, 2) }], 
     g_injectXdatetimeXstrXX_dateAddXhour_1X: [function({g}) { return g.inject(new Date(1690934400000)).dateAdd(DT.hour, -1) }], 
@@ -716,7 +726,7 @@ const gremlins = {
     g_injectX1X_asXageX_V_formatXstrX: [function({g}) { return g.inject(1).as("age").V().format("%{name} is %{age} years old") }], 
     g_V_formatXstrX_byXvaluesXnameXX_byXvaluesXageXX: [function({g}) { return g.V().format("%{_} is %{_} years old").by(__.values("name")).by(__.values("age")) }], 
     g_V_hasLabelXpersonX_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX: [function({g}) { return g.V().hasLabel("person").format("%{_} %{_} %{_}").by(__.constant("hello")).by(__.values("name")) }], 
-    g_VX1X_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX: [function({g}) { return g.V(1).format("%{_}").by(__.constant("hello")).by(__.values("name")) }], 
+    g_VX1X_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX: [function({g, vid1}) { return g.V(vid1).format("%{_}").by(__.constant("hello")).by(__.values("name")) }], 
     g_V_formatXstrX_byXbothE_countX: [function({g}) { return g.V().format("%{name} has %{_} connections").by(__.bothE().count()) }], 
     g_V_projectXname_countX_byXvaluesXnameXX_byXbothE_countX_formatXstrX: [function({g}) { return g.V().project("name", "count").by(__.values("name")).by(__.bothE().count()).format("%{name} has %{count} connections") }], 
     g_V_elementMap_formatXstrX: [function({g}) { return g.V().elementMap().format("%{name} is %{age} years old") }], 
@@ -899,7 +909,7 @@ const gremlins = {
     g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko1_in_vadas1X_optionXonCreate_selectXcXX_optionXonMatch_selectXmXX: [function({g, xx1, xx3, xx2}) { return g.addV("person").property("name", "marko").as("a").addV("person").property("name", "vadas").as("b") }, function({g, xx1, xx3, xx2}) { return g.withSideEffect("c", xx2).withSideEffect("m", xx3).mergeE(xx1).option(Merge.onCreate, __.select("c")).option(Merge.onMatch, __.select("m")) }, function({g,  [...]
     g_mergeEXlabel_knows_out_marko_in_vadasX_aliased_direction: [function({g, xx1}) { return g.addV("person").property("name", "marko").addV("person").property("name", "vadas") }, function({g, xx1}) { return g.mergeE(xx1) }, function({g, xx1}) { return g.V().has("person", "name", "marko").out("knows").has("person", "name", "vadas") }], 
     g_injectXlabel_knows_out_marko_in_vadas_label_self_out_vadas_in_vadasX: [function({g, xx1, xx2}) { return g.addV("person").property("name", "marko").addV("person").property("name", "vadas") }, function({g, xx1, xx2}) { return g.inject(xx1, xx2).mergeE() }, function({g, xx1, xx2}) { return g.V() }, function({g, xx1, xx2}) { return g.E() }, function({g, xx1, xx2}) { return g.V().has("person", "name", "marko").out("knows").has("person", "name", "vadas") }, function({g, xx1, xx2}) { retu [...]
-    g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko_in_vadasX_optionXonCreate_selectXcXX_optionXonMatch_sideEffectXpropertiesXweightX_dropX_selectXmXX_exists: [function({g, xx1, xx3, xx2}) { 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, xx3, xx2}) { return g.withSideEffect("c", xx2).withSideEffect("m", xx3).mergeE(xx [...]
+    g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko_in_vadasX_optionXonCreate_selectXcXX_optionXonMatch_sideEffectXpropertiesXweightX_dropX_selectXmXX_exists: [function({g, xx1, xx3, xx2}) { return g.addV("person").property("name", "marko").as("a").addV("person").property("name", "vadas").as("b").addE("knows").property("weight", 1.0).from_("a").to("b") }, function({g, xx1, xx3, xx2}) { return g.withSideEffect("c", xx2).withSideEffect("m", xx3).mergeE( [...]
     g_mergeE_with_outVinV_options_map: [function({g, xx1, xx3, xx2}) { return g.addV("person").property("name", "marko").addV("person").property("name", "vadas") }, function({g, xx1, xx3, xx2}) { return g.mergeE(xx1).option(Merge.outV, xx2).option(Merge.inV, xx3) }, function({g, xx1, xx3, xx2}) { return g.V() }, function({g, xx1, xx3, xx2}) { return g.V().has("name", "marko").out("knows").has("name", "vadas") }], 
     g_mergeE_with_outVinV_options_select: [function({g, xx1, vid2, vid1}) { return g.addV("person").property("name", "marko").addV("person").property("name", "vadas") }, function({g, xx1, vid2, vid1}) { return g.V(vid1).as("x").V(vid2).as("y").mergeE(xx1).option(Merge.outV, __.select("x")).option(Merge.inV, __.select("y")) }, function({g, xx1, vid2, vid1}) { return g.V() }, function({g, xx1, vid2, vid1}) { return g.V().has("name", "marko").out("knows").has("name", "vadas") }], 
     g_mergeE_with_eid_specified_and_inheritance_1: [function({g, xx1, xx2}) { return g.addV("person").property("name", "marko").addV("person").property("name", "vadas") }, function({g, xx1, xx2}) { return g.mergeE(xx1).option(Merge.onCreate, xx2) }, function({g, xx1, xx2}) { return g.V() }, function({g, xx1, xx2}) { return g.E() }, function({g, xx1, xx2}) { return g.E("201") }, function({g, xx1, xx2}) { return g.V().has("name", "marko").out("knows").has("name", "vadas") }], 
@@ -911,6 +921,8 @@ 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([]))) }, 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_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) }], 
     g_V_mergeVXemptyX_optionXonMatch_nullX: [function({g}) { return g.addV("person").property("name", "marko").property("age", 29) }, function({g}) { return g.V().mergeV(new Map([])).option(Merge.onMatch, null) }, function({g}) { return g.V().has("person", "name", "marko").has("age", 29) }], 
     g_mergeVXnullX_optionXonCreate_label_null_name_markoX: [function({g, xx1}) { return g.addV("person").property("name", "marko").property("age", 29) }, function({g, xx1}) { return g.mergeV(xx1) }], 
@@ -966,6 +978,9 @@ const gremlins = {
     g_mergeVXname_markoX_optionXonMatch_age_33_singleX: [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(new Map([["name", "marko"]])).option(Merge.onMatch, new Map([["age", 33]]), Cardinality.single) }, function({g}) { return g.V().has("person", "name", "marko").has("age", 33) }, function({g}) { return g.V().has("person",  [...]
     g_mergeVXname_markoX_optionXonMatch_name_allen_age_setX31X_singleX: [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(new Map([["name", "marko"]])).option(Merge.onMatch, new Map([["name", "allen"], ["age", CardinalityValue.set(31)]]), Cardinality.single) }, function({g}) { return g.V().has("person", "name", "marko") }, f [...]
     g_mergeVXname_markoX_optionXonMatch_name_allen_age_singleX31X_singleX: [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(new Map([["name", "marko"]])).option(Merge.onMatch, new Map([["name", "allen"], ["age", CardinalityValue.single(31)]]), Cardinality.single) }, function({g}) { return g.V().has("person", "name", "marko" [...]
+    g_mergeVXname_aliceX_optionXonCreate_age_singleX81XX: [function({g}) { return g.mergeV(new Map([["name", "alice"], [T.label, "person"]])).option(Merge.onCreate, new Map([["age", CardinalityValue.single(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_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_V_age_min: [function({g}) { return g.V().values("age").min() }], 
     g_V_foo_min: [function({g}) { return g.V().values("foo").min() }], 
@@ -1415,6 +1430,7 @@ const gremlins = {
     g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXvaluesXageX_isXgtX29XXX_capXxX: [function({g}) { return g.withStrategies(new ProductiveByStrategy()).V().aggregate("x").by(__.values("age").is(P.gt(29))).cap("x") }], 
     g_V_aggregateXxX_byXout_order_byXnameXX_capXxX: [function({g}) { return g.V().aggregate("x").by(__.out().order().by("name")).cap("x") }], 
     g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXout_order_byXnameXX_capXxX: [function({g}) { return g.withStrategies(new ProductiveByStrategy()).V().aggregate("x").by(__.out().order().by("name")).cap("x") }], 
+    g_V_aggregateXaX_hasXperson_age_gteX30XXX_capXaX_unfold_valuesXnameX: [function({g}) { return g.V().aggregate("a").has("person", "age", P.gte(30)).cap("a").unfold().values("name") }], 
     g_V_fail: [function({g}) { return g.V().fail() }], 
     g_V_failXmsgX: [function({g}) { return g.V().fail("msg") }], 
     g_V_unionXout_failX: [function({g}) { return g.V().union(__.out(), __.fail()) }], 
diff --git a/gremlin-python/src/main/python/radish/feature_steps.py b/gremlin-python/src/main/python/radish/feature_steps.py
index f3fc31bd45..1dc09f9364 100644
--- a/gremlin-python/src/main/python/radish/feature_steps.py
+++ b/gremlin-python/src/main/python/radish/feature_steps.py
@@ -43,14 +43,15 @@ ignores = [
 
 @given("the {graph_name:w} graph")
 def choose_graph(step, graph_name):
-    step.context.ignore = step.text in ignores
-
+    # if we have no traversals then we are ignoring the test - should be temporary until we can settle out the
+    # issue of handling the removal of lambdas from Gremlin as a language
+    step.context.ignore = len(step.context.traversals) == 0
     tagset = [tag.name for tag in step.all_tags]
     if not step.context.ignore:
         step.context.ignore = "AllowNullPropertyValues" in tagset
 
-    if not step.context.ignore and len(step.context.traversals) == 0:
-        step.context.ignore = True
+    if (step.context.ignore):
+        return
 
     step.context.graph_name = graph_name
     step.context.g = traversal().with_(step.context.remote_conn[graph_name])
@@ -58,6 +59,9 @@ def choose_graph(step, graph_name):
 
 @given("the graph initializer of")
 def initialize_graph(step):
+    if (step.context.ignore):
+        return
+
     t = step.context.traversals.pop(0)(g=step.context.g)
 
     # just be sure that the traversal returns something to prove that it worked to some degree. probably
@@ -75,6 +79,9 @@ def unsupported_scenario(step):
 
 @given("using the parameter {param_name:w} of P.{p_val:w}({param:QuotedString})")
 def add_p_parameter(step, param_name, p_val, param):
+    if (step.context.ignore):
+        return
+
     if not hasattr(step.context, "traversal_params"):
         step.context.traversal_params = {}
 
@@ -83,6 +90,9 @@ def add_p_parameter(step, param_name, p_val, param):
 
 @given("using the parameter {param_name:w} defined as {param:QuotedString}")
 def add_parameter(step, param_name, param):
+    if (step.context.ignore):
+        return
+
     if not hasattr(step.context, "traversal_params"):
         step.context.traversal_params = {}
 
@@ -91,6 +101,8 @@ def add_parameter(step, param_name, param):
 
 @given("the traversal of")
 def translate_traversal(step):
+    if step.context.ignore == False:
+        step.context.ignore = step.text in ignores
     if step.context.ignore:
         return
 
diff --git a/gremlin-python/src/main/python/radish/gremlin.py b/gremlin-python/src/main/python/radish/gremlin.py
index 800fb79af3..6ca28fadd9 100644
--- a/gremlin-python/src/main/python/radish/gremlin.py
+++ b/gremlin-python/src/main/python/radish/gremlin.py
@@ -26,7 +26,7 @@
 
 from radish import world
 import datetime
-from gremlin_python.statics import long
+from gremlin_python.statics import long, GremlinType
 from gremlin_python.process.anonymous_traversal import traversal
 from gremlin_python.process.strategies import SeedStrategy, SubgraphStrategy, PartitionStrategy, ProductiveByStrategy, ReadOnlyStrategy
 from gremlin_python.process.traversal import TraversalStrategy
@@ -171,6 +171,8 @@ world.gremlins = {
     'g_V_both_dedup_age_name': [(lambda g:g.V().both().dedup().by('age').values('name'))], 
     'g_VX1X_asXaX_both_asXbX_both_asXcX_dedupXa_bX_age_selectXa_b_cX_name': [(lambda g, vid1=None:g.V(vid1).as_('a').both().as_('b').both().as_('c').dedup('a', 'b').by('age').select('a', 'b', 'c').by('name'))], 
     'g_VX1X_valuesXageX_dedupXlocalX_unfold': [(lambda g, vid1=None:g.V(vid1).values('age').dedup(Scope.local).unfold())], 
+    'g_V_properties_dedup_count': [(lambda g:g.add_v('person').property('name', 'josh').add_v('person').property('name', 'josh').add_v('person').property('name', 'josh')), (lambda g:g.V().properties('name').dedup().count())], 
+    'g_V_properties_dedup_byXvalueX_count': [(lambda g:g.add_v('person').property('name', 'josh').add_v('person').property('name', 'josh').add_v('person').property('name', 'josh')), (lambda g:g.V().properties('name').dedup().by(T.value).count())], 
     'g_V_count_discard': [(lambda g:g.V().count().discard())], 
     'g_V_hasLabelXpersonX_discard': [(lambda g:g.V().has_label('person').discard())], 
     'g_VX1X_outXcreatedX_discard': [(lambda g, vid1=None:g.V(vid1).out('created').discard())], 
@@ -326,6 +328,7 @@ world.gremlins = {
     'g_V_asXaX_in_asXaX_in_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_limitXlocal_2X': [(lambda g:g.V().as_('a').in_().as_('a').in_().as_('a').select(Pop.mixed, 'a').by(__.unfold().values('name').fold()).limit(Scope.local, 2))], 
     'g_V_hasLabelXpersonX_order_byXageX_valuesXnameX_skipX1X': [(lambda g:g.V().has_label('person').order().by('age').values('name').skip(1))], 
     'g_VX1X_valuesXageX_rangeXlocal_20_30X': [(lambda g, vid1=None:g.V(vid1).values('age').range_(Scope.local, 20, 30))], 
+    'g_V_mapXin_hasIdX1XX_limitX2X_valuesXnameX': [(lambda g, vid1=None:g.V().map(__.in_().has_id(vid1)).limit(2).values('name'))], 
     'g_E_sampleX1X': [(lambda g:g.E().sample(1))], 
     'g_E_sampleX2X_byXweightX': [(lambda g:g.E().sample(2).by('weight'))], 
     'g_V_localXoutE_sampleX1X_byXweightXX': [(lambda g:g.V().local(__.out_e().sample(1).by('weight')))], 
@@ -380,23 +383,25 @@ world.gremlins = {
     'g_withStrategiesXProductiveByStrategyX_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name': [(lambda g, vid3=None:g.with_strategies(ProductiveByStrategy()).V(vid3).as_('a').in_().out().as_('b').where('a', P.eq('b')).by('age').values('name'))], 
     'g_V_asXnX_whereXorXhasLabelXsoftwareX_hasLabelXpersonXXX_selectXnX_byXnameX': [(lambda g:g.V().as_('n').where(__.or_(__.has_label('software'), __.has_label('person'))).select('n').by('name'))], 
     'g_V_asXnX_whereXorXselectXnX_hasLabelXsoftwareX_selectXnX_hasLabelXpersonXXX_selectXnX_byXnameX': [(lambda g:g.V().as_('n').where(__.or_(__.select('n').has_label('software'), __.select('n').has_label('person'))).select('n').by('name'))], 
+    'g_V_hasLabelXpersonX_asXxX_whereXinEXknowsX_count_isXgteX1XXX_selectXxX': [(lambda g:g.V().has_label('person').as_('x').where(__.in_e('knows').count().is_(P.gte(1))).select('x'))], 
+    'g_withoutStrategiesXCountStrategyX_V_count': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.CountStrategy')]).V().count())], 
     'g_V_coworker': [(lambda g, xx1=None:g.V().has_label('person').filter_(__.out_e('created')).aggregate('p').as_('p1').values('name').as_('p1n').select('p').unfold().where(P.neq('p1')).as_('p2').values('name').as_('p2n').select('p2').out('created').choose(__.in_('created').where(P.eq('p1')), __.values('name'), __.constant(xx1)).group().by(__.select('p1n')).by(__.group().by(__.select('p2n')).by(__.unfold().fold().project('numCoCreated', 'coCreated').by(__.count(Scope.local)).by())).unfo [...]
     'g_V_coworker_with_midV': [(lambda g:g.V().has_label('person').filter_(__.out_e('created')).as_('p1').V().has_label('person').where(P.neq('p1')).filter_(__.out_e('created')).as_('p2').map(__.out('created').where(__.in_('created').as_('p1')).values('name').fold()).group().by(__.select('p1').by('name')).by(__.group().by(__.select('p2').by('name')).by(__.project('numCoCreated', 'coCreated').by(__.count(Scope.local)).by())).unfold())], 
     'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').add_v('person').property('_partition', 'b').property('name', 'bob')), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['a'])).V().values('name'))], 
     'g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').add_v('person').property('_partition', 'b').property('name', 'bob')), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['a', 'b'])).V().values('name'))], 
     'g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').add_v('person').property('_partition', 'b').property('name', 'bob')), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['c'])).V().values('name'))], 
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_bothE_weight': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write [...]
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_bothE_weight': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write [...]
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_bothE_dedup_weight': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition [...]
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_bothE_weight': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write [...]
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_both_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_pa [...]
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_both_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_pa [...]
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_both_dedup_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition',  [...]
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_both_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_pa [...]
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_out_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_par [...]
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_in_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_part [...]
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_out_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_p [...]
-    'g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_out_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_par [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_bothE_weight': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', w [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_bothE_weight': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', w [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_bothE_dedup_weight': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_parti [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_bothE_weight': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', w [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_both_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', writ [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_both_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', writ [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_both_dedup_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partitio [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_both_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', writ [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_out_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_bXX_V_in_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_ [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_out_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', wri [...]
+    'g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_out_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').as_('a').add_v('person').property('_partition', 'b').property('name', 'bob').as_('b').add_e('knows').from_('a').to('b').property('_partition', 'a').property('weight', 1.0).add_e('knows').from_('b').to('a').property('_partition', 'b').property('weight', 2.0)), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write [...]
     'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_addVXpersonX_propertyXname_aliceX_addXselfX': [(lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['a'])).add_v('person').property('name', 'alice').add_e('self')), (lambda g:g.V().has('person', 'name', 'alice').has('_partition', 'a')), (lambda g:g.V()), (lambda g:g.E().has('_partition', 'a')), (lambda g:g.E())], 
     'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_injectXzeroX_addVXpersonX_propertyXname_aliceX_addXselfX': [(lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['a'])).inject(0).add_v('person').property('name', 'alice').add_e('self')), (lambda g:g.V().has('person', 'name', 'alice').has('_partition', 'a')), (lambda g:g.V()), (lambda g:g.E().has('_partition', 'a')), (lambda g:g.E())], 
     'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_mergeV': [(lambda g, xx1=None:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['a'])).merge_v(xx1)), (lambda g, xx1=None:g.V().has('person', 'name', 'alice').has('_partition', 'a')), (lambda g, xx1=None:g.V())], 
@@ -464,6 +469,7 @@ world.gremlins = {
     'g_withStrategiesXSubgraphStrategyXedges_hasLabelXusesX_hasXskill_5XXX_V_outE_valueMap_selectXvaluesX_unfold': [(lambda g:g.with_strategies(SubgraphStrategy(edges=__.has_label('uses').has('skill', 5))).V().out_e().value_map().select(Column.values).unfold())], 
     'g_withStrategiesXSubgraphStrategyXsubgraphDXX_V': [(lambda g:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=False, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).V())], 
     'g_withStrategiesXSubgraphStrategyXsubgraphDXX_E': [(lambda g:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=False, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).E())], 
+    'g_withStrategiesXSubgraphStrategyXcheckAdjacentVertices_subgraphDXX_E': [(lambda g:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=True, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).E())], 
     'g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_outE': [(lambda g, vid4=None:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=False, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).V(vid4).out_e())], 
     'g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_inE': [(lambda g, vid4=None:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=False, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).V(vid4).in_e())], 
     'g_withStrategiesXSubgraphStrategyXsubgraphDXX_VX4X_out': [(lambda g, vid4=None:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=False, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).V(vid4).out())], 
@@ -474,6 +480,7 @@ world.gremlins = {
     'g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX11X_bothV': [(lambda g, eid11=None:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=False, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).E(eid11).both_v())], 
     'g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX12X_bothV': [(lambda g, eid12=None:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=False, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).E(eid12).both_v())], 
     'g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX9X_bothV': [(lambda g, eid9=None:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=False, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).E(eid9).both_v())], 
+    'g_withStrategiesXSubgraphStrategyXcheckAdjacentVertices_subgraphDXX_EX9X_bothV': [(lambda g, eid9=None:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=True, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).E(eid9).both_v())], 
     'g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX': [(lambda g, vid1=None: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').add_v('software').property('name', 'ripple').property('lang', 'java').as_('ripple').add_v('person').property('na [...]
     'g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X': [(lambda g, vid1=None: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').add_v('software').property('name', 'ripple').property('lang', 'java').as_('ripple').add_v('pe [...]
     'g_V_outE_propertyXweight_nullX': [(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').add_v('software').property('name', 'ripple').property('lang', 'java').as_('ripple').add_v('person').property('name', 'peter').property('age' [...]
@@ -514,6 +521,7 @@ world.gremlins = {
     'g_addVXpersonX_propertyXname_joshX_propertyXage_nullX': [(lambda g:g.add_v('person').property('name', 'josh').property('age', None)), (lambda g:g.V().has('person', 'age', None))], 
     'g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX': [(lambda g:g.add_v('person').property('name', 'marko').property('friendWeight', None, 'acl', None)), (lambda g:g.V().has('person', 'name', 'marko').has('friendWeight', None)), (lambda g:g.V().has('person', 'name', 'marko').properties('friendWeight').has('acl', None)), (lambda g:g.V().has('person', 'name', 'marko').properties('friendWeight').count())], 
     'g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX': [(lambda g:g.add_v('person').property('name', 'alice').property(Cardinality.single, 'age', 50)), (lambda g:g.V().has('person', 'name', 'alice').property('age', __.union(__.values('age'), __.constant(1)).sum_())), (lambda g:g.V().has('person', 'age', 50)), (lambda g:g.V().has('person', 'age', 51))], 
+    'g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX': [(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').add_v('software').property('name', 'ripple').property(' [...]
     'g_injectXstrX_asDate': [(lambda g:g.inject('2023-08-02T00:00:00Z').as_date())], 
     'g_injectX1694017707000X_asDate': [(lambda g:g.inject(long(1694017707000)).as_date())], 
     'g_injectX1694017708000LX_asDate': [(lambda g, xx1=None:g.inject(xx1).as_date())], 
@@ -625,6 +633,8 @@ world.gremlins = {
     'g_E_sampleX1X_count': [(lambda g:g.E().sample(1).count())], 
     'g_V_sampleX1X_byXageX_count': [(lambda g:g.V().sample(1).by('age').count())], 
     'g_V_order_byXnoX_count': [(lambda g:g.V().order().by('no').count())], 
+    'g_V_group_byXlabelX_count': [(lambda g:g.V().group().by(T.label).count())], 
+    'g_V_group_byXlabelX_countXlocalX': [(lambda g:g.V().group().by(T.label).count(Scope.local))], 
     'g_injectXdatetimeXstrXX_dateAddXDT_hour_2X': [(lambda g:g.inject(datetime.datetime.utcfromtimestamp(1690934400000 / 1000.0)).date_add(DT.hour, 2))], 
     'g_injectXdatetimeXstrXX_dateAddXhour_2X': [(lambda g:g.inject(datetime.datetime.utcfromtimestamp(1690934400000 / 1000.0)).date_add(DT.hour, 2))], 
     'g_injectXdatetimeXstrXX_dateAddXhour_1X': [(lambda g:g.inject(datetime.datetime.utcfromtimestamp(1690934400000 / 1000.0)).date_add(DT.hour, -1))], 
@@ -698,7 +708,7 @@ world.gremlins = {
     'g_injectX1X_asXageX_V_formatXstrX': [(lambda g:g.inject(1).as_('age').V().format_('%{name} is %{age} years old'))], 
     'g_V_formatXstrX_byXvaluesXnameXX_byXvaluesXageXX': [(lambda g:g.V().format_('%{_} is %{_} years old').by(__.values('name')).by(__.values('age')))], 
     'g_V_hasLabelXpersonX_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX': [(lambda g:g.V().has_label('person').format_('%{_} %{_} %{_}').by(__.constant('hello')).by(__.values('name')))], 
-    'g_VX1X_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX': [(lambda g:g.V(1).format_('%{_}').by(__.constant('hello')).by(__.values('name')))], 
+    'g_VX1X_formatXstrX_byXconstantXhelloXX_byXvaluesXnameXX': [(lambda g, vid1=None:g.V(vid1).format_('%{_}').by(__.constant('hello')).by(__.values('name')))], 
     'g_V_formatXstrX_byXbothE_countX': [(lambda g:g.V().format_('%{name} has %{_} connections').by(__.both_e().count()))], 
     'g_V_projectXname_countX_byXvaluesXnameXX_byXbothE_countX_formatXstrX': [(lambda g:g.V().project('name', 'count').by(__.values('name')).by(__.both_e().count()).format_('%{name} has %{count} connections'))], 
     'g_V_elementMap_formatXstrX': [(lambda g:g.V().element_map().format_('%{name} is %{age} years old'))], 
@@ -881,7 +891,7 @@ world.gremlins = {
     'g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko1_in_vadas1X_optionXonCreate_selectXcXX_optionXonMatch_selectXmXX': [(lambda g, xx1=None,xx3=None,xx2=None:g.add_v('person').property('name', 'marko').as_('a').add_v('person').property('name', 'vadas').as_('b')), (lambda g, xx1=None,xx3=None,xx2=None:g.with_side_effect('c', xx2).with_side_effect('m', xx3).merge_e(xx1).option(Merge.on_create, __.select('c')).option(Merge.on_match, __.select('m'))), (l [...]
     'g_mergeEXlabel_knows_out_marko_in_vadasX_aliased_direction': [(lambda g, xx1=None:g.add_v('person').property('name', 'marko').add_v('person').property('name', 'vadas')), (lambda g, xx1=None:g.merge_e(xx1)), (lambda g, xx1=None:g.V().has('person', 'name', 'marko').out('knows').has('person', 'name', 'vadas'))], 
     'g_injectXlabel_knows_out_marko_in_vadas_label_self_out_vadas_in_vadasX': [(lambda g, xx1=None,xx2=None:g.add_v('person').property('name', 'marko').add_v('person').property('name', 'vadas')), (lambda g, xx1=None,xx2=None:g.inject(xx1, xx2).merge_e()), (lambda g, xx1=None,xx2=None:g.V()), (lambda g, xx1=None,xx2=None:g.E()), (lambda g, xx1=None,xx2=None:g.V().has('person', 'name', 'marko').out('knows').has('person', 'name', 'vadas')), (lambda g, xx1=None,xx2=None:g.V().has('person', ' [...]
-    'g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko_in_vadasX_optionXonCreate_selectXcXX_optionXonMatch_sideEffectXpropertiesXweightX_dropX_selectXmXX_exists': [(lambda g, xx1=None,xx3=None,xx2=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,xx3=None,xx2=None:g.with_side_effect('c', xx2).with_side_effect('m', xx3) [...]
+    'g_withSideEffectXc_created_YX_withSideEffectXm_matchedX_mergeEXlabel_knows_out_marko_in_vadasX_optionXonCreate_selectXcXX_optionXonMatch_sideEffectXpropertiesXweightX_dropX_selectXmXX_exists': [(lambda g, xx1=None,xx3=None,xx2=None:g.add_v('person').property('name', 'marko').as_('a').add_v('person').property('name', 'vadas').as_('b').add_e('knows').property('weight', 1.0).from_('a').to('b')), (lambda g, xx1=None,xx3=None,xx2=None:g.with_side_effect('c', xx2).with_side_effect('m', xx [...]
     'g_mergeE_with_outVinV_options_map': [(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_e(xx1).option(Merge.out_v, xx2).option(Merge.in_v, xx3)), (lambda g, xx1=None,xx3=None,xx2=None:g.V()), (lambda g, xx1=None,xx3=None,xx2=None:g.V().has('name', 'marko').out('knows').has('name', 'vadas'))], 
     'g_mergeE_with_outVinV_options_select': [(lambda g, xx1=None,vid2=None,vid1=None:g.add_v('person').property('name', 'marko').add_v('person').property('name', 'vadas')), (lambda g, xx1=None,vid2=None,vid1=None:g.V(vid1).as_('x').V(vid2).as_('y').merge_e(xx1).option(Merge.out_v, __.select('x')).option(Merge.in_v, __.select('y'))), (lambda g, xx1=None,vid2=None,vid1=None:g.V()), (lambda g, xx1=None,vid2=None,vid1=None:g.V().has('name', 'marko').out('knows').has('name', 'vadas'))], 
     'g_mergeE_with_eid_specified_and_inheritance_1': [(lambda g, xx1=None,xx2=None:g.add_v('person').property('name', 'marko').add_v('person').property('name', 'vadas')), (lambda g, xx1=None,xx2=None:g.merge_e(xx1).option(Merge.on_create, xx2)), (lambda g, xx1=None,xx2=None:g.V()), (lambda g, xx1=None,xx2=None:g.E()), (lambda g, xx1=None,xx2=None:g.E('201')), (lambda g, xx1=None,xx2=None:g.V().has('name', 'marko').out('knows').has('name', 'vadas'))], 
@@ -893,6 +903,8 @@ 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({  }))), (lambda g, xx1=None:g.V()), (lambda g, xx1=None:g.E().has_label('knows').ha [...]
+    '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_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))], 
     'g_V_mergeVXemptyX_optionXonMatch_nullX': [(lambda g:g.add_v('person').property('name', 'marko').property('age', 29)), (lambda g:g.V().merge_v({  }).option(Merge.on_match, None)), (lambda g:g.V().has('person', 'name', 'marko').has('age', 29))], 
     'g_mergeVXnullX_optionXonCreate_label_null_name_markoX': [(lambda g, xx1=None:g.add_v('person').property('name', 'marko').property('age', 29)), (lambda g, xx1=None:g.merge_v(xx1))], 
@@ -948,6 +960,9 @@ world.gremlins = {
     'g_mergeVXname_markoX_optionXonMatch_age_33_singleX': [(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({ 'name': 'marko' }).option(Merge.on_match, { 'age': 33 }, Cardinality.single)), (lambda g:g.V().has('person', 'name', 'marko').has('age', 33)), (lambda g:g.V().has('person', 'name', 'marko').has('age')), (lambda g:g.V().has('person', 'name [...]
     'g_mergeVXname_markoX_optionXonMatch_name_allen_age_setX31X_singleX': [(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({ 'name': 'marko' }).option(Merge.on_match, { 'name': 'allen', 'age': CardinalityValue.set_(31) }, Cardinality.single)), (lambda g:g.V().has('person', 'name', 'marko')), (lambda g:g.V().has('person', 'name', 'allen').has('ag [...]
     'g_mergeVXname_markoX_optionXonMatch_name_allen_age_singleX31X_singleX': [(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({ 'name': 'marko' }).option(Merge.on_match, { 'name': 'allen', 'age': CardinalityValue.single(31) }, Cardinality.single)), (lambda g:g.V().has('person', 'name', 'marko')), (lambda g:g.V().has('person', 'name', 'allen').ha [...]
+    'g_mergeVXname_aliceX_optionXonCreate_age_singleX81XX': [(lambda g:g.merge_v({ 'name': 'alice', T.label: 'person' }).option(Merge.on_create, { 'age': CardinalityValue.single(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_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_V_age_min': [(lambda g:g.V().values('age').min_())], 
     'g_V_foo_min': [(lambda g:g.V().values('foo').min_())], 
@@ -1397,6 +1412,7 @@ world.gremlins = {
     'g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXvaluesXageX_isXgtX29XXX_capXxX': [(lambda g:g.with_strategies(ProductiveByStrategy()).V().aggregate('x').by(__.values('age').is_(P.gt(29))).cap('x'))], 
     'g_V_aggregateXxX_byXout_order_byXnameXX_capXxX': [(lambda g:g.V().aggregate('x').by(__.out().order().by('name')).cap('x'))], 
     'g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXout_order_byXnameXX_capXxX': [(lambda g:g.with_strategies(ProductiveByStrategy()).V().aggregate('x').by(__.out().order().by('name')).cap('x'))], 
+    'g_V_aggregateXaX_hasXperson_age_gteX30XXX_capXaX_unfold_valuesXnameX': [(lambda g:g.V().aggregate('a').has('person', 'age', P.gte(30)).cap('a').unfold().values('name'))], 
     'g_V_fail': [(lambda g:g.V().fail())], 
     'g_V_failXmsgX': [(lambda g:g.V().fail('msg'))], 
     'g_V_unionXout_failX': [(lambda g:g.V().union(__.out(), __.fail()))],