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

xiazcy pushed a commit to branch multi-label-experiment
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit db8b034c2607133317fb0a13dcee732046f1003a
Author: Yang Xia <[email protected]>
AuthorDate: Thu May 14 13:41:10 2026 -0700

    fix multi-label in transactions
---
 .../gremlin/language/translator/translations.json  | 878 +++++++++++++++++++++
 .../structure/TinkerTransactionGraph.java          |   5 +-
 .../tinkergraph/structure/TinkerVertex.java        |  16 +
 3 files changed, 897 insertions(+), 2 deletions(-)

diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json
index 3c9c17c495..c420bd491f 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json
@@ -19290,6 +19290,76 @@
             }
         ]
     },
+    {
+        "scenario": "g_addVXa_bX_labels",
+        "traversals": [
+            {
+                "original": "g.addV(\"a\", \"b\").labels().fold()",
+                "language": "g.addV(\"a\", \"b\").labels().fold()",
+                "canonical": "g.addV(\"a\", \"b\").labels().fold()",
+                "anonymized": "g.addV(string0, string1).labels().fold()",
+                "dotnet": "g.AddV((string) \"a\", (string) 
\"b\").Labels().Fold()",
+                "go": "g.AddV(\"a\", \"b\").Labels().Fold()",
+                "groovy": "g.addV(\"a\", \"b\").labels().fold()",
+                "java": "g.addV(\"a\", \"b\").labels().fold()",
+                "javascript": "g.addV(\"a\", \"b\").labels().fold()",
+                "python": "g.add_v('a', 'b').labels().fold()"
+            },
+            {
+                "original": "g.V().hasLabel(\"a\").hasLabel(\"b\")",
+                "language": "g.V().hasLabel(\"a\").hasLabel(\"b\")",
+                "canonical": "g.V().hasLabel(\"a\").hasLabel(\"b\")",
+                "anonymized": "g.V().hasLabel(string0).hasLabel(string1)",
+                "dotnet": "g.V().HasLabel(\"a\").HasLabel(\"b\")",
+                "go": "g.V().HasLabel(\"a\").HasLabel(\"b\")",
+                "groovy": "g.V().hasLabel(\"a\").hasLabel(\"b\")",
+                "java": "g.V().hasLabel(\"a\").hasLabel(\"b\")",
+                "javascript": "g.V().hasLabel(\"a\").hasLabel(\"b\")",
+                "python": "g.V().has_label('a').has_label('b')"
+            },
+            {
+                "original": "g.addV(\"a\", \"b\")",
+                "language": "g.addV(\"a\", \"b\")",
+                "canonical": "g.addV(\"a\", \"b\")",
+                "anonymized": "g.addV(string0, string1)",
+                "dotnet": "g.AddV((string) \"a\", (string) \"b\")",
+                "go": "g.AddV(\"a\", \"b\")",
+                "groovy": "g.addV(\"a\", \"b\")",
+                "java": "g.addV(\"a\", \"b\")",
+                "javascript": "g.addV(\"a\", \"b\")",
+                "python": "g.add_v('a', 'b')"
+            },
+            {
+                "original": "g.V().labels()",
+                "language": "g.V().labels()",
+                "canonical": "g.V().labels()",
+                "anonymized": "g.V().labels()",
+                "dotnet": "g.V().Labels()",
+                "go": "g.V().Labels()",
+                "groovy": "g.V().labels()",
+                "java": "g.V().labels()",
+                "javascript": "g.V().labels()",
+                "python": "g.V().labels()"
+            }
+        ]
+    },
+    {
+        "scenario": "g_addVXa_b_cX_labels_count",
+        "traversals": [
+            {
+                "original": "g.addV(\"a\", \"b\", \"c\").labels().count()",
+                "language": "g.addV(\"a\", \"b\", \"c\").labels().count()",
+                "canonical": "g.addV(\"a\", \"b\", \"c\").labels().count()",
+                "anonymized": "g.addV(string0, string1, 
string2).labels().count()",
+                "dotnet": "g.AddV((string) \"a\", (string) \"b\", (string) 
\"c\").Labels().Count()",
+                "go": "g.AddV(\"a\", \"b\", \"c\").Labels().Count()",
+                "groovy": "g.addV(\"a\", \"b\", \"c\").labels().count()",
+                "java": "g.addV(\"a\", \"b\", \"c\").labels().count()",
+                "javascript": "g.addV(\"a\", \"b\", \"c\").labels().count()",
+                "python": "g.add_v('a', 'b', 'c').labels().count()"
+            }
+        ]
+    },
     {
         "scenario": "g_injectX1X_asBool",
         "traversals": [
@@ -24396,6 +24466,127 @@
             }
         ]
     },
+    {
+        "scenario": "g_V_hasLabelXpersonX_labels",
+        "traversals": [
+            {
+                "original": "g.V().hasLabel(\"person\").labels()",
+                "language": "g.V().hasLabel(\"person\").labels()",
+                "canonical": "g.V().hasLabel(\"person\").labels()",
+                "anonymized": "g.V().hasLabel(string0).labels()",
+                "dotnet": "g.V().HasLabel(\"person\").Labels()",
+                "go": "g.V().HasLabel(\"person\").Labels()",
+                "groovy": "g.V().hasLabel(\"person\").labels()",
+                "java": "g.V().hasLabel(\"person\").labels()",
+                "javascript": "g.V().hasLabel(\"person\").labels()",
+                "python": "g.V().has_label('person').labels()"
+            }
+        ]
+    },
+    {
+        "scenario": "g_addVXa_bX_labels_fold",
+        "traversals": [
+            {
+                "original": "g.addV(\"a\", \"b\")",
+                "language": "g.addV(\"a\", \"b\")",
+                "canonical": "g.addV(\"a\", \"b\")",
+                "anonymized": "g.addV(string0, string1)",
+                "dotnet": "g.AddV((string) \"a\", (string) \"b\")",
+                "go": "g.AddV(\"a\", \"b\")",
+                "groovy": "g.addV(\"a\", \"b\")",
+                "java": "g.addV(\"a\", \"b\")",
+                "javascript": "g.addV(\"a\", \"b\")",
+                "python": "g.add_v('a', 'b')"
+            },
+            {
+                "original": "g.V().labels().fold()",
+                "language": "g.V().labels().fold()",
+                "canonical": "g.V().labels().fold()",
+                "anonymized": "g.V().labels().fold()",
+                "dotnet": "g.V().Labels().Fold()",
+                "go": "g.V().Labels().Fold()",
+                "groovy": "g.V().labels().fold()",
+                "java": "g.V().labels().fold()",
+                "javascript": "g.V().labels().fold()",
+                "python": "g.V().labels().fold()"
+            }
+        ]
+    },
+    {
+        "scenario": "g_addVXa_bX_labels_count",
+        "traversals": [
+            {
+                "original": "g.addV(\"a\", \"b\")",
+                "language": "g.addV(\"a\", \"b\")",
+                "canonical": "g.addV(\"a\", \"b\")",
+                "anonymized": "g.addV(string0, string1)",
+                "dotnet": "g.AddV((string) \"a\", (string) \"b\")",
+                "go": "g.AddV(\"a\", \"b\")",
+                "groovy": "g.addV(\"a\", \"b\")",
+                "java": "g.addV(\"a\", \"b\")",
+                "javascript": "g.addV(\"a\", \"b\")",
+                "python": "g.add_v('a', 'b')"
+            },
+            {
+                "original": "g.V().labels().count()",
+                "language": "g.V().labels().count()",
+                "canonical": "g.V().labels().count()",
+                "anonymized": "g.V().labels().count()",
+                "dotnet": "g.V().Labels().Count()",
+                "go": "g.V().Labels().Count()",
+                "groovy": "g.V().labels().count()",
+                "java": "g.V().labels().count()",
+                "javascript": "g.V().labels().count()",
+                "python": "g.V().labels().count()"
+            }
+        ]
+    },
+    {
+        "scenario": "g_addV_labels",
+        "traversals": [
+            {
+                "original": "g.addV()",
+                "language": "g.addV()",
+                "canonical": "g.addV()",
+                "anonymized": "g.addV()",
+                "dotnet": "g.AddV()",
+                "go": "g.AddV()",
+                "groovy": "g.addV()",
+                "java": "g.addV()",
+                "javascript": "g.addV()",
+                "python": "g.add_v()"
+            },
+            {
+                "original": "g.V().labels()",
+                "language": "g.V().labels()",
+                "canonical": "g.V().labels()",
+                "anonymized": "g.V().labels()",
+                "dotnet": "g.V().Labels()",
+                "go": "g.V().Labels()",
+                "groovy": "g.V().labels()",
+                "java": "g.V().labels()",
+                "javascript": "g.V().labels()",
+                "python": "g.V().labels()"
+            }
+        ]
+    },
+    {
+        "scenario": "g_E_labels",
+        "traversals": [
+            {
+                "original": "g.E().hasLabel(\"knows\").labels()",
+                "language": "g.E().hasLabel(\"knows\").labels()",
+                "canonical": "g.E().hasLabel(\"knows\").labels()",
+                "anonymized": "g.E().hasLabel(string0).labels()",
+                "dotnet": "g.E().HasLabel(\"knows\").Labels()",
+                "go": "g.E().HasLabel(\"knows\").Labels()",
+                "groovy": "g.E().hasLabel(\"knows\").labels()",
+                "java": "g.E().hasLabel(\"knows\").labels()",
+                "javascript": "g.E().hasLabel(\"knows\").labels()",
+                "python": "g.E().has_label('knows').labels()"
+            }
+        ]
+    },
     {
         "scenario": "g_injectXfeature_test_nullX_length",
         "traversals": [
@@ -32249,6 +32440,454 @@
             }
         ]
     },
+    {
+        "scenario": "g_mergeVXlabel_ab_name_markoX_multilabel_create",
+        "traversals": [
+            {
+                "original": "g.mergeV([(T.label): [\"person\",\"employee\"], 
name: \"marko\"])",
+                "language": "g.mergeV([(T.label):[\"person\", \"employee\"], 
name:\"marko\"])",
+                "canonical": "g.mergeV([(T.label):[\"person\", \"employee\"], 
name:\"marko\"])",
+                "anonymized": "g.mergeV(map0)",
+                "dotnet": "g.MergeV((IDictionary<object, object>) new 
Dictionary<object, object> {{ T.Label, new List<object> { \"person\", 
\"employee\" } }, { \"name\", \"marko\" }})",
+                "go": "g.MergeV(map[interface{}]interface{}{gremlingo.T.Label: 
[]interface{}{\"person\", \"employee\"}, \"name\": \"marko\" })",
+                "groovy": "g.mergeV([(T.label):[\"person\", \"employee\"], 
name:\"marko\"])",
+                "java": "g.mergeV(new LinkedHashMap<Object, Object>() {{ 
put(T.label, new ArrayList<Object>() {{ add(\"person\"); add(\"employee\"); 
}}); put(\"name\", \"marko\"); }})",
+                "javascript": "g.mergeV(new Map([[T.label, [\"person\", 
\"employee\"]], [\"name\", \"marko\"]]))",
+                "python": "g.merge_v({ T.label: ['person', 'employee'], 
'name': 'marko' })"
+            },
+            {
+                "original": "g.V()",
+                "language": "g.V()",
+                "canonical": "g.V()",
+                "anonymized": "g.V()",
+                "dotnet": "g.V()",
+                "go": "g.V()",
+                "groovy": "g.V()",
+                "java": "g.V()",
+                "javascript": "g.V()",
+                "python": "g.V()"
+            },
+            {
+                "original": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "language": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "canonical": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "anonymized": "g.V().hasLabel(string0).hasLabel(string1)",
+                "dotnet": "g.V().HasLabel(\"person\").HasLabel(\"employee\")",
+                "go": "g.V().HasLabel(\"person\").HasLabel(\"employee\")",
+                "groovy": "g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "java": "g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "javascript": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "python": "g.V().has_label('person').has_label('employee')"
+            },
+            {
+                "original": "g.V().has(\"name\",\"marko\")",
+                "language": "g.V().has(\"name\", \"marko\")",
+                "canonical": "g.V().has(\"name\", \"marko\")",
+                "anonymized": "g.V().has(string0, string1)",
+                "dotnet": "g.V().Has(\"name\", \"marko\")",
+                "go": "g.V().Has(\"name\", \"marko\")",
+                "groovy": "g.V().has(\"name\", \"marko\")",
+                "java": "g.V().has(\"name\", \"marko\")",
+                "javascript": "g.V().has(\"name\", \"marko\")",
+                "python": "g.V().has('name', 'marko')"
+            }
+        ]
+    },
+    {
+        "scenario": "g_mergeVXlabel_abc_name_testX_multilabel_create",
+        "traversals": [
+            {
+                "original": "g.mergeV([(T.label): [\"a\",\"b\",\"c\"], name: 
\"test\"])",
+                "language": "g.mergeV([(T.label):[\"a\", \"b\", \"c\"], 
name:\"test\"])",
+                "canonical": "g.mergeV([(T.label):[\"a\", \"b\", \"c\"], 
name:\"test\"])",
+                "anonymized": "g.mergeV(map0)",
+                "dotnet": "g.MergeV((IDictionary<object, object>) new 
Dictionary<object, object> {{ T.Label, new List<object> { \"a\", \"b\", \"c\" } 
}, { \"name\", \"test\" }})",
+                "go": "g.MergeV(map[interface{}]interface{}{gremlingo.T.Label: 
[]interface{}{\"a\", \"b\", \"c\"}, \"name\": \"test\" })",
+                "groovy": "g.mergeV([(T.label):[\"a\", \"b\", \"c\"], 
name:\"test\"])",
+                "java": "g.mergeV(new LinkedHashMap<Object, Object>() {{ 
put(T.label, new ArrayList<Object>() {{ add(\"a\"); add(\"b\"); add(\"c\"); 
}}); put(\"name\", \"test\"); }})",
+                "javascript": "g.mergeV(new Map([[T.label, [\"a\", \"b\", 
\"c\"]], [\"name\", \"test\"]]))",
+                "python": "g.merge_v({ T.label: ['a', 'b', 'c'], 'name': 
'test' })"
+            },
+            {
+                "original": "g.V()",
+                "language": "g.V()",
+                "canonical": "g.V()",
+                "anonymized": "g.V()",
+                "dotnet": "g.V()",
+                "go": "g.V()",
+                "groovy": "g.V()",
+                "java": "g.V()",
+                "javascript": "g.V()",
+                "python": "g.V()"
+            },
+            {
+                "original": 
"g.V().hasLabel(\"a\").hasLabel(\"b\").hasLabel(\"c\")",
+                "language": 
"g.V().hasLabel(\"a\").hasLabel(\"b\").hasLabel(\"c\")",
+                "canonical": 
"g.V().hasLabel(\"a\").hasLabel(\"b\").hasLabel(\"c\")",
+                "anonymized": 
"g.V().hasLabel(string0).hasLabel(string1).hasLabel(string2)",
+                "dotnet": 
"g.V().HasLabel(\"a\").HasLabel(\"b\").HasLabel(\"c\")",
+                "go": "g.V().HasLabel(\"a\").HasLabel(\"b\").HasLabel(\"c\")",
+                "groovy": 
"g.V().hasLabel(\"a\").hasLabel(\"b\").hasLabel(\"c\")",
+                "java": 
"g.V().hasLabel(\"a\").hasLabel(\"b\").hasLabel(\"c\")",
+                "javascript": 
"g.V().hasLabel(\"a\").hasLabel(\"b\").hasLabel(\"c\")",
+                "python": "g.V().has_label('a').has_label('b').has_label('c')"
+            }
+        ]
+    },
+    {
+        "scenario": "g_mergeVXlabel_person_name_markoX_single_label",
+        "traversals": [
+            {
+                "original": "g.mergeV([(T.label): \"person\", name: 
\"marko\"])",
+                "language": "g.mergeV([(T.label):\"person\", name:\"marko\"])",
+                "canonical": "g.mergeV([(T.label):\"person\", 
name:\"marko\"])",
+                "anonymized": "g.mergeV(map0)",
+                "dotnet": "g.MergeV((IDictionary<object, object>) new 
Dictionary<object, object> {{ T.Label, \"person\" }, { \"name\", \"marko\" }})",
+                "go": "g.MergeV(map[interface{}]interface{}{gremlingo.T.Label: 
\"person\", \"name\": \"marko\" })",
+                "groovy": "g.mergeV([(T.label):\"person\", name:\"marko\"])",
+                "java": "g.mergeV(new LinkedHashMap<Object, Object>() {{ 
put(T.label, \"person\"); put(\"name\", \"marko\"); }})",
+                "javascript": "g.mergeV(new Map([[T.label, \"person\"], 
[\"name\", \"marko\"]]))",
+                "python": "g.merge_v({ T.label: 'person', 'name': 'marko' })"
+            },
+            {
+                "original": "g.V()",
+                "language": "g.V()",
+                "canonical": "g.V()",
+                "anonymized": "g.V()",
+                "dotnet": "g.V()",
+                "go": "g.V()",
+                "groovy": "g.V()",
+                "java": "g.V()",
+                "javascript": "g.V()",
+                "python": "g.V()"
+            },
+            {
+                "original": "g.V().hasLabel(\"person\")",
+                "language": "g.V().hasLabel(\"person\")",
+                "canonical": "g.V().hasLabel(\"person\")",
+                "anonymized": "g.V().hasLabel(string0)",
+                "dotnet": "g.V().HasLabel(\"person\")",
+                "go": "g.V().HasLabel(\"person\")",
+                "groovy": "g.V().hasLabel(\"person\")",
+                "java": "g.V().hasLabel(\"person\")",
+                "javascript": "g.V().hasLabel(\"person\")",
+                "python": "g.V().has_label('person')"
+            },
+            {
+                "original": "g.V().has(\"name\",\"marko\")",
+                "language": "g.V().has(\"name\", \"marko\")",
+                "canonical": "g.V().has(\"name\", \"marko\")",
+                "anonymized": "g.V().has(string0, string1)",
+                "dotnet": "g.V().Has(\"name\", \"marko\")",
+                "go": "g.V().Has(\"name\", \"marko\")",
+                "groovy": "g.V().has(\"name\", \"marko\")",
+                "java": "g.V().has(\"name\", \"marko\")",
+                "javascript": "g.V().has(\"name\", \"marko\")",
+                "python": "g.V().has('name', 'marko')"
+            }
+        ]
+    },
+    {
+        "scenario": "g_mergeVXlabel_ab_name_markoX_multilabel_match",
+        "traversals": [
+            {
+                "original": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "language": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "canonical": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "anonymized": 
"g.addV(string0).addLabel(string1).property(string2, string3)",
+                "dotnet": "g.AddV((string) 
\"person\").AddLabel(\"employee\").Property(\"name\", \"marko\")",
+                "go": 
"g.AddV(\"person\").AddLabel(\"employee\").Property(\"name\", \"marko\")",
+                "groovy": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "java": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "javascript": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "python": 
"g.add_v('person').add_label('employee').property('name', 'marko')"
+            },
+            {
+                "original": "g.mergeV([(T.label): [\"person\",\"employee\"], 
name: \"marko\"])",
+                "language": "g.mergeV([(T.label):[\"person\", \"employee\"], 
name:\"marko\"])",
+                "canonical": "g.mergeV([(T.label):[\"person\", \"employee\"], 
name:\"marko\"])",
+                "anonymized": "g.mergeV(map0)",
+                "dotnet": "g.MergeV((IDictionary<object, object>) new 
Dictionary<object, object> {{ T.Label, new List<object> { \"person\", 
\"employee\" } }, { \"name\", \"marko\" }})",
+                "go": "g.MergeV(map[interface{}]interface{}{gremlingo.T.Label: 
[]interface{}{\"person\", \"employee\"}, \"name\": \"marko\" })",
+                "groovy": "g.mergeV([(T.label):[\"person\", \"employee\"], 
name:\"marko\"])",
+                "java": "g.mergeV(new LinkedHashMap<Object, Object>() {{ 
put(T.label, new ArrayList<Object>() {{ add(\"person\"); add(\"employee\"); 
}}); put(\"name\", \"marko\"); }})",
+                "javascript": "g.mergeV(new Map([[T.label, [\"person\", 
\"employee\"]], [\"name\", \"marko\"]]))",
+                "python": "g.merge_v({ T.label: ['person', 'employee'], 
'name': 'marko' })"
+            },
+            {
+                "original": "g.V()",
+                "language": "g.V()",
+                "canonical": "g.V()",
+                "anonymized": "g.V()",
+                "dotnet": "g.V()",
+                "go": "g.V()",
+                "groovy": "g.V()",
+                "java": "g.V()",
+                "javascript": "g.V()",
+                "python": "g.V()"
+            },
+            {
+                "original": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "language": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "canonical": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "anonymized": "g.V().hasLabel(string0).hasLabel(string1)",
+                "dotnet": "g.V().HasLabel(\"person\").HasLabel(\"employee\")",
+                "go": "g.V().HasLabel(\"person\").HasLabel(\"employee\")",
+                "groovy": "g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "java": "g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "javascript": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "python": "g.V().has_label('person').has_label('employee')"
+            }
+        ]
+    },
+    {
+        "scenario": "g_mergeVXlabel_ab_name_markoX_multilabel_nomatch",
+        "traversals": [
+            {
+                "original": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "language": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "canonical": "g.addV(\"person\").property(\"name\", 
\"marko\")",
+                "anonymized": "g.addV(string0).property(string1, string2)",
+                "dotnet": "g.AddV((string) \"person\").Property(\"name\", 
\"marko\")",
+                "go": "g.AddV(\"person\").Property(\"name\", \"marko\")",
+                "groovy": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "java": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "javascript": "g.addV(\"person\").property(\"name\", 
\"marko\")",
+                "python": "g.add_v('person').property('name', 'marko')"
+            },
+            {
+                "original": "g.mergeV([(T.label): [\"person\",\"employee\"], 
name: \"marko\"])",
+                "language": "g.mergeV([(T.label):[\"person\", \"employee\"], 
name:\"marko\"])",
+                "canonical": "g.mergeV([(T.label):[\"person\", \"employee\"], 
name:\"marko\"])",
+                "anonymized": "g.mergeV(map0)",
+                "dotnet": "g.MergeV((IDictionary<object, object>) new 
Dictionary<object, object> {{ T.Label, new List<object> { \"person\", 
\"employee\" } }, { \"name\", \"marko\" }})",
+                "go": "g.MergeV(map[interface{}]interface{}{gremlingo.T.Label: 
[]interface{}{\"person\", \"employee\"}, \"name\": \"marko\" })",
+                "groovy": "g.mergeV([(T.label):[\"person\", \"employee\"], 
name:\"marko\"])",
+                "java": "g.mergeV(new LinkedHashMap<Object, Object>() {{ 
put(T.label, new ArrayList<Object>() {{ add(\"person\"); add(\"employee\"); 
}}); put(\"name\", \"marko\"); }})",
+                "javascript": "g.mergeV(new Map([[T.label, [\"person\", 
\"employee\"]], [\"name\", \"marko\"]]))",
+                "python": "g.merge_v({ T.label: ['person', 'employee'], 
'name': 'marko' })"
+            },
+            {
+                "original": "g.V()",
+                "language": "g.V()",
+                "canonical": "g.V()",
+                "anonymized": "g.V()",
+                "dotnet": "g.V()",
+                "go": "g.V()",
+                "groovy": "g.V()",
+                "java": "g.V()",
+                "javascript": "g.V()",
+                "python": "g.V()"
+            }
+        ]
+    },
+    {
+        "scenario": 
"g_mergeVXlabel_person_name_markoX_optionXonMatch_label_managerX",
+        "traversals": [
+            {
+                "original": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "language": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "canonical": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "anonymized": 
"g.addV(string0).addLabel(string1).property(string2, string3)",
+                "dotnet": "g.AddV((string) 
\"person\").AddLabel(\"employee\").Property(\"name\", \"marko\")",
+                "go": 
"g.AddV(\"person\").AddLabel(\"employee\").Property(\"name\", \"marko\")",
+                "groovy": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "java": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "javascript": 
"g.addV(\"person\").addLabel(\"employee\").property(\"name\", \"marko\")",
+                "python": 
"g.add_v('person').add_label('employee').property('name', 'marko')"
+            },
+            {
+                "original": "g.mergeV([(T.label): \"person\", name: 
\"marko\"]).option(Merge.onMatch, [(T.label): \"manager\"])",
+                "language": "g.mergeV([(T.label):\"person\", 
name:\"marko\"]).option(Merge.onMatch, [(T.label):\"manager\"])",
+                "canonical": "g.mergeV([(T.label):\"person\", 
name:\"marko\"]).option(Merge.onMatch, [(T.label):\"manager\"])",
+                "anonymized": "g.mergeV(map0).option(Merge.onMatch, map1)",
+                "dotnet": "g.MergeV((IDictionary<object, object>) new 
Dictionary<object, object> {{ T.Label, \"person\" }, { \"name\", \"marko\" 
}}).Option(Merge.OnMatch, (IDictionary<object, object>) new Dictionary<object, 
object> {{ T.Label, \"manager\" }})",
+                "go": "g.MergeV(map[interface{}]interface{}{gremlingo.T.Label: 
\"person\", \"name\": \"marko\" }).Option(gremlingo.Merge.OnMatch, 
map[interface{}]interface{}{gremlingo.T.Label: \"manager\" })",
+                "groovy": "g.mergeV([(T.label):\"person\", 
name:\"marko\"]).option(Merge.onMatch, [(T.label):\"manager\"])",
+                "java": "g.mergeV(new LinkedHashMap<Object, Object>() {{ 
put(T.label, \"person\"); put(\"name\", \"marko\"); }}).option(Merge.onMatch, 
new LinkedHashMap<Object, Object>() {{ put(T.label, \"manager\"); }})",
+                "javascript": "g.mergeV(new Map([[T.label, \"person\"], 
[\"name\", \"marko\"]])).option(Merge.onMatch, new Map([[T.label, 
\"manager\"]]))",
+                "python": "g.merge_v({ T.label: 'person', 'name': 'marko' 
}).option(Merge.on_match, { T.label: 'manager' })"
+            },
+            {
+                "original": "g.V()",
+                "language": "g.V()",
+                "canonical": "g.V()",
+                "anonymized": "g.V()",
+                "dotnet": "g.V()",
+                "go": "g.V()",
+                "groovy": "g.V()",
+                "java": "g.V()",
+                "javascript": "g.V()",
+                "python": "g.V()"
+            },
+            {
+                "original": "g.V().hasLabel(\"manager\")",
+                "language": "g.V().hasLabel(\"manager\")",
+                "canonical": "g.V().hasLabel(\"manager\")",
+                "anonymized": "g.V().hasLabel(string0)",
+                "dotnet": "g.V().HasLabel(\"manager\")",
+                "go": "g.V().HasLabel(\"manager\")",
+                "groovy": "g.V().hasLabel(\"manager\")",
+                "java": "g.V().hasLabel(\"manager\")",
+                "javascript": "g.V().hasLabel(\"manager\")",
+                "python": "g.V().has_label('manager')"
+            },
+            {
+                "original": "g.V().hasLabel(\"person\")",
+                "language": "g.V().hasLabel(\"person\")",
+                "canonical": "g.V().hasLabel(\"person\")",
+                "anonymized": "g.V().hasLabel(string0)",
+                "dotnet": "g.V().HasLabel(\"person\")",
+                "go": "g.V().HasLabel(\"person\")",
+                "groovy": "g.V().hasLabel(\"person\")",
+                "java": "g.V().hasLabel(\"person\")",
+                "javascript": "g.V().hasLabel(\"person\")",
+                "python": "g.V().has_label('person')"
+            },
+            {
+                "original": "g.V().hasLabel(\"employee\")",
+                "language": "g.V().hasLabel(\"employee\")",
+                "canonical": "g.V().hasLabel(\"employee\")",
+                "anonymized": "g.V().hasLabel(string0)",
+                "dotnet": "g.V().HasLabel(\"employee\")",
+                "go": "g.V().HasLabel(\"employee\")",
+                "groovy": "g.V().hasLabel(\"employee\")",
+                "java": "g.V().hasLabel(\"employee\")",
+                "javascript": "g.V().hasLabel(\"employee\")",
+                "python": "g.V().has_label('employee')"
+            }
+        ]
+    },
+    {
+        "scenario": 
"g_mergeVXlabel_person_name_markoX_optionXonMatch_label_manager_directorX",
+        "traversals": [
+            {
+                "original": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "language": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "canonical": "g.addV(\"person\").property(\"name\", 
\"marko\")",
+                "anonymized": "g.addV(string0).property(string1, string2)",
+                "dotnet": "g.AddV((string) \"person\").Property(\"name\", 
\"marko\")",
+                "go": "g.AddV(\"person\").Property(\"name\", \"marko\")",
+                "groovy": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "java": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "javascript": "g.addV(\"person\").property(\"name\", 
\"marko\")",
+                "python": "g.add_v('person').property('name', 'marko')"
+            },
+            {
+                "original": "g.mergeV([(T.label): \"person\", name: 
\"marko\"]).option(Merge.onMatch, [(T.label): [\"manager\",\"director\"]])",
+                "language": "g.mergeV([(T.label):\"person\", 
name:\"marko\"]).option(Merge.onMatch, [(T.label):[\"manager\", 
\"director\"]])",
+                "canonical": "g.mergeV([(T.label):\"person\", 
name:\"marko\"]).option(Merge.onMatch, [(T.label):[\"manager\", 
\"director\"]])",
+                "anonymized": "g.mergeV(map0).option(Merge.onMatch, map1)",
+                "dotnet": "g.MergeV((IDictionary<object, object>) new 
Dictionary<object, object> {{ T.Label, \"person\" }, { \"name\", \"marko\" 
}}).Option(Merge.OnMatch, (IDictionary<object, object>) new Dictionary<object, 
object> {{ T.Label, new List<object> { \"manager\", \"director\" } }})",
+                "go": "g.MergeV(map[interface{}]interface{}{gremlingo.T.Label: 
\"person\", \"name\": \"marko\" }).Option(gremlingo.Merge.OnMatch, 
map[interface{}]interface{}{gremlingo.T.Label: []interface{}{\"manager\", 
\"director\"} })",
+                "groovy": "g.mergeV([(T.label):\"person\", 
name:\"marko\"]).option(Merge.onMatch, [(T.label):[\"manager\", 
\"director\"]])",
+                "java": "g.mergeV(new LinkedHashMap<Object, Object>() {{ 
put(T.label, \"person\"); put(\"name\", \"marko\"); }}).option(Merge.onMatch, 
new LinkedHashMap<Object, Object>() {{ put(T.label, new ArrayList<Object>() {{ 
add(\"manager\"); add(\"director\"); }}); }})",
+                "javascript": "g.mergeV(new Map([[T.label, \"person\"], 
[\"name\", \"marko\"]])).option(Merge.onMatch, new Map([[T.label, [\"manager\", 
\"director\"]]]))",
+                "python": "g.merge_v({ T.label: 'person', 'name': 'marko' 
}).option(Merge.on_match, { T.label: ['manager', 'director'] })"
+            },
+            {
+                "original": "g.V()",
+                "language": "g.V()",
+                "canonical": "g.V()",
+                "anonymized": "g.V()",
+                "dotnet": "g.V()",
+                "go": "g.V()",
+                "groovy": "g.V()",
+                "java": "g.V()",
+                "javascript": "g.V()",
+                "python": "g.V()"
+            },
+            {
+                "original": 
"g.V().hasLabel(\"manager\").hasLabel(\"director\")",
+                "language": 
"g.V().hasLabel(\"manager\").hasLabel(\"director\")",
+                "canonical": 
"g.V().hasLabel(\"manager\").hasLabel(\"director\")",
+                "anonymized": "g.V().hasLabel(string0).hasLabel(string1)",
+                "dotnet": "g.V().HasLabel(\"manager\").HasLabel(\"director\")",
+                "go": "g.V().HasLabel(\"manager\").HasLabel(\"director\")",
+                "groovy": "g.V().hasLabel(\"manager\").hasLabel(\"director\")",
+                "java": "g.V().hasLabel(\"manager\").hasLabel(\"director\")",
+                "javascript": 
"g.V().hasLabel(\"manager\").hasLabel(\"director\")",
+                "python": "g.V().has_label('manager').has_label('director')"
+            },
+            {
+                "original": "g.V().hasLabel(\"person\")",
+                "language": "g.V().hasLabel(\"person\")",
+                "canonical": "g.V().hasLabel(\"person\")",
+                "anonymized": "g.V().hasLabel(string0)",
+                "dotnet": "g.V().HasLabel(\"person\")",
+                "go": "g.V().HasLabel(\"person\")",
+                "groovy": "g.V().hasLabel(\"person\")",
+                "java": "g.V().hasLabel(\"person\")",
+                "javascript": "g.V().hasLabel(\"person\")",
+                "python": "g.V().has_label('person')"
+            }
+        ]
+    },
+    {
+        "scenario": 
"g_mergeVXlabel_person_name_markoX_optionXonMatch_label_emptyX",
+        "traversals": [
+            {
+                "original": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "language": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "canonical": "g.addV(\"person\").property(\"name\", 
\"marko\")",
+                "anonymized": "g.addV(string0).property(string1, string2)",
+                "dotnet": "g.AddV((string) \"person\").Property(\"name\", 
\"marko\")",
+                "go": "g.AddV(\"person\").Property(\"name\", \"marko\")",
+                "groovy": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "java": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "javascript": "g.addV(\"person\").property(\"name\", 
\"marko\")",
+                "python": "g.add_v('person').property('name', 'marko')"
+            },
+            {
+                "original": "g.mergeV([(T.label): \"person\", name: 
\"marko\"]).option(Merge.onMatch, [(T.label): []])",
+                "language": "g.mergeV([(T.label):\"person\", 
name:\"marko\"]).option(Merge.onMatch, [(T.label):[]])",
+                "canonical": "g.mergeV([(T.label):\"person\", 
name:\"marko\"]).option(Merge.onMatch, [(T.label):[]])",
+                "anonymized": "g.mergeV(map0).option(Merge.onMatch, map1)",
+                "dotnet": "g.MergeV((IDictionary<object, object>) new 
Dictionary<object, object> {{ T.Label, \"person\" }, { \"name\", \"marko\" 
}}).Option(Merge.OnMatch, (IDictionary<object, object>) new Dictionary<object, 
object> {{ T.Label, new List<object> {  } }})",
+                "go": "g.MergeV(map[interface{}]interface{}{gremlingo.T.Label: 
\"person\", \"name\": \"marko\" }).Option(gremlingo.Merge.OnMatch, 
map[interface{}]interface{}{gremlingo.T.Label: []interface{}{} })",
+                "groovy": "g.mergeV([(T.label):\"person\", 
name:\"marko\"]).option(Merge.onMatch, [(T.label):[]])",
+                "java": "g.mergeV(new LinkedHashMap<Object, Object>() {{ 
put(T.label, \"person\"); put(\"name\", \"marko\"); }}).option(Merge.onMatch, 
new LinkedHashMap<Object, Object>() {{ put(T.label, new ArrayList<Object>() {{  
}}); }})",
+                "javascript": "g.mergeV(new Map([[T.label, \"person\"], 
[\"name\", \"marko\"]])).option(Merge.onMatch, new Map([[T.label, []]]))",
+                "python": "g.merge_v({ T.label: 'person', 'name': 'marko' 
}).option(Merge.on_match, { T.label: [] })"
+            },
+            {
+                "original": "g.V()",
+                "language": "g.V()",
+                "canonical": "g.V()",
+                "anonymized": "g.V()",
+                "dotnet": "g.V()",
+                "go": "g.V()",
+                "groovy": "g.V()",
+                "java": "g.V()",
+                "javascript": "g.V()",
+                "python": "g.V()"
+            },
+            {
+                "original": "g.V().hasLabel(\"vertex\")",
+                "language": "g.V().hasLabel(\"vertex\")",
+                "canonical": "g.V().hasLabel(\"vertex\")",
+                "anonymized": "g.V().hasLabel(string0)",
+                "dotnet": "g.V().HasLabel(\"vertex\")",
+                "go": "g.V().HasLabel(\"vertex\")",
+                "groovy": "g.V().hasLabel(\"vertex\")",
+                "java": "g.V().hasLabel(\"vertex\")",
+                "javascript": "g.V().hasLabel(\"vertex\")",
+                "python": "g.V().has_label('vertex')"
+            },
+            {
+                "original": "g.V().hasLabel(\"person\")",
+                "language": "g.V().hasLabel(\"person\")",
+                "canonical": "g.V().hasLabel(\"person\")",
+                "anonymized": "g.V().hasLabel(string0)",
+                "dotnet": "g.V().HasLabel(\"person\")",
+                "go": "g.V().HasLabel(\"person\")",
+                "groovy": "g.V().hasLabel(\"person\")",
+                "java": "g.V().hasLabel(\"person\")",
+                "javascript": "g.V().hasLabel(\"person\")",
+                "python": "g.V().has_label('person')"
+            }
+        ]
+    },
     {
         "scenario": "g_V_age_min",
         "traversals": [
@@ -40806,6 +41445,105 @@
             }
         ]
     },
+    {
+        "scenario": 
"g_V_hasLabelXpersonX_hasXname_markoX_addLabelXemployeeX_labels",
+        "traversals": [
+            {
+                "original": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "language": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "canonical": "g.addV(\"person\").property(\"name\", 
\"marko\")",
+                "anonymized": "g.addV(string0).property(string1, string2)",
+                "dotnet": "g.AddV((string) \"person\").Property(\"name\", 
\"marko\")",
+                "go": "g.AddV(\"person\").Property(\"name\", \"marko\")",
+                "groovy": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "java": "g.addV(\"person\").property(\"name\", \"marko\")",
+                "javascript": "g.addV(\"person\").property(\"name\", 
\"marko\")",
+                "python": "g.add_v('person').property('name', 'marko')"
+            },
+            {
+                "original": "g.V().hasLabel(\"person\").has(\"name\", 
\"marko\").addLabel(\"employee\").labels().fold()",
+                "language": "g.V().hasLabel(\"person\").has(\"name\", 
\"marko\").addLabel(\"employee\").labels().fold()",
+                "canonical": "g.V().hasLabel(\"person\").has(\"name\", 
\"marko\").addLabel(\"employee\").labels().fold()",
+                "anonymized": "g.V().hasLabel(string0).has(string1, 
string2).addLabel(string3).labels().fold()",
+                "dotnet": "g.V().HasLabel(\"person\").Has(\"name\", 
\"marko\").AddLabel(\"employee\").Labels().Fold()",
+                "go": "g.V().HasLabel(\"person\").Has(\"name\", 
\"marko\").AddLabel(\"employee\").Labels().Fold()",
+                "groovy": "g.V().hasLabel(\"person\").has(\"name\", 
\"marko\").addLabel(\"employee\").labels().fold()",
+                "java": "g.V().hasLabel(\"person\").has(\"name\", 
\"marko\").addLabel(\"employee\").labels().fold()",
+                "javascript": "g.V().hasLabel(\"person\").has(\"name\", 
\"marko\").addLabel(\"employee\").labels().fold()",
+                "python": "g.V().has_label('person').has('name', 
'marko').add_label('employee').labels().fold()"
+            },
+            {
+                "original": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "language": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "canonical": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "anonymized": "g.V().hasLabel(string0).hasLabel(string1)",
+                "dotnet": "g.V().HasLabel(\"person\").HasLabel(\"employee\")",
+                "go": "g.V().HasLabel(\"person\").HasLabel(\"employee\")",
+                "groovy": "g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "java": "g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "javascript": 
"g.V().hasLabel(\"person\").hasLabel(\"employee\")",
+                "python": "g.V().has_label('person').has_label('employee')"
+            }
+        ]
+    },
+    {
+        "scenario": "g_V_addLabelXa_bX_labels_count",
+        "traversals": [
+            {
+                "original": "g.addV(\"person\")",
+                "language": "g.addV(\"person\")",
+                "canonical": "g.addV(\"person\")",
+                "anonymized": "g.addV(string0)",
+                "dotnet": "g.AddV((string) \"person\")",
+                "go": "g.AddV(\"person\")",
+                "groovy": "g.addV(\"person\")",
+                "java": "g.addV(\"person\")",
+                "javascript": "g.addV(\"person\")",
+                "python": "g.add_v('person')"
+            },
+            {
+                "original": "g.V().addLabel(\"a\", \"b\").labels().count()",
+                "language": "g.V().addLabel(\"a\", \"b\").labels().count()",
+                "canonical": "g.V().addLabel(\"a\", \"b\").labels().count()",
+                "anonymized": "g.V().addLabel(string0, 
string1).labels().count()",
+                "dotnet": "g.V().AddLabel(\"a\", \"b\").Labels().Count()",
+                "go": "g.V().AddLabel(\"a\", \"b\").Labels().Count()",
+                "groovy": "g.V().addLabel(\"a\", \"b\").labels().count()",
+                "java": "g.V().addLabel(\"a\", \"b\").labels().count()",
+                "javascript": "g.V().addLabel(\"a\", \"b\").labels().count()",
+                "python": "g.V().add_label('a', 'b').labels().count()"
+            }
+        ]
+    },
+    {
+        "scenario": "g_V_addLabelXexistingX_labels_count",
+        "traversals": [
+            {
+                "original": "g.addV(\"person\")",
+                "language": "g.addV(\"person\")",
+                "canonical": "g.addV(\"person\")",
+                "anonymized": "g.addV(string0)",
+                "dotnet": "g.AddV((string) \"person\")",
+                "go": "g.AddV(\"person\")",
+                "groovy": "g.addV(\"person\")",
+                "java": "g.addV(\"person\")",
+                "javascript": "g.addV(\"person\")",
+                "python": "g.add_v('person')"
+            },
+            {
+                "original": "g.V().addLabel(\"person\").labels().count()",
+                "language": "g.V().addLabel(\"person\").labels().count()",
+                "canonical": "g.V().addLabel(\"person\").labels().count()",
+                "anonymized": "g.V().addLabel(string0).labels().count()",
+                "dotnet": "g.V().AddLabel(\"person\").Labels().Count()",
+                "go": "g.V().AddLabel(\"person\").Labels().Count()",
+                "groovy": "g.V().addLabel(\"person\").labels().count()",
+                "java": "g.V().addLabel(\"person\").labels().count()",
+                "javascript": "g.V().addLabel(\"person\").labels().count()",
+                "python": "g.V().add_label('person').labels().count()"
+            }
+        ]
+    },
     {
         "scenario": "g_V_valueXnameX_aggregateXxX_capXxX",
         "traversals": [
@@ -41775,6 +42513,146 @@
             }
         ]
     },
+    {
+        "scenario": "g_V_dropLabelXaX_labels",
+        "traversals": [
+            {
+                "original": "g.addV(\"a\", \"b\")",
+                "language": "g.addV(\"a\", \"b\")",
+                "canonical": "g.addV(\"a\", \"b\")",
+                "anonymized": "g.addV(string0, string1)",
+                "dotnet": "g.AddV((string) \"a\", (string) \"b\")",
+                "go": "g.AddV(\"a\", \"b\")",
+                "groovy": "g.addV(\"a\", \"b\")",
+                "java": "g.addV(\"a\", \"b\")",
+                "javascript": "g.addV(\"a\", \"b\")",
+                "python": "g.add_v('a', 'b')"
+            },
+            {
+                "original": "g.V().dropLabel(\"a\").labels().fold()",
+                "language": "g.V().dropLabel(\"a\").labels().fold()",
+                "canonical": "g.V().dropLabel(\"a\").labels().fold()",
+                "anonymized": "g.V().dropLabel(string0).labels().fold()",
+                "dotnet": "g.V().DropLabel(\"a\").Labels().Fold()",
+                "go": "g.V().DropLabel(\"a\").Labels().Fold()",
+                "groovy": "g.V().dropLabel(\"a\").labels().fold()",
+                "java": "g.V().dropLabel(\"a\").labels().fold()",
+                "javascript": "g.V().dropLabel(\"a\").labels().fold()",
+                "python": "g.V().drop_label('a').labels().fold()"
+            },
+            {
+                "original": "g.V().hasLabel(\"a\")",
+                "language": "g.V().hasLabel(\"a\")",
+                "canonical": "g.V().hasLabel(\"a\")",
+                "anonymized": "g.V().hasLabel(string0)",
+                "dotnet": "g.V().HasLabel(\"a\")",
+                "go": "g.V().HasLabel(\"a\")",
+                "groovy": "g.V().hasLabel(\"a\")",
+                "java": "g.V().hasLabel(\"a\")",
+                "javascript": "g.V().hasLabel(\"a\")",
+                "python": "g.V().has_label('a')"
+            },
+            {
+                "original": "g.V().hasLabel(\"b\")",
+                "language": "g.V().hasLabel(\"b\")",
+                "canonical": "g.V().hasLabel(\"b\")",
+                "anonymized": "g.V().hasLabel(string0)",
+                "dotnet": "g.V().HasLabel(\"b\")",
+                "go": "g.V().HasLabel(\"b\")",
+                "groovy": "g.V().hasLabel(\"b\")",
+                "java": "g.V().hasLabel(\"b\")",
+                "javascript": "g.V().hasLabel(\"b\")",
+                "python": "g.V().has_label('b')"
+            }
+        ]
+    },
+    {
+        "scenario": "g_V_dropLabels_labels",
+        "traversals": [
+            {
+                "original": "g.addV(\"a\", \"b\")",
+                "language": "g.addV(\"a\", \"b\")",
+                "canonical": "g.addV(\"a\", \"b\")",
+                "anonymized": "g.addV(string0, string1)",
+                "dotnet": "g.AddV((string) \"a\", (string) \"b\")",
+                "go": "g.AddV(\"a\", \"b\")",
+                "groovy": "g.addV(\"a\", \"b\")",
+                "java": "g.addV(\"a\", \"b\")",
+                "javascript": "g.addV(\"a\", \"b\")",
+                "python": "g.add_v('a', 'b')"
+            },
+            {
+                "original": "g.V().dropLabels().labels()",
+                "language": "g.V().dropLabels().labels()",
+                "canonical": "g.V().dropLabels().labels()",
+                "anonymized": "g.V().dropLabels().labels()",
+                "dotnet": "g.V().DropLabels().Labels()",
+                "go": "g.V().DropLabels().Labels()",
+                "groovy": "g.V().dropLabels().labels()",
+                "java": "g.V().dropLabels().labels()",
+                "javascript": "g.V().dropLabels().labels()",
+                "python": "g.V().drop_labels().labels()"
+            }
+        ]
+    },
+    {
+        "scenario": "g_V_dropLabelXa_bX_labels",
+        "traversals": [
+            {
+                "original": "g.addV(\"a\", \"b\", \"c\")",
+                "language": "g.addV(\"a\", \"b\", \"c\")",
+                "canonical": "g.addV(\"a\", \"b\", \"c\")",
+                "anonymized": "g.addV(string0, string1, string2)",
+                "dotnet": "g.AddV((string) \"a\", (string) \"b\", (string) 
\"c\")",
+                "go": "g.AddV(\"a\", \"b\", \"c\")",
+                "groovy": "g.addV(\"a\", \"b\", \"c\")",
+                "java": "g.addV(\"a\", \"b\", \"c\")",
+                "javascript": "g.addV(\"a\", \"b\", \"c\")",
+                "python": "g.add_v('a', 'b', 'c')"
+            },
+            {
+                "original": "g.V().dropLabel(\"a\", \"b\").labels()",
+                "language": "g.V().dropLabel(\"a\", \"b\").labels()",
+                "canonical": "g.V().dropLabel(\"a\", \"b\").labels()",
+                "anonymized": "g.V().dropLabel(string0, string1).labels()",
+                "dotnet": "g.V().DropLabel(\"a\", \"b\").Labels()",
+                "go": "g.V().DropLabel(\"a\", \"b\").Labels()",
+                "groovy": "g.V().dropLabel(\"a\", \"b\").labels()",
+                "java": "g.V().dropLabel(\"a\", \"b\").labels()",
+                "javascript": "g.V().dropLabel(\"a\", \"b\").labels()",
+                "python": "g.V().drop_label('a', 'b').labels()"
+            }
+        ]
+    },
+    {
+        "scenario": "g_V_dropLabels_defaultLabel",
+        "traversals": [
+            {
+                "original": "g.addV(\"person\")",
+                "language": "g.addV(\"person\")",
+                "canonical": "g.addV(\"person\")",
+                "anonymized": "g.addV(string0)",
+                "dotnet": "g.AddV((string) \"person\")",
+                "go": "g.AddV(\"person\")",
+                "groovy": "g.addV(\"person\")",
+                "java": "g.addV(\"person\")",
+                "javascript": "g.addV(\"person\")",
+                "python": "g.add_v('person')"
+            },
+            {
+                "original": "g.V().dropLabels().labels()",
+                "language": "g.V().dropLabels().labels()",
+                "canonical": "g.V().dropLabels().labels()",
+                "anonymized": "g.V().dropLabels().labels()",
+                "dotnet": "g.V().DropLabels().Labels()",
+                "go": "g.V().DropLabels().Labels()",
+                "groovy": "g.V().dropLabels().labels()",
+                "java": "g.V().dropLabels().labels()",
+                "javascript": "g.V().dropLabels().labels()",
+                "python": "g.V().drop_labels().labels()"
+            }
+        ]
+    },
     {
         "scenario": "g_V_fail",
         "traversals": [
diff --git 
a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerTransactionGraph.java
 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerTransactionGraph.java
index 3e6931a1d8..e6673e4be6 100644
--- 
a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerTransactionGraph.java
+++ 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerTransactionGraph.java
@@ -137,7 +137,8 @@ public final class TinkerTransactionGraph extends 
AbstractTinkerGraph {
         Object idValue = 
vertexIdManager.convert(ElementHelper.getIdValue(keyValues).orElse(null));
         if (null == idValue)
             idValue = vertexIdManager.getNextId(this);
-        final String label = 
ElementHelper.getLabelValue(keyValues).orElse(Vertex.DEFAULT_LABEL);
+        final Set<String> labels = 
ElementHelper.getLabelsValue(keyValues).orElse(
+                Collections.singleton(Vertex.DEFAULT_LABEL));
 
         this.tx().readWrite();
         final long txNumber = transaction.getTxNumber();
@@ -162,7 +163,7 @@ public final class TinkerTransactionGraph extends 
AbstractTinkerGraph {
         if (container == null)
             container = newContainer;
 
-        final TinkerVertex vertex = new TinkerVertex(idValue, label, this, 
version);
+        final TinkerVertex vertex = new TinkerVertex(idValue, labels, this, 
version);
         ElementHelper.attachProperties(vertex, 
VertexProperty.Cardinality.list, keyValues);
         container.setDraft(vertex, (TinkerTransaction) tx());
 
diff --git 
a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
index 1c7c52802f..67c5ad4692 100644
--- 
a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
+++ 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
@@ -94,6 +94,22 @@ public class TinkerVertex extends TinkerElement implements 
Vertex {
         }
     }
 
+    /**
+     * Constructs a TinkerVertex with multiple labels and a specific version 
(for transactional graphs).
+     */
+    protected TinkerVertex(final Object id, final Set<String> labels, final 
AbstractTinkerGraph graph, final long currentVersion) {
+        super(id, (labels == null || labels.isEmpty()) ? Vertex.DEFAULT_LABEL 
: labels.iterator().next(), currentVersion);
+        this.graph = graph;
+        this.isTxMode = graph instanceof TinkerTransactionGraph;
+        this.allowNullPropertyValues = 
graph.features().vertex().supportsNullPropertyValues();
+        if (labels == null || labels.isEmpty()) {
+            this.vertexLabels = new LinkedHashSet<>();
+            this.vertexLabels.add(Vertex.DEFAULT_LABEL);
+        } else {
+            this.vertexLabels = new LinkedHashSet<>(labels);
+        }
+    }
+
     @Override
     public Set<String> labels() {
         return Collections.unmodifiableSet(this.vertexLabels);

Reply via email to