You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ke...@apache.org on 2024/09/24 06:20:44 UTC

(tinkerpop) branch v4-graphson-updates updated (5de7c284f4 -> b479dce98c)

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

kenhuuu pushed a change to branch v4-graphson-updates
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


 discard 5de7c284f4 Update GraphSONv4 labels, extended type names and edge properties.
     new b479dce98c Update GraphSONv4 labels, extended type names and edge properties.

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (5de7c284f4)
            \
             N -- N -- N   refs/heads/v4-graphson-updates (b479dce98c)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java      | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)


(tinkerpop) 01/01: Update GraphSONv4 labels, extended type names and edge properties.

Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit b479dce98c63f185be25a0013834d437e776c2d3
Author: Ken Hu <10...@users.noreply.github.com>
AuthorDate: Mon Sep 23 11:37:57 2024 -0700

    Update GraphSONv4 labels, extended type names and edge properties.
---
 .../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;
         }
     }