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

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


The following commit(s) were added to refs/heads/master-http by this push:
     new f0e973d710 Merge pull request #2790
f0e973d710 is described below

commit f0e973d710828b248dc7d425b59bafeef6ebeabd
Author: kenhuuu <[email protected]>
AuthorDate: Thu Oct 3 14:52:22 2024 -0700

    Merge pull request #2790
---
 .../io/graphson/GraphSONSerializersV4.java         |  83 ++++++---
 .../structure/io/graphson/GraphSONXModuleV4.java   |   4 +-
 .../graphson/GraphSONMapperEmbeddedTypeTest.java   |  25 ++-
 .../GraphSONMapperPartialEmbeddedTypeTest.java     |   6 +-
 .../structure/io/graphson/GraphSONMapperTest.java  |  24 ++-
 .../server/GremlinServerHttpIntegrateTest.java     |   4 +-
 .../structure/io/graphson/bulked-traverser-v4.json |   5 +-
 .../structure/io/graphson/empty-binary-v4.json     |   2 +-
 .../structure/io/graphson/forever-duration-v4.json |   2 +-
 .../gremlin/structure/io/graphson/max-byte-v4.json |   2 +-
 .../io/graphson/max-offsetdatetime-v4.json         |   2 +-
 .../structure/io/graphson/max-short-v4.json        |   2 +-
 .../io/graphson/meta-vertexproperty-v4.json        |   2 +-
 .../gremlin/structure/io/graphson/min-byte-v4.json |   2 +-
 .../io/graphson/min-offsetdatetime-v4.json         |   2 +-
 .../structure/io/graphson/min-short-v4.json        |   2 +-
 .../structure/io/graphson/multi-byte-char-v4.json  |   2 +-
 .../structure/io/graphson/neg-bigdecimal-v4.json   |   2 +-
 .../structure/io/graphson/neg-biginteger-v4.json   |   2 +-
 .../structure/io/graphson/no-prop-edge-v4.json     |   9 +-
 .../structure/io/graphson/no-prop-vertex-v4.json   |   3 +-
 .../structure/io/graphson/pos-bigdecimal-v4.json   |   2 +-
 .../structure/io/graphson/pos-biginteger-v4.json   |   2 +-
 .../structure/io/graphson/prop-path-v4.json        |  23 +--
 .../set-cardinality-vertexproperty-v4.json         |   2 +-
 .../structure/io/graphson/single-byte-char-v4.json |   2 +-
 .../structure/io/graphson/str-binary-v4.json       |   2 +-
 .../structure/io/graphson/tinker-graph-v4.json     | 199 +++++++++++----------
 .../io/graphson/traversal-edge-v4-no-types.json    |   8 +-
 .../structure/io/graphson/traversal-edge-v4.json   |  10 +-
 .../io/graphson/traversal-path-v4-no-types.json    |  15 +-
 .../structure/io/graphson/traversal-path-v4.json   |   9 +-
 .../structure/io/graphson/traversal-tree-v4.json   |  10 +-
 .../io/graphson/traversal-vertex-v4-no-types.json  |   5 +-
 .../structure/io/graphson/traversal-vertex-v4.json |  13 +-
 .../traversal-vertexproperty-v4-no-types.json      |   3 +-
 .../io/graphson/traversal-vertexproperty-v4.json   |   3 +-
 .../structure/io/graphson/vertex-traverser-v4.json |  13 +-
 .../structure/io/graphson/zero-duration-v4.json    |   2 +-
 .../io/AbstractUntypedCompatibilityTest.java       |  39 ++--
 .../tinkergraph/structure/TinkerIoRegistryV4.java  |   2 +-
 41 files changed, 320 insertions(+), 231 deletions(-)

diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV4.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV4.java
index a673305a61..51af208b14 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV4.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV4.java
@@ -69,8 +69,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
-import static 
org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONUtil.safeWriteObjectField;
-
 /**
  * GraphSON serializers for graph-based objects such as vertices, edges, 
properties, and paths. These serializers
  * present a generalized way to serialize the implementations of core 
interfaces.
@@ -101,7 +99,7 @@ class GraphSONSerializersV4 {
             jsonGenerator.writeStartObject();
 
             jsonGenerator.writeObjectField(GraphSONTokens.ID, vertex.id());
-            jsonGenerator.writeStringField(GraphSONTokens.LABEL, 
vertex.label());
+            writeLabel(jsonGenerator, GraphSONTokens.LABEL, vertex.label());
             writeTypeForGraphObjectIfUntyped(jsonGenerator, typeInfo, 
GraphSONTokens.VERTEX);
             writeProperties(vertex, jsonGenerator, serializerProvider);
 
@@ -110,8 +108,6 @@ class GraphSONSerializersV4 {
         }
 
         private void writeProperties(final Vertex vertex, final JsonGenerator 
jsonGenerator, final SerializerProvider serializerProvider) throws IOException {
-            if (vertex.keys().size() == 0)
-                return;
             jsonGenerator.writeFieldName(GraphSONTokens.PROPERTIES);
             jsonGenerator.writeStartObject();
 
@@ -161,10 +157,10 @@ class GraphSONSerializersV4 {
             jsonGenerator.writeStartObject();
 
             jsonGenerator.writeObjectField(GraphSONTokens.ID, edge.id());
-            jsonGenerator.writeStringField(GraphSONTokens.LABEL, edge.label());
+            writeLabel(jsonGenerator, GraphSONTokens.LABEL, edge.label());
             writeTypeForGraphObjectIfUntyped(jsonGenerator, typeInfo, 
GraphSONTokens.EDGE);
-            jsonGenerator.writeStringField(GraphSONTokens.IN_LABEL, 
edge.inVertex().label());
-            jsonGenerator.writeStringField(GraphSONTokens.OUT_LABEL, 
edge.outVertex().label());
+            writeLabel(jsonGenerator, GraphSONTokens.IN_LABEL, 
edge.inVertex().label());
+            writeLabel(jsonGenerator, GraphSONTokens.OUT_LABEL, 
edge.outVertex().label());
             jsonGenerator.writeObjectField(GraphSONTokens.IN, 
edge.inVertex().id());
             jsonGenerator.writeObjectField(GraphSONTokens.OUT, 
edge.outVertex().id());
             writeProperties(edge, jsonGenerator);
@@ -175,16 +171,24 @@ class GraphSONSerializersV4 {
         private void writeProperties(final Edge edge, final JsonGenerator 
jsonGenerator) throws IOException {
             final Iterator<Property<Object>> elementProperties = normalize ?
                     IteratorUtils.list(edge.properties(), 
Comparators.PROPERTY_COMPARATOR).iterator() : edge.properties();
-            if (elementProperties.hasNext()) {
-                jsonGenerator.writeFieldName(GraphSONTokens.PROPERTIES);
 
-                jsonGenerator.writeStartObject();
-                if (typeInfo == TypeInfo.NO_TYPES)
-                    elementProperties.forEachRemaining(prop -> 
safeWriteObjectField(jsonGenerator, prop.key(), prop.value()));
-                else
-                    elementProperties.forEachRemaining(prop -> 
safeWriteObjectField(jsonGenerator, prop.key(), prop));
-                jsonGenerator.writeEndObject();
+            jsonGenerator.writeFieldName(GraphSONTokens.PROPERTIES);
+            jsonGenerator.writeStartObject();
+
+            while (elementProperties.hasNext()) {
+                final Property prop = elementProperties.next();
+                jsonGenerator.writeFieldName(prop.key());
+                jsonGenerator.writeStartArray();
+
+                if (typeInfo == TypeInfo.NO_TYPES) {
+                    jsonGenerator.writeObject(prop.value());
+                } else {
+                    jsonGenerator.writeObject(prop);
+                }
+
+                jsonGenerator.writeEndArray();
             }
+            jsonGenerator.writeEndObject();
         }
     }
 
@@ -229,8 +233,9 @@ class GraphSONSerializersV4 {
 
             jsonGenerator.writeObjectField(GraphSONTokens.ID, property.id());
             jsonGenerator.writeObjectField(GraphSONTokens.VALUE, 
property.value());
-            if (includeLabel)
-                jsonGenerator.writeStringField(GraphSONTokens.LABEL, 
property.label());
+            if (includeLabel) {
+                writeLabel(jsonGenerator, GraphSONTokens.LABEL, 
property.label());
+            }
             tryWriteMetaProperties(property, jsonGenerator, normalize);
 
             jsonGenerator.writeEndObject();
@@ -241,14 +246,11 @@ class GraphSONSerializersV4 {
             // when "detached" you can't check features of the graph it 
detached from so it has to be
             // treated differently from a regular VertexProperty 
implementation.
             if (property instanceof DetachedVertexProperty) {
-                // only write meta properties key if they exist
-                if (property.properties().hasNext()) {
-                    writeMetaProperties(property, jsonGenerator, normalize);
-                }
+                writeMetaProperties(property, jsonGenerator, normalize);
             } else {
                 // still attached - so we can check the features to see if 
it's worth even trying to write the
                 // meta properties key
-                if 
(property.graph().features().vertex().supportsMetaProperties() && 
property.properties().hasNext()) {
+                if 
(property.graph().features().vertex().supportsMetaProperties()) {
                     writeMetaProperties(property, jsonGenerator, normalize);
                 }
             }
@@ -460,7 +462,9 @@ class GraphSONSerializersV4 {
                     v.setId(deserializationContext.readValue(jsonParser, 
Object.class));
                 } else if 
(jsonParser.getCurrentName().equals(GraphSONTokens.LABEL)) {
                     jsonParser.nextToken();
-                    v.setLabel(jsonParser.getText());
+                    while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
+                        v.setLabel(jsonParser.getText());
+                    }
                 } else if 
(jsonParser.getCurrentName().equals(GraphSONTokens.PROPERTIES)) {
                     jsonParser.nextToken();
                     while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
@@ -498,24 +502,32 @@ class GraphSONSerializersV4 {
                     e.setId(deserializationContext.readValue(jsonParser, 
Object.class));
                 } else if 
(jsonParser.getCurrentName().equals(GraphSONTokens.LABEL)) {
                     jsonParser.nextToken();
-                    e.setLabel(jsonParser.getText());
+                    while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
+                        e.setLabel(jsonParser.getText());
+                    }
                 } else if 
(jsonParser.getCurrentName().equals(GraphSONTokens.OUT)) {
                     jsonParser.nextToken();
                     outV.setId(deserializationContext.readValue(jsonParser, 
Object.class));
                 } else if 
(jsonParser.getCurrentName().equals(GraphSONTokens.OUT_LABEL)) {
                     jsonParser.nextToken();
-                    outV.setLabel(jsonParser.getText());
+                    while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
+                        outV.setLabel(jsonParser.getText());
+                    }
                 } else if 
(jsonParser.getCurrentName().equals(GraphSONTokens.IN)) {
                     jsonParser.nextToken();
                     inV.setId(deserializationContext.readValue(jsonParser, 
Object.class));
                 } else if 
(jsonParser.getCurrentName().equals(GraphSONTokens.IN_LABEL)) {
                     jsonParser.nextToken();
-                    inV.setLabel(jsonParser.getText());
+                    while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
+                        inV.setLabel(jsonParser.getText());
+                    }
                 } else if 
(jsonParser.getCurrentName().equals(GraphSONTokens.PROPERTIES)) {
                     jsonParser.nextToken();
                     while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                         jsonParser.nextToken();
-                        
e.addProperty(deserializationContext.readValue(jsonParser, Property.class));
+                        while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
+                            
e.addProperty(deserializationContext.readValue(jsonParser, Property.class));
+                        }
                     }
                 }
             }
@@ -614,7 +626,9 @@ class GraphSONSerializersV4 {
                     vp.setId(deserializationContext.readValue(jsonParser, 
Object.class));
                 } else if 
(jsonParser.getCurrentName().equals(GraphSONTokens.LABEL)) {
                     jsonParser.nextToken();
-                    vp.setLabel(jsonParser.getText());
+                    while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
+                        vp.setLabel(jsonParser.getText());
+                    }
                 } else if 
(jsonParser.getCurrentName().equals(GraphSONTokens.VALUE)) {
                     jsonParser.nextToken();
                     vp.setValue(deserializationContext.readValue(jsonParser, 
Object.class));
@@ -793,4 +807,15 @@ class GraphSONSerializersV4 {
             jsonGenerator.writeStringField(GraphSONTokens.TYPE, type);
         }
     }
+
+    /**
+     * Helper method for writing a label. Starting in v4, the label is an 
array of String that is inside an object. Only
+     * writes the array portion; that is, it assumes the object has already 
started.
+     */
+    private static void writeLabel(final JsonGenerator jsonGenerator, final 
String labelName, final String labelValue) throws IOException {
+        jsonGenerator.writeFieldName(labelName);
+        jsonGenerator.writeStartArray();
+        jsonGenerator.writeString(labelValue);
+        jsonGenerator.writeEndArray();
+    }
 }
\ No newline at end of file
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONXModuleV4.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONXModuleV4.java
index 94031b447d..2f9812c147 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONXModuleV4.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONXModuleV4.java
@@ -48,7 +48,7 @@ public final class GraphSONXModuleV4 extends GraphSONModule {
 
     private static final Map<Class, String> TYPE_DEFINITIONS = 
Collections.unmodifiableMap(
             new LinkedHashMap<Class, String>() {{
-                put(ByteBuffer.class, "ByteBuffer");
+                put(ByteBuffer.class, "Binary");
                 put(Short.class, "Int16");
                 put(BigInteger.class, "BigInteger");
                 put(BigDecimal.class, "BigDecimal");
@@ -124,7 +124,7 @@ public final class GraphSONXModuleV4 extends GraphSONModule 
{
 
     @Override
     public String getTypeNamespace() {
-        return GraphSONTokens.GREMLINX_TYPE_NAMESPACE;
+        return GraphSONTokens.GREMLIN_TYPE_NAMESPACE;
     }
 
     public static final class Builder implements GraphSONModuleBuilder {
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
index 391ffa9dbc..b6ae2dc189 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
@@ -340,7 +340,11 @@ public class GraphSONMapperEmbeddedTypeTest extends 
AbstractGraphSONTest {
         assumeThat(version, not(startsWith("v1")));
 
         final BigInteger o = new 
BigInteger("123456789987654321123456789987654321");
-        assertEquals(o, mapper.readValue("{\"@type\": \"gx:BigInteger\", 
\"@value\": \"123456789987654321123456789987654321\"}", Object.class));
+        if (version.startsWith("v4")) {
+            assertEquals(o, mapper.readValue("{\"@type\": \"g:BigInteger\", 
\"@value\": \"123456789987654321123456789987654321\"}", Object.class));
+        } else {
+            assertEquals(o, mapper.readValue("{\"@type\": \"gx:BigInteger\", 
\"@value\": \"123456789987654321123456789987654321\"}", Object.class));
+        }
     }
 
     @Test
@@ -352,7 +356,11 @@ public class GraphSONMapperEmbeddedTypeTest extends 
AbstractGraphSONTest {
         // enforces this approach but leaves open the opportunity to accept 
either. at some point in the future
         // perhaps it can switch fully - TINKERPOP-2156
         final BigInteger o = new 
BigInteger("123456789987654321123456789987654321");
-        assertEquals(o, mapper.readValue("{\"@type\": \"gx:BigInteger\", 
\"@value\": 123456789987654321123456789987654321}", Object.class));
+        if (version.startsWith("v4")) {
+            assertEquals(o, mapper.readValue("{\"@type\": \"g:BigInteger\", 
\"@value\": 123456789987654321123456789987654321}", Object.class));
+        } else {
+            assertEquals(o, mapper.readValue("{\"@type\": \"gx:BigInteger\", 
\"@value\": 123456789987654321123456789987654321}", Object.class));
+        }
     }
 
     @Test
@@ -426,7 +434,12 @@ public class GraphSONMapperEmbeddedTypeTest extends 
AbstractGraphSONTest {
         assumeThat(version, not(startsWith("v1")));
 
         final BigDecimal o = new 
BigDecimal("123456789987654321123456789987654321");
-        assertEquals(o, mapper.readValue("{\"@type\": \"gx:BigDecimal\", 
\"@value\": \"123456789987654321123456789987654321\"}", Object.class));
+
+        if (version.startsWith("v4")) {
+            assertEquals(o, mapper.readValue("{\"@type\": \"g:BigDecimal\", 
\"@value\": \"123456789987654321123456789987654321\"}", Object.class));
+        } else {
+            assertEquals(o, mapper.readValue("{\"@type\": \"gx:BigDecimal\", 
\"@value\": \"123456789987654321123456789987654321\"}", Object.class));
+        }
     }
 
     @Test
@@ -438,7 +451,11 @@ public class GraphSONMapperEmbeddedTypeTest extends 
AbstractGraphSONTest {
         // enforces this approach but leaves open the opportunity to accept 
either. at some point in the future
         // perhaps it can switch fully - TINKERPOP-2156
         final BigDecimal o = new 
BigDecimal("123456789987654321123456789987654321");
-        assertEquals(o, mapper.readValue("{\"@type\": \"gx:BigDecimal\", 
\"@value\": 123456789987654321123456789987654321}", Object.class));
+        if (version.startsWith("v4")) {
+            assertEquals(o, mapper.readValue("{\"@type\": \"g:BigDecimal\", 
\"@value\": 123456789987654321123456789987654321}", Object.class));
+        } else {
+            assertEquals(o, mapper.readValue("{\"@type\": \"gx:BigDecimal\", 
\"@value\": 123456789987654321123456789987654321}", Object.class));
+        }
     }
 
     @Test
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java
index ebae7171ba..75331741d2 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java
@@ -155,7 +155,11 @@ public class GraphSONMapperPartialEmbeddedTypeTest extends 
AbstractGraphSONTest
             mapper.readValue(inputStream, Instant.class);
             fail("Should have failed decoding the value");
         } catch (Exception e) {
-            assertThat(e.getMessage(), containsString("Could not deserialize 
the JSON value as required. Nested exception: java.lang.InstantiationException: 
Cannot deserialize the value with the detected type contained in the JSON ('" + 
GraphSONTokens.GREMLINX_TYPE_NAMESPACE + ":ZoneOffset') to the type specified 
in parameter to the object mapper (class java.time.Instant). Those types are 
incompatible."));
+            if (version.startsWith("v4")) {
+                assertThat(e.getMessage(), containsString("Could not 
deserialize the JSON value as required. Nested exception: 
java.lang.InstantiationException: Cannot deserialize the value with the 
detected type contained in the JSON ('" + GraphSONTokens.GREMLIN_TYPE_NAMESPACE 
+ ":ZoneOffset') to the type specified in parameter to the object mapper (class 
java.time.Instant). Those types are incompatible."));
+            } else {
+                assertThat(e.getMessage(), containsString("Could not 
deserialize the JSON value as required. Nested exception: 
java.lang.InstantiationException: Cannot deserialize the value with the 
detected type contained in the JSON ('" + 
GraphSONTokens.GREMLINX_TYPE_NAMESPACE + ":ZoneOffset') to the type specified 
in parameter to the object mapper (class java.time.Instant). Those types are 
incompatible."));
+            }
         }
     }
 
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java
index 08beeb2ddb..d6931b9a1e 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java
@@ -88,10 +88,12 @@ public class GraphSONMapperTest {
         // v2 untyped seems to serialize the VertexProperty label. not 
changing that since it's already been
         // introduced a long while back. v3 dips back to v1 style - since it 
has never existed prior to 3.7.0
         // we can make this change
-        if (version.startsWith("v1") || version.startsWith("v3") || 
version.startsWith("v4"))
+        if (version.startsWith("v1") || version.startsWith("v3"))
             
assertEquals("{\"id\":123,\"label\":\"person\",\"type\":\"vertex\",\"properties\":{\"name\":[{\"id\":1,\"value\":\"alice\"}],\"age\":[{\"id\":1,\"value\":\"31\"}]}}",
 json);
         else if (version.startsWith("v2"))
             
assertEquals("{\"id\":123,\"label\":\"person\",\"properties\":{\"name\":[{\"id\":1,\"value\":\"alice\",\"label\":\"name\"}],\"age\":[{\"id\":1,\"value\":\"31\",\"label\":\"age\"}]}}",
 json);
+        else if (version.startsWith("v4"))
+            
assertEquals("{\"id\":123,\"label\":[\"person\"],\"type\":\"vertex\",\"properties\":{\"name\":[{\"id\":1,\"value\":\"alice\",\"properties\":{}}],\"age\":[{\"id\":1,\"value\":\"31\",\"properties\":{}}]}}",
 json);
         else
             throw new IllegalStateException("Version not accounted for in 
asserts");
     }
@@ -106,10 +108,12 @@ public class GraphSONMapperTest {
         // v2 untyped seems to serialize the VertexProperty label. not 
changing that since it's already been
         // introduced a long while back. v3 dips back to v1 style - since it 
has never existed prior to 3.7.0
         // we can make this change
-        if (version.startsWith("v1") || version.startsWith("v3") || 
version.startsWith("v4"))
+        if (version.startsWith("v1") || version.startsWith("v3"))
             
assertEquals("{\"id\":123,\"label\":\"knows\",\"type\":\"edge\",\"inVLabel\":\"person\",\"outVLabel\":\"person\",\"inV\":2,\"outV\":1,\"properties\":{\"weight\":0.5}}",
 json);
         else if (version.startsWith("v2"))
             
assertEquals("{\"id\":123,\"label\":\"knows\",\"inVLabel\":\"person\",\"outVLabel\":\"person\",\"inV\":2,\"outV\":1,\"properties\":{\"weight\":{\"key\":\"weight\",\"value\":0.5}}}",
 json);
+        else if (version.startsWith("v4"))
+            
assertEquals("{\"id\":123,\"label\":[\"knows\"],\"type\":\"edge\",\"inVLabel\":[\"person\"],\"outVLabel\":[\"person\"],\"inV\":2,\"outV\":1,\"properties\":{\"weight\":[0.5]}}",
 json);
         else
             throw new IllegalStateException("Version not accounted for in 
asserts");
     }
@@ -129,7 +133,11 @@ public class GraphSONMapperTest {
                     put("current", true);
                 }}, v);
         final String json = mapper.writeValueAsString(p);
-        
assertEquals("{\"id\":123,\"value\":\"alice\",\"label\":\"name\",\"properties\":{\"current\":true}}",
 json);
+        if (version.startsWith("v4")) {
+            
assertEquals("{\"id\":123,\"value\":\"alice\",\"label\":[\"name\"],\"properties\":{\"current\":true}}",
 json);
+        } else {
+            
assertEquals("{\"id\":123,\"value\":\"alice\",\"label\":\"name\",\"properties\":{\"current\":true}}",
 json);
+        }
     }
 
     @Test
@@ -137,7 +145,11 @@ public class GraphSONMapperTest {
         final DetachedVertex v = new DetachedVertex(321L, "person", 
Collections.emptyMap());
         final VertexProperty p = new DetachedVertexProperty(123L, "name", 
"alice", Collections.emptyMap(), v);
         final String json = mapper.writeValueAsString(p);
-        assertEquals("{\"id\":123,\"value\":\"alice\",\"label\":\"name\"}", 
json);
+        if (version.startsWith("v4")) {
+            
assertEquals("{\"id\":123,\"value\":\"alice\",\"label\":[\"name\"],\"properties\":{}}",
 json);
+        } else {
+            
assertEquals("{\"id\":123,\"value\":\"alice\",\"label\":\"name\"}", json);
+        }
     }
 
     @Test
@@ -150,8 +162,10 @@ public class GraphSONMapperTest {
                 extend("alice", new HashSet<>(Collections.singletonList("c")));
         final String json = mapper.writeValueAsString(p);
 
-        if (version.startsWith("v1") || version.startsWith("v3") || 
version.startsWith("v4"))
+        if (version.startsWith("v1") || version.startsWith("v3"))
             
assertEquals("{\"labels\":[[\"a\"],[\"b\"],[\"c\"]],\"objects\":[{\"id\":123,\"label\":\"person\",\"type\":\"vertex\",\"properties\":{\"name\":[{\"id\":1,\"value\":\"alice\"}],\"age\":[{\"id\":1,\"value\":\"31\"}]}},123,\"alice\"]}",
 json);
+        else if (version.startsWith("v4"))
+            
assertEquals("{\"labels\":[[\"a\"],[\"b\"],[\"c\"]],\"objects\":[{\"id\":123,\"label\":[\"person\"],\"type\":\"vertex\",\"properties\":{\"name\":[{\"id\":1,\"value\":\"alice\",\"properties\":{}}],\"age\":[{\"id\":1,\"value\":\"31\",\"properties\":{}}]}},123,\"alice\"]}",
 json);
         else
             
assertEquals("{\"labels\":[[\"a\"],[\"b\"],[\"c\"]],\"objects\":[{\"id\":123,\"label\":\"person\",\"properties\":{\"name\":[{\"id\":1,\"value\":\"alice\",\"label\":\"name\"}],\"age\":[{\"id\":1,\"value\":\"31\",\"label\":\"age\"}]}},123,\"alice\"]}",
 json);
     }
diff --git 
a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
 
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
index 1aa01b9156..72d9ad893d 100644
--- 
a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
+++ 
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
@@ -586,7 +586,7 @@ public class GremlinServerHttpIntegrateTest extends 
AbstractGremlinServerIntegra
             final JsonNode node = mapper.readTree(json);
             assertEquals(6, 
node.get("result").get(GraphSONTokens.VALUEPROP).size());
             assertEquals(GraphSONTokens.VERTEX,
-                    
node.get("result").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).get(GraphSONTokens.LABEL).asText());
+                    
node.get("result").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).get(GraphSONTokens.LABEL).get(0).textValue());
         }
     }
 
@@ -1277,7 +1277,7 @@ public class GremlinServerHttpIntegrateTest extends 
AbstractGremlinServerIntegra
 
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            
assertNull(node.get("result").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).get(GraphSONTokens.PROPERTIES));
+            
assertTrue(node.get("result").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).get(GraphSONTokens.PROPERTIES).isEmpty());
         }
     }
 
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/bulked-traverser-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/bulked-traverser-v4.json
index d1f4f33ab8..27df3529c9 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/bulked-traverser-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/bulked-traverser-v4.json
@@ -12,7 +12,7 @@
           "@type" : "g:Int32",
           "@value" : 11
         },
-        "label" : "software",
+        "label" : [ "software" ],
         "properties" : {
           "name" : [ {
             "@type" : "g:VertexProperty",
@@ -22,7 +22,8 @@
                 "@value" : 5
               },
               "value" : "tinkergraph",
-              "label" : "name"
+              "label" : [ "name" ],
+              "properties" : { }
             }
           } ]
         }
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-binary-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-binary-v4.json
index 3fe0ec48bc..8905fc0707 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-binary-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-binary-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:ByteBuffer",
+  "@type" : "g:Binary",
   "@value" : ""
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/forever-duration-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/forever-duration-v4.json
index ad8ff76989..f72bcf554f 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/forever-duration-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/forever-duration-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:Duration",
+  "@type" : "g:Duration",
   "@value" : "PT2562047788015215H30M7.999999999S"
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-byte-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-byte-v4.json
index b004ec57b7..f883216d5f 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-byte-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-byte-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:Byte",
+  "@type" : "g:Byte",
   "@value" : 127
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-offsetdatetime-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-offsetdatetime-v4.json
index 552963b081..6fc7c25fe6 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-offsetdatetime-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-offsetdatetime-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:OffsetDateTime",
+  "@type" : "g:OffsetDateTime",
   "@value" : "+999999999-12-31T23:59:59.999999999-18:00"
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-short-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-short-v4.json
index 82decf22ad..281f0162e6 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-short-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-short-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:Int16",
+  "@type" : "g:Int16",
   "@value" : 32767
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/meta-vertexproperty-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/meta-vertexproperty-v4.json
index 3dfb5842d3..13da91c00c 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/meta-vertexproperty-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/meta-vertexproperty-v4.json
@@ -6,7 +6,7 @@
       "@value" : 1
     },
     "value" : "stephen",
-    "label" : "person",
+    "label" : [ "person" ],
     "properties" : {
       "a" : "b"
     }
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-byte-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-byte-v4.json
index fedaea0d48..72192f1ecb 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-byte-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-byte-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:Byte",
+  "@type" : "g:Byte",
   "@value" : -128
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-offsetdatetime-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-offsetdatetime-v4.json
index 40d58e3cc8..d45954b5bf 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-offsetdatetime-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-offsetdatetime-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:OffsetDateTime",
+  "@type" : "g:OffsetDateTime",
   "@value" : "-999999999-01-01T00:00+18:00"
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-short-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-short-v4.json
index 065cafa4e6..946d481cb6 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-short-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-short-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:Int16",
+  "@type" : "g:Int16",
   "@value" : -32768
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/multi-byte-char-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/multi-byte-char-v4.json
index b9f7ba2a62..46acefff3e 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/multi-byte-char-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/multi-byte-char-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:Char",
+  "@type" : "g:Char",
   "@value" : "Ω"
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-bigdecimal-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-bigdecimal-v4.json
index 31622f7a8d..be48f4f81c 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-bigdecimal-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-bigdecimal-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:BigDecimal",
+  "@type" : "g:BigDecimal",
   "@value" : -123.456789987654321123456789987654321
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-biginteger-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-biginteger-v4.json
index 3cda554ad2..97b812f209 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-biginteger-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-biginteger-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:BigInteger",
+  "@type" : "g:BigInteger",
   "@value" : -123456789987654321123456789987654321
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-edge-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-edge-v4.json
index 8712885cee..9efced22c4 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-edge-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-edge-v4.json
@@ -5,9 +5,9 @@
       "@type" : "g:Int32",
       "@value" : 13
     },
-    "label" : "develops",
-    "inVLabel" : "software",
-    "outVLabel" : "person",
+    "label" : [ "develops" ],
+    "inVLabel" : [ "software" ],
+    "outVLabel" : [ "person" ],
     "inV" : {
       "@type" : "g:Int32",
       "@value" : 10
@@ -15,6 +15,7 @@
     "outV" : {
       "@type" : "g:Int32",
       "@value" : 1
-    }
+    },
+    "properties" : { }
   }
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-vertex-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-vertex-v4.json
index 2d7fc68651..272638f730 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-vertex-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-vertex-v4.json
@@ -5,6 +5,7 @@
       "@type" : "g:Int32",
       "@value" : 1
     },
-    "label" : "person"
+    "label" : [ "person" ],
+    "properties" : { }
   }
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-bigdecimal-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-bigdecimal-v4.json
index fcf7fd8c77..d95c364292 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-bigdecimal-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-bigdecimal-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:BigDecimal",
+  "@type" : "g:BigDecimal",
   "@value" : 123.456789987654321123456789987654321
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-biginteger-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-biginteger-v4.json
index 58e6114369..5483f8ba3b 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-biginteger-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-biginteger-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:BigInteger",
+  "@type" : "g:BigInteger",
   "@value" : 123456789987654321123456789987654321
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/prop-path-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/prop-path-v4.json
index a4edc99eae..f35d72bf15 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/prop-path-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/prop-path-v4.json
@@ -23,7 +23,7 @@
             "@type" : "g:Int32",
             "@value" : 1
           },
-          "label" : "person",
+          "label" : [ "person" ],
           "properties" : {
             "name" : [ {
               "@type" : "g:VertexProperty",
@@ -33,7 +33,8 @@
                   "@value" : 0
                 },
                 "value" : "marko",
-                "label" : "name"
+                "label" : [ "name" ],
+                "properties" : { }
               }
             } ],
             "location" : [ {
@@ -44,7 +45,7 @@
                   "@value" : 6
                 },
                 "value" : "san diego",
-                "label" : "location",
+                "label" : [ "location" ],
                 "properties" : {
                   "startTime" : {
                     "@type" : "g:Int32",
@@ -64,7 +65,7 @@
                   "@value" : 7
                 },
                 "value" : "santa cruz",
-                "label" : "location",
+                "label" : [ "location" ],
                 "properties" : {
                   "startTime" : {
                     "@type" : "g:Int32",
@@ -84,7 +85,7 @@
                   "@value" : 8
                 },
                 "value" : "brussels",
-                "label" : "location",
+                "label" : [ "location" ],
                 "properties" : {
                   "startTime" : {
                     "@type" : "g:Int32",
@@ -104,7 +105,7 @@
                   "@value" : 9
                 },
                 "value" : "santa fe",
-                "label" : "location",
+                "label" : [ "location" ],
                 "properties" : {
                   "startTime" : {
                     "@type" : "g:Int32",
@@ -122,7 +123,7 @@
             "@type" : "g:Int32",
             "@value" : 10
           },
-          "label" : "software",
+          "label" : [ "software" ],
           "properties" : {
             "name" : [ {
               "@type" : "g:VertexProperty",
@@ -132,7 +133,8 @@
                   "@value" : 4
                 },
                 "value" : "gremlin",
-                "label" : "name"
+                "label" : [ "name" ],
+                "properties" : { }
               }
             } ]
           }
@@ -144,7 +146,7 @@
             "@type" : "g:Int32",
             "@value" : 11
           },
-          "label" : "software",
+          "label" : [ "software" ],
           "properties" : {
             "name" : [ {
               "@type" : "g:VertexProperty",
@@ -154,7 +156,8 @@
                   "@value" : 5
                 },
                 "value" : "tinkergraph",
-                "label" : "name"
+                "label" : [ "name" ],
+                "properties" : { }
               }
             } ]
           }
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/set-cardinality-vertexproperty-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/set-cardinality-vertexproperty-v4.json
index f768cd84f2..712358bcfa 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/set-cardinality-vertexproperty-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/set-cardinality-vertexproperty-v4.json
@@ -9,7 +9,7 @@
       "@type" : "g:Set",
       "@value" : [ "stephen", "marko" ]
     },
-    "label" : "person",
+    "label" : [ "person" ],
     "properties" : {
       "a" : "b"
     }
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/single-byte-char-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/single-byte-char-v4.json
index eb3dd7663f..e066b3df59 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/single-byte-char-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/single-byte-char-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:Char",
+  "@type" : "g:Char",
   "@value" : "a"
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/str-binary-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/str-binary-v4.json
index 57241159a3..a0fc26a130 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/str-binary-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/str-binary-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:ByteBuffer",
+  "@type" : "g:Binary",
   "@value" : "c29tZSBieXRlcyBmb3IgeW91"
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/tinker-graph-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/tinker-graph-v4.json
index 24e95ed6af..241b56604b 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/tinker-graph-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/tinker-graph-v4.json
@@ -1,5 +1,5 @@
 {
-  "@type" : "tinker:graph",
+  "@type" : "g:graph",
   "@value" : {
     "vertices" : [ {
       "@type" : "g:Vertex",
@@ -8,7 +8,7 @@
           "@type" : "g:Int32",
           "@value" : 1
         },
-        "label" : "person",
+        "label" : [ "person" ],
         "properties" : {
           "name" : [ {
             "@type" : "g:VertexProperty",
@@ -18,7 +18,8 @@
                 "@value" : 0
               },
               "value" : "marko",
-              "label" : "name"
+              "label" : [ "name" ],
+              "properties" : { }
             }
           } ],
           "location" : [ {
@@ -29,7 +30,7 @@
                 "@value" : 6
               },
               "value" : "san diego",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -49,7 +50,7 @@
                 "@value" : 7
               },
               "value" : "santa cruz",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -69,7 +70,7 @@
                 "@value" : 8
               },
               "value" : "brussels",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -89,7 +90,7 @@
                 "@value" : 9
               },
               "value" : "santa fe",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -107,7 +108,7 @@
           "@type" : "g:Int32",
           "@value" : 7
         },
-        "label" : "person",
+        "label" : [ "person" ],
         "properties" : {
           "name" : [ {
             "@type" : "g:VertexProperty",
@@ -117,7 +118,8 @@
                 "@value" : 1
               },
               "value" : "stephen",
-              "label" : "name"
+              "label" : [ "name" ],
+              "properties" : { }
             }
           } ],
           "location" : [ {
@@ -128,7 +130,7 @@
                 "@value" : 10
               },
               "value" : "centreville",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -148,7 +150,7 @@
                 "@value" : 11
               },
               "value" : "dulles",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -168,7 +170,7 @@
                 "@value" : 12
               },
               "value" : "purcellville",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -186,7 +188,7 @@
           "@type" : "g:Int32",
           "@value" : 8
         },
-        "label" : "person",
+        "label" : [ "person" ],
         "properties" : {
           "name" : [ {
             "@type" : "g:VertexProperty",
@@ -196,7 +198,8 @@
                 "@value" : 2
               },
               "value" : "matthias",
-              "label" : "name"
+              "label" : [ "name" ],
+              "properties" : { }
             }
           } ],
           "location" : [ {
@@ -207,7 +210,7 @@
                 "@value" : 13
               },
               "value" : "bremen",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -227,7 +230,7 @@
                 "@value" : 14
               },
               "value" : "baltimore",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -247,7 +250,7 @@
                 "@value" : 15
               },
               "value" : "oakland",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -267,7 +270,7 @@
                 "@value" : 16
               },
               "value" : "seattle",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -285,7 +288,7 @@
           "@type" : "g:Int32",
           "@value" : 9
         },
-        "label" : "person",
+        "label" : [ "person" ],
         "properties" : {
           "name" : [ {
             "@type" : "g:VertexProperty",
@@ -295,7 +298,8 @@
                 "@value" : 3
               },
               "value" : "daniel",
-              "label" : "name"
+              "label" : [ "name" ],
+              "properties" : { }
             }
           } ],
           "location" : [ {
@@ -306,7 +310,7 @@
                 "@value" : 17
               },
               "value" : "spremberg",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -326,7 +330,7 @@
                 "@value" : 18
               },
               "value" : "kaiserslautern",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -346,7 +350,7 @@
                 "@value" : 19
               },
               "value" : "aachen",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -364,7 +368,7 @@
           "@type" : "g:Int32",
           "@value" : 10
         },
-        "label" : "software",
+        "label" : [ "software" ],
         "properties" : {
           "name" : [ {
             "@type" : "g:VertexProperty",
@@ -374,7 +378,8 @@
                 "@value" : 4
               },
               "value" : "gremlin",
-              "label" : "name"
+              "label" : [ "name" ],
+              "properties" : { }
             }
           } ]
         }
@@ -386,7 +391,7 @@
           "@type" : "g:Int32",
           "@value" : 11
         },
-        "label" : "software",
+        "label" : [ "software" ],
         "properties" : {
           "name" : [ {
             "@type" : "g:VertexProperty",
@@ -396,7 +401,8 @@
                 "@value" : 5
               },
               "value" : "tinkergraph",
-              "label" : "name"
+              "label" : [ "name" ],
+              "properties" : { }
             }
           } ]
         }
@@ -409,9 +415,9 @@
           "@type" : "g:Int32",
           "@value" : 13
         },
-        "label" : "develops",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "develops" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 10
@@ -421,7 +427,7 @@
           "@value" : 1
         },
         "properties" : {
-          "since" : {
+          "since" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "since",
@@ -430,7 +436,7 @@
                 "@value" : 2009
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -440,9 +446,9 @@
           "@type" : "g:Int32",
           "@value" : 14
         },
-        "label" : "develops",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "develops" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 11
@@ -452,7 +458,7 @@
           "@value" : 1
         },
         "properties" : {
-          "since" : {
+          "since" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "since",
@@ -461,7 +467,7 @@
                 "@value" : 2010
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -471,9 +477,9 @@
           "@type" : "g:Int32",
           "@value" : 15
         },
-        "label" : "uses",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "uses" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 10
@@ -483,7 +489,7 @@
           "@value" : 1
         },
         "properties" : {
-          "skill" : {
+          "skill" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "skill",
@@ -492,7 +498,7 @@
                 "@value" : 4
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -502,9 +508,9 @@
           "@type" : "g:Int32",
           "@value" : 16
         },
-        "label" : "uses",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "uses" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 11
@@ -514,7 +520,7 @@
           "@value" : 1
         },
         "properties" : {
-          "skill" : {
+          "skill" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "skill",
@@ -523,7 +529,7 @@
                 "@value" : 5
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -533,9 +539,9 @@
           "@type" : "g:Int32",
           "@value" : 17
         },
-        "label" : "develops",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "develops" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 10
@@ -545,7 +551,7 @@
           "@value" : 7
         },
         "properties" : {
-          "since" : {
+          "since" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "since",
@@ -554,7 +560,7 @@
                 "@value" : 2010
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -564,9 +570,9 @@
           "@type" : "g:Int32",
           "@value" : 18
         },
-        "label" : "develops",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "develops" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 11
@@ -576,7 +582,7 @@
           "@value" : 7
         },
         "properties" : {
-          "since" : {
+          "since" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "since",
@@ -585,7 +591,7 @@
                 "@value" : 2011
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -595,9 +601,9 @@
           "@type" : "g:Int32",
           "@value" : 19
         },
-        "label" : "uses",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "uses" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 10
@@ -607,7 +613,7 @@
           "@value" : 7
         },
         "properties" : {
-          "skill" : {
+          "skill" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "skill",
@@ -616,7 +622,7 @@
                 "@value" : 5
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -626,9 +632,9 @@
           "@type" : "g:Int32",
           "@value" : 20
         },
-        "label" : "uses",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "uses" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 11
@@ -638,7 +644,7 @@
           "@value" : 7
         },
         "properties" : {
-          "skill" : {
+          "skill" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "skill",
@@ -647,7 +653,7 @@
                 "@value" : 4
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -657,9 +663,9 @@
           "@type" : "g:Int32",
           "@value" : 21
         },
-        "label" : "develops",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "develops" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 10
@@ -669,7 +675,7 @@
           "@value" : 8
         },
         "properties" : {
-          "since" : {
+          "since" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "since",
@@ -678,7 +684,7 @@
                 "@value" : 2012
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -688,9 +694,9 @@
           "@type" : "g:Int32",
           "@value" : 22
         },
-        "label" : "uses",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "uses" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 10
@@ -700,7 +706,7 @@
           "@value" : 8
         },
         "properties" : {
-          "skill" : {
+          "skill" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "skill",
@@ -709,7 +715,7 @@
                 "@value" : 3
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -719,9 +725,9 @@
           "@type" : "g:Int32",
           "@value" : 23
         },
-        "label" : "uses",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "uses" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 11
@@ -731,7 +737,7 @@
           "@value" : 8
         },
         "properties" : {
-          "skill" : {
+          "skill" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "skill",
@@ -740,7 +746,7 @@
                 "@value" : 3
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -750,9 +756,9 @@
           "@type" : "g:Int32",
           "@value" : 24
         },
-        "label" : "uses",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "uses" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 10
@@ -762,7 +768,7 @@
           "@value" : 9
         },
         "properties" : {
-          "skill" : {
+          "skill" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "skill",
@@ -771,7 +777,7 @@
                 "@value" : 5
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -781,9 +787,9 @@
           "@type" : "g:Int32",
           "@value" : 25
         },
-        "label" : "uses",
-        "inVLabel" : "software",
-        "outVLabel" : "person",
+        "label" : [ "uses" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "person" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 11
@@ -793,7 +799,7 @@
           "@value" : 9
         },
         "properties" : {
-          "skill" : {
+          "skill" : [ {
             "@type" : "g:Property",
             "@value" : {
               "key" : "skill",
@@ -802,7 +808,7 @@
                 "@value" : 3
               }
             }
-          }
+          } ]
         }
       }
     }, {
@@ -812,9 +818,9 @@
           "@type" : "g:Int32",
           "@value" : 26
         },
-        "label" : "traverses",
-        "inVLabel" : "software",
-        "outVLabel" : "software",
+        "label" : [ "traverses" ],
+        "inVLabel" : [ "software" ],
+        "outVLabel" : [ "software" ],
         "inV" : {
           "@type" : "g:Int32",
           "@value" : 11
@@ -822,7 +828,8 @@
         "outV" : {
           "@type" : "g:Int32",
           "@value" : 10
-        }
+        },
+        "properties" : { }
       }
     } ]
   }
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-edge-v4-no-types.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-edge-v4-no-types.json
index 0f7f1682d1..26c92ee5fd 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-edge-v4-no-types.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-edge-v4-no-types.json
@@ -1,12 +1,12 @@
 {
   "id" : 13,
-  "label" : "develops",
+  "label" : [ "develops" ],
   "type" : "edge",
-  "inVLabel" : "software",
-  "outVLabel" : "person",
+  "inVLabel" : [ "software" ],
+  "outVLabel" : [ "person" ],
   "inV" : 10,
   "outV" : 1,
   "properties" : {
-    "since" : 2009
+    "since" : [ 2009 ]
   }
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-edge-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-edge-v4.json
index ba1c52eb1e..cc13e232a8 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-edge-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-edge-v4.json
@@ -5,9 +5,9 @@
       "@type" : "g:Int32",
       "@value" : 13
     },
-    "label" : "develops",
-    "inVLabel" : "software",
-    "outVLabel" : "person",
+    "label" : [ "develops" ],
+    "inVLabel" : [ "software" ],
+    "outVLabel" : [ "person" ],
     "inV" : {
       "@type" : "g:Int32",
       "@value" : 10
@@ -17,7 +17,7 @@
       "@value" : 1
     },
     "properties" : {
-      "since" : {
+      "since" : [ {
         "@type" : "g:Property",
         "@value" : {
           "key" : "since",
@@ -26,7 +26,7 @@
             "@value" : 2009
           }
         }
-      }
+      } ]
     }
   }
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-path-v4-no-types.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-path-v4-no-types.json
index 8919b3e6f4..060c0f9d49 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-path-v4-no-types.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-path-v4-no-types.json
@@ -2,15 +2,18 @@
   "labels" : [ [ ], [ ], [ ] ],
   "objects" : [ {
     "id" : 1,
-    "label" : "person",
-    "type" : "vertex"
+    "label" : [ "person" ],
+    "type" : "vertex",
+    "properties" : { }
   }, {
     "id" : 10,
-    "label" : "software",
-    "type" : "vertex"
+    "label" : [ "software" ],
+    "type" : "vertex",
+    "properties" : { }
   }, {
     "id" : 11,
-    "label" : "software",
-    "type" : "vertex"
+    "label" : [ "software" ],
+    "type" : "vertex",
+    "properties" : { }
   } ]
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-path-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-path-v4.json
index 216b39354d..c291323752 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-path-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-path-v4.json
@@ -23,7 +23,8 @@
             "@type" : "g:Int32",
             "@value" : 1
           },
-          "label" : "person"
+          "label" : [ "person" ],
+          "properties" : { }
         }
       }, {
         "@type" : "g:Vertex",
@@ -32,7 +33,8 @@
             "@type" : "g:Int32",
             "@value" : 10
           },
-          "label" : "software"
+          "label" : [ "software" ],
+          "properties" : { }
         }
       }, {
         "@type" : "g:Vertex",
@@ -41,7 +43,8 @@
             "@type" : "g:Int32",
             "@value" : 11
           },
-          "label" : "software"
+          "label" : [ "software" ],
+          "properties" : { }
         }
       } ]
     }
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-tree-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-tree-v4.json
index 25b1f99d17..acfb6fb925 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-tree-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-tree-v4.json
@@ -8,7 +8,7 @@
           "@type" : "g:Int32",
           "@value" : 10
         },
-        "label" : "software",
+        "label" : [ "software" ],
         "properties" : {
           "name" : [ {
             "@type" : "g:VertexProperty",
@@ -18,7 +18,8 @@
                 "@value" : 4
               },
               "value" : "gremlin",
-              "label" : "name"
+              "label" : [ "name" ],
+              "properties" : { }
             }
           } ]
         }
@@ -34,7 +35,7 @@
               "@type" : "g:Int32",
               "@value" : 11
             },
-            "label" : "software",
+            "label" : [ "software" ],
             "properties" : {
               "name" : [ {
                 "@type" : "g:VertexProperty",
@@ -44,7 +45,8 @@
                     "@value" : 5
                   },
                   "value" : "tinkergraph",
-                  "label" : "name"
+                  "label" : [ "name" ],
+                  "properties" : { }
                 }
               } ]
             }
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertex-v4-no-types.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertex-v4-no-types.json
index a885f58b6f..e2418dac20 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertex-v4-no-types.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertex-v4-no-types.json
@@ -1,11 +1,12 @@
 {
   "id" : 1,
-  "label" : "person",
+  "label" : [ "person" ],
   "type" : "vertex",
   "properties" : {
     "name" : [ {
       "id" : 0,
-      "value" : "marko"
+      "value" : "marko",
+      "properties" : { }
     } ],
     "location" : [ {
       "id" : 6,
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertex-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertex-v4.json
index f10223032f..f6a81d70b3 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertex-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertex-v4.json
@@ -5,7 +5,7 @@
       "@type" : "g:Int32",
       "@value" : 1
     },
-    "label" : "person",
+    "label" : [ "person" ],
     "properties" : {
       "name" : [ {
         "@type" : "g:VertexProperty",
@@ -15,7 +15,8 @@
             "@value" : 0
           },
           "value" : "marko",
-          "label" : "name"
+          "label" : [ "name" ],
+          "properties" : { }
         }
       } ],
       "location" : [ {
@@ -26,7 +27,7 @@
             "@value" : 6
           },
           "value" : "san diego",
-          "label" : "location",
+          "label" : [ "location" ],
           "properties" : {
             "startTime" : {
               "@type" : "g:Int32",
@@ -46,7 +47,7 @@
             "@value" : 7
           },
           "value" : "santa cruz",
-          "label" : "location",
+          "label" : [ "location" ],
           "properties" : {
             "startTime" : {
               "@type" : "g:Int32",
@@ -66,7 +67,7 @@
             "@value" : 8
           },
           "value" : "brussels",
-          "label" : "location",
+          "label" : [ "location" ],
           "properties" : {
             "startTime" : {
               "@type" : "g:Int32",
@@ -86,7 +87,7 @@
             "@value" : 9
           },
           "value" : "santa fe",
-          "label" : "location",
+          "label" : [ "location" ],
           "properties" : {
             "startTime" : {
               "@type" : "g:Int32",
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertexproperty-v4-no-types.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertexproperty-v4-no-types.json
index 74025a80e8..dc096869f6 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertexproperty-v4-no-types.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertexproperty-v4-no-types.json
@@ -1,5 +1,6 @@
 {
   "id" : 0,
   "value" : "marko",
-  "label" : "name"
+  "label" : [ "name" ],
+  "properties" : { }
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertexproperty-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertexproperty-v4.json
index af184b1766..726823e926 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertexproperty-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertexproperty-v4.json
@@ -6,6 +6,7 @@
       "@value" : 0
     },
     "value" : "marko",
-    "label" : "name"
+    "label" : [ "name" ],
+    "properties" : { }
   }
 }
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/vertex-traverser-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/vertex-traverser-v4.json
index a59a29e9da..08c15e96da 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/vertex-traverser-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/vertex-traverser-v4.json
@@ -12,7 +12,7 @@
           "@type" : "g:Int32",
           "@value" : 1
         },
-        "label" : "person",
+        "label" : [ "person" ],
         "properties" : {
           "name" : [ {
             "@type" : "g:VertexProperty",
@@ -22,7 +22,8 @@
                 "@value" : 0
               },
               "value" : "marko",
-              "label" : "name"
+              "label" : [ "name" ],
+              "properties" : { }
             }
           } ],
           "location" : [ {
@@ -33,7 +34,7 @@
                 "@value" : 6
               },
               "value" : "san diego",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -53,7 +54,7 @@
                 "@value" : 7
               },
               "value" : "santa cruz",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -73,7 +74,7 @@
                 "@value" : 8
               },
               "value" : "brussels",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
@@ -93,7 +94,7 @@
                 "@value" : 9
               },
               "value" : "santa fe",
-              "label" : "location",
+              "label" : [ "location" ],
               "properties" : {
                 "startTime" : {
                   "@type" : "g:Int32",
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/zero-duration-v4.json
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/zero-duration-v4.json
index e14db84027..146966f74e 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/zero-duration-v4.json
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/zero-duration-v4.json
@@ -1,4 +1,4 @@
 {
-  "@type" : "gx:Duration",
+  "@type" : "g:Duration",
   "@value" : "PT0S"
 }
\ No newline at end of file
diff --git 
a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java
 
b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java
index 15cf3c5a29..bfa600e2f2 100644
--- 
a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java
+++ 
b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java
@@ -32,6 +32,7 @@ import 
org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
 import 
org.apache.tinkerpop.gremlin.util.ser.GraphSONUntypedMessageSerializerV4;
 import org.junit.Test;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -56,17 +57,17 @@ public abstract class AbstractUntypedCompatibilityTest 
extends AbstractCompatibi
         final HashMap recycled = read(bytes, HashMap.class);
         assertNotSame(fromStatic, recycled);
         assertEquals(resource.id(), fromStatic.get("id"));
-        assertEquals(resource.label(), fromStatic.get("label"));
+        assertEquals(Collections.singletonList(resource.label()), 
fromStatic.get("label"));
         assertEquals(resource.id(), fromStatic.get("id"));
-        assertEquals(resource.inVertex().label(), fromStatic.get("inVLabel"));
-        assertEquals(resource.outVertex().label(), 
fromStatic.get("outVLabel"));
+        assertEquals(Collections.singletonList(resource.inVertex().label()), 
fromStatic.get("inVLabel"));
+        assertEquals(Collections.singletonList(resource.outVertex().label()), 
fromStatic.get("outVLabel"));
         assertEquals(resource.inVertex().id(), fromStatic.get("inV"));
         assertEquals(resource.outVertex().id(), fromStatic.get("outV"));
         assertEquals(resource.id(), recycled.get("id"));
-        assertEquals(resource.label(), recycled.get("label"));
+        assertEquals(Collections.singletonList(resource.label()), 
recycled.get("label"));
         assertEquals(resource.id(), recycled.get("id"));
-        assertEquals(resource.inVertex().label(), recycled.get("inVLabel"));
-        assertEquals(resource.outVertex().label(), recycled.get("outVLabel"));
+        assertEquals(Collections.singletonList(resource.inVertex().label()), 
recycled.get("inVLabel"));
+        assertEquals(Collections.singletonList(resource.outVertex().label()), 
recycled.get("outVLabel"));
         assertEquals(resource.inVertex().id(), recycled.get("inV"));
         assertEquals(resource.outVertex().id(), recycled.get("outV"));
 
@@ -103,22 +104,22 @@ public abstract class AbstractUntypedCompatibilityTest 
extends AbstractCompatibi
         assertEquals(resource.labels().get(2).size(), ((List) ((List) 
fromStatic.get("labels")).get(2)).size());
         assertEquals(resource.objects().size(), ((List) 
fromStatic.get("objects")).size());
         assertEquals(((Vertex) resource.objects().get(0)).id(), ((Map) ((List) 
fromStatic.get("objects")).get(0)).get("id"));
-        assertEquals(((Vertex) resource.objects().get(0)).label(), ((Map) 
((List) fromStatic.get("objects")).get(0)).get("label"));
+        assertEquals(Collections.singletonList(((Vertex) 
resource.objects().get(0)).label()), ((Map) ((List) 
fromStatic.get("objects")).get(0)).get("label"));
         assertEquals(((Vertex) resource.objects().get(1)).id(), ((Map) ((List) 
fromStatic.get("objects")).get(1)).get("id"));
-        assertEquals(((Vertex) resource.objects().get(1)).label(), ((Map) 
((List) fromStatic.get("objects")).get(1)).get("label"));
+        assertEquals(Collections.singletonList(((Vertex) 
resource.objects().get(1)).label()), ((Map) ((List) 
fromStatic.get("objects")).get(1)).get("label"));
         assertEquals(((Vertex) resource.objects().get(2)).id(), ((Map) ((List) 
fromStatic.get("objects")).get(2)).get("id"));
-        assertEquals(((Vertex) resource.objects().get(2)).label(), ((Map) 
((List) fromStatic.get("objects")).get(2)).get("label"));
+        assertEquals(Collections.singletonList(((Vertex) 
resource.objects().get(2)).label()), ((Map) ((List) 
fromStatic.get("objects")).get(2)).get("label"));
         assertEquals(resource.labels().size(), ((List) 
recycled.get("labels")).size());
         assertEquals(resource.labels().get(0).size(), ((List) ((List) 
recycled.get("labels")).get(0)).size());
         assertEquals(resource.labels().get(1).size(), ((List) ((List) 
recycled.get("labels")).get(1)).size());
         assertEquals(resource.labels().get(2).size(), ((List) ((List) 
recycled.get("labels")).get(2)).size());
         assertEquals(resource.objects().size(), ((List) 
recycled.get("objects")).size());
         assertEquals(((Vertex) resource.objects().get(0)).id(), ((Map) ((List) 
recycled.get("objects")).get(0)).get("id"));
-        assertEquals(((Vertex) resource.objects().get(0)).label(), ((Map) 
((List) recycled.get("objects")).get(0)).get("label"));
+        assertEquals(Collections.singletonList(((Vertex) 
resource.objects().get(0)).label()), ((Map) ((List) 
recycled.get("objects")).get(0)).get("label"));
         assertEquals(((Vertex) resource.objects().get(1)).id(), ((Map) ((List) 
recycled.get("objects")).get(1)).get("id"));
-        assertEquals(((Vertex) resource.objects().get(1)).label(), ((Map) 
((List) recycled.get("objects")).get(1)).get("label"));
+        assertEquals(Collections.singletonList(((Vertex) 
resource.objects().get(1)).label()), ((Map) ((List) 
recycled.get("objects")).get(1)).get("label"));
         assertEquals(((Vertex) resource.objects().get(2)).id(), ((Map) ((List) 
recycled.get("objects")).get(2)).get("id"));
-        assertEquals(((Vertex) resource.objects().get(2)).label(), ((Map) 
((List) recycled.get("objects")).get(2)).get("label"));
+        assertEquals(Collections.singletonList(((Vertex) 
resource.objects().get(2)).label()), ((Map) ((List) 
recycled.get("objects")).get(2)).get("label"));
     }
 
     @Test
@@ -148,10 +149,10 @@ public abstract class AbstractUntypedCompatibilityTest 
extends AbstractCompatibi
         final HashMap recycled = read(bytes, HashMap.class);
         assertNotSame(fromStatic, recycled);
         assertEquals(resource.id(), fromStatic.get("id"));
-        assertEquals(resource.label(), fromStatic.get("label"));
+        assertEquals(Collections.singletonList(resource.label()), 
fromStatic.get("label"));
         assertEquals(resource.id(), fromStatic.get("id"));
         assertEquals(resource.id(), recycled.get("id"));
-        assertEquals(resource.label(), recycled.get("label"));
+        assertEquals(Collections.singletonList(resource.label()), 
recycled.get("label"));
         assertEquals(resource.id(), recycled.get("id"));
         assertEquals(IteratorUtils.count(resource.keys()), ((Map) 
fromStatic.get("properties")).size());
         assertEquals(resource.value("name"), ((Map) ((List) ((Map) 
fromStatic.get("properties")).get("name")).get(0)).get("value"));
@@ -193,13 +194,15 @@ public abstract class AbstractUntypedCompatibilityTest 
extends AbstractCompatibi
         final HashMap fromStatic = read(readFromResource(resourceName), 
HashMap.class);
         final HashMap recycled = read(bytes, HashMap.class);
         assertNotSame(fromStatic, recycled);
-        assertEquals(3, fromStatic.size());
+        assertEquals(4, fromStatic.size());
         assertEquals(resource.id().toString(), 
fromStatic.get("id").toString());
-        assertEquals(resource.key(), fromStatic.get("label"));
+        assertEquals(Collections.singletonList(resource.key()), 
fromStatic.get("label"));
         assertEquals(resource.value(), fromStatic.get("value"));
-        assertEquals(3, recycled.size());
+        assertEquals(Collections.emptyMap(), fromStatic.get("properties"));
+        assertEquals(4, recycled.size());
         assertEquals(resource.id().toString(), 
fromStatic.get("id").toString());
-        assertEquals(resource.key(), recycled.get("label"));
+        assertEquals(Collections.singletonList(resource.key()), 
recycled.get("label"));
         assertEquals(resource.value(), recycled.get("value"));
+        assertEquals(Collections.emptyMap(), recycled.get("properties"));
     }
 }
diff --git 
a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistryV4.java
 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistryV4.java
index 5d5bea9153..8ae666c95f 100644
--- 
a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistryV4.java
+++ 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistryV4.java
@@ -134,7 +134,7 @@ public final class TinkerIoRegistryV4 extends 
AbstractIoRegistry {
 
         @Override
         public String getTypeNamespace() {
-            return "tinker";
+            return GraphSONTokens.GREMLIN_TYPE_NAMESPACE;
         }
     }
 

Reply via email to