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);
