blob: 4b2f89a20ead11a087329359241543ae0cddafb3 [file] [log] [blame]
////
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
////
[[graphson]]
= GraphSON
image:gremlin-graphson.png[width=350,float=left] GraphSON is a JSON-based format that is designed for human readable
output that is easily supported in any programming language through the wide-array of JSON parsing libraries that
exist on virtually all platforms. GraphSON is considered both a "graph" format and a generalized object serialization
format. That characteristic makes it useful as a serialization format for Gremlin Server where arbitrary objects
of varying types may be returned as results.
When considering GraphSON as a "graph" format, the relevant feature to consider is the `writeGraph` and `readGraph`
methods on the `GraphSONWriter` and `GraphSONReader` interfaces, respectively. These methods write the entire `Graph`
instance as output or read an entire `Graph` instance input and they do so in a way external to generalized object
serialization. In other words, the output of:
[source,java]
----
final Graph graph = TinkerFactory.createModern();
final GraphWriter writer = graph.io(IoCore.graphson()).writer();
writer.writeGraph("tinkerpop-modern.json");
----
will be different of:
[source,java]
----
final Graph graph = TinkerFactory.createModern();
final GraphWriter writer = graph.io(IoCore.graphson()).writer();
final OutputStream os = new FileOutputStream("tinkerpop-modern.json");
writer.writeObject(os, graph);
----
Generalized object serialization will be discussed later in this section, so for now the focus will be on the "graph"
format. Unlike GraphML, GraphSON does not use an edge list format. It uses an adjacency list. In the adjacency list,
each vertex is essentially a line in the file and the vertex line contains a list of all the edges associated with
that vertex. The GraphSON 3.0 representation looks like this for the Modern toy graph:
[source,json]
----
{"id":{"@type":"g:Int32","@value":1},"label":"person","outE":{"created":[{"id":{"@type":"g:Int32","@value":9},"inV":{"@type":"g:Int32","@value":3},"properties":{"weight":{"@type":"g:Double","@value":0.4}}}],"knows":[{"id":{"@type":"g:Int32","@value":7},"inV":{"@type":"g:Int32","@value":2},"properties":{"weight":{"@type":"g:Double","@value":0.5}}},{"id":{"@type":"g:Int32","@value":8},"inV":{"@type":"g:Int32","@value":4},"properties":{"weight":{"@type":"g:Double","@value":1.0}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":0},"value":"marko"}],"age":[{"id":{"@type":"g:Int64","@value":1},"value":{"@type":"g:Int32","@value":29}}]}}
{"id":{"@type":"g:Int32","@value":2},"label":"person","inE":{"knows":[{"id":{"@type":"g:Int32","@value":7},"outV":{"@type":"g:Int32","@value":1},"properties":{"weight":{"@type":"g:Double","@value":0.5}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":2},"value":"vadas"}],"age":[{"id":{"@type":"g:Int64","@value":3},"value":{"@type":"g:Int32","@value":27}}]}}
{"id":{"@type":"g:Int32","@value":3},"label":"software","inE":{"created":[{"id":{"@type":"g:Int32","@value":9},"outV":{"@type":"g:Int32","@value":1},"properties":{"weight":{"@type":"g:Double","@value":0.4}}},{"id":{"@type":"g:Int32","@value":11},"outV":{"@type":"g:Int32","@value":4},"properties":{"weight":{"@type":"g:Double","@value":0.4}}},{"id":{"@type":"g:Int32","@value":12},"outV":{"@type":"g:Int32","@value":6},"properties":{"weight":{"@type":"g:Double","@value":0.2}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":4},"value":"lop"}],"lang":[{"id":{"@type":"g:Int64","@value":5},"value":"java"}]}}
{"id":{"@type":"g:Int32","@value":4},"label":"person","inE":{"knows":[{"id":{"@type":"g:Int32","@value":8},"outV":{"@type":"g:Int32","@value":1},"properties":{"weight":{"@type":"g:Double","@value":1.0}}}]},"outE":{"created":[{"id":{"@type":"g:Int32","@value":10},"inV":{"@type":"g:Int32","@value":5},"properties":{"weight":{"@type":"g:Double","@value":1.0}}},{"id":{"@type":"g:Int32","@value":11},"inV":{"@type":"g:Int32","@value":3},"properties":{"weight":{"@type":"g:Double","@value":0.4}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":6},"value":"josh"}],"age":[{"id":{"@type":"g:Int64","@value":7},"value":{"@type":"g:Int32","@value":32}}]}}
{"id":{"@type":"g:Int32","@value":5},"label":"software","inE":{"created":[{"id":{"@type":"g:Int32","@value":10},"outV":{"@type":"g:Int32","@value":4},"properties":{"weight":{"@type":"g:Double","@value":1.0}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":8},"value":"ripple"}],"lang":[{"id":{"@type":"g:Int64","@value":9},"value":"java"}]}}
{"id":{"@type":"g:Int32","@value":6},"label":"person","outE":{"created":[{"id":{"@type":"g:Int32","@value":12},"inV":{"@type":"g:Int32","@value":3},"properties":{"weight":{"@type":"g:Double","@value":0.2}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":10},"value":"peter"}],"age":[{"id":{"@type":"g:Int64","@value":11},"value":{"@type":"g:Int32","@value":35}}]}}
----
At a glance, one can see that this is not a valid JSON document. While that form may seem incorrect, there is a reason.
The "graph" format is designed by default to be splittable, such that distributed systems like Spark can easily divide
the GraphSON file for processing. If this data were represented as an "array of vertices" with square brackets at the
beginning and end of the file, the format would be less conducive to fit that purpose. It is possible to change this
behavior by building the `GraphSONWriter` with the `wrapAdjacencyList` setting set to `true`, in which case the output
will be a valid JSON document that looks like this:
[source,json]
----
{ "vertices": [
{"id":{"@type":"g:Int32","@value":1},"label":"person","outE":{"created":[{"id":{"@type":"g:Int32","@value":9},"inV":{"@type":"g:Int32","@value":3},"properties":{"weight":{"@type":"g:Double","@value":0.4}}}],"knows":[{"id":{"@type":"g:Int32","@value":7},"inV":{"@type":"g:Int32","@value":2},"properties":{"weight":{"@type":"g:Double","@value":0.5}}},{"id":{"@type":"g:Int32","@value":8},"inV":{"@type":"g:Int32","@value":4},"properties":{"weight":{"@type":"g:Double","@value":1.0}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":0},"value":"marko"}],"age":[{"id":{"@type":"g:Int64","@value":1},"value":{"@type":"g:Int32","@value":29}}]}}
{"id":{"@type":"g:Int32","@value":2},"label":"person","inE":{"knows":[{"id":{"@type":"g:Int32","@value":7},"outV":{"@type":"g:Int32","@value":1},"properties":{"weight":{"@type":"g:Double","@value":0.5}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":2},"value":"vadas"}],"age":[{"id":{"@type":"g:Int64","@value":3},"value":{"@type":"g:Int32","@value":27}}]}}
{"id":{"@type":"g:Int32","@value":3},"label":"software","inE":{"created":[{"id":{"@type":"g:Int32","@value":9},"outV":{"@type":"g:Int32","@value":1},"properties":{"weight":{"@type":"g:Double","@value":0.4}}},{"id":{"@type":"g:Int32","@value":11},"outV":{"@type":"g:Int32","@value":4},"properties":{"weight":{"@type":"g:Double","@value":0.4}}},{"id":{"@type":"g:Int32","@value":12},"outV":{"@type":"g:Int32","@value":6},"properties":{"weight":{"@type":"g:Double","@value":0.2}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":4},"value":"lop"}],"lang":[{"id":{"@type":"g:Int64","@value":5},"value":"java"}]}}
{"id":{"@type":"g:Int32","@value":4},"label":"person","inE":{"knows":[{"id":{"@type":"g:Int32","@value":8},"outV":{"@type":"g:Int32","@value":1},"properties":{"weight":{"@type":"g:Double","@value":1.0}}}]},"outE":{"created":[{"id":{"@type":"g:Int32","@value":10},"inV":{"@type":"g:Int32","@value":5},"properties":{"weight":{"@type":"g:Double","@value":1.0}}},{"id":{"@type":"g:Int32","@value":11},"inV":{"@type":"g:Int32","@value":3},"properties":{"weight":{"@type":"g:Double","@value":0.4}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":6},"value":"josh"}],"age":[{"id":{"@type":"g:Int64","@value":7},"value":{"@type":"g:Int32","@value":32}}]}}
{"id":{"@type":"g:Int32","@value":5},"label":"software","inE":{"created":[{"id":{"@type":"g:Int32","@value":10},"outV":{"@type":"g:Int32","@value":4},"properties":{"weight":{"@type":"g:Double","@value":1.0}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":8},"value":"ripple"}],"lang":[{"id":{"@type":"g:Int64","@value":9},"value":"java"}]}}
{"id":{"@type":"g:Int32","@value":6},"label":"person","outE":{"created":[{"id":{"@type":"g:Int32","@value":12},"inV":{"@type":"g:Int32","@value":3},"properties":{"weight":{"@type":"g:Double","@value":0.2}}}]},"properties":{"name":[{"id":{"@type":"g:Int64","@value":10},"value":"peter"}],"age":[{"id":{"@type":"g:Int64","@value":11},"value":{"@type":"g:Int32","@value":35}}]}}
]}
----
NOTE: The `writeGraph` method essentially calls `writeVertices` with the directionality of `BOTH`. The `writeVertices`
method simply calls `writeVertex` which detaches each `Vertex` instance into a directional `StarGraph` which forms
the basis for the format.
The following sections discuss the GraphSON object serialization format as available in each version of GraphSON. Core
to understanding these sections is to understand that GraphSON can be produced with and without types being embedded
in the output. Without embedded types, the type system is restricted to standard JSON types of `Object`, `List`,
`String`, `Number`, `Boolean` and that will lead to "lossyness" in the format (i.e. a float will be interpreted as
double). It is also worth considering that choosing a GraphSON format without embedded types may also restrict the
type of results that can be obtained. For example, `g.V().groupCount()` returns a format with a `Map`. That's fine
for GraphSON, but the key in that `Map` is a complex object (i.e. a `Vertex`) and as such is not compatible with JSON
itself which can only support `String` keys.
WARNING: The `application/json` mime type is shared with all versions of GraphSON and their variations and does not
reflect a particular one. Servers will return the GraphSON version and variation that this mime type is configured for
and it could be different (or change) from server to server. When building applications, it is recommended that the
mime type is made explicit on requests to avoid breaking changes or unexpected results.
[[graphson-1d0]]
== Version 1.0
Version 1.0 of GraphSON was released with TinkerPop 3.0.0. It is referred to by the following mime types:
* `application/vnd.gremlin-v1.0+json` - types embedded
* `application/vnd.gremlin-v1.0+json;types=false` - no types embedded
When types are embedded, GraphSON uses the standard
link:https://github.com/FasterXML/jackson-databind[Jackson] type embedding approach that writes the full Java class
name into a "@class" field in the JSON. While this approach isn't especially language agnostic it does at least give
some hint as to what the expected type is.
This section focuses on non-embedded types and their formats as there was little usage of embedded types in generalized
object serialization use cases. The format was simply too cumbersome to parse of non-Jackson enabled libraries and the
use cases for it were limited. <<graphson-2d0,GraphSON Version 2.0>> attempts to improve upon this limitation.
=== Graph Structure
==== Edge
[source,json]
----
{
"id" : 13,
"label" : "develops",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 10,
"outV" : 1,
"properties" : {
"since" : 2009
}
}
----
==== Path
[source,json]
----
{
"labels" : [ [ ], [ ], [ ] ],
"objects" : [ {
"id" : 1,
"label" : "person",
"type" : "vertex",
"properties" : {
"name" : [ {
"id" : 0,
"value" : "marko"
} ],
"location" : [ {
"id" : 6,
"value" : "san diego",
"properties" : {
"startTime" : 1997,
"endTime" : 2001
}
}, {
"id" : 7,
"value" : "santa cruz",
"properties" : {
"startTime" : 2001,
"endTime" : 2004
}
}, {
"id" : 8,
"value" : "brussels",
"properties" : {
"startTime" : 2004,
"endTime" : 2005
}
}, {
"id" : 9,
"value" : "santa fe",
"properties" : {
"startTime" : 2005
}
} ]
}
}, {
"id" : 10,
"label" : "software",
"type" : "vertex",
"properties" : {
"name" : [ {
"id" : 4,
"value" : "gremlin"
} ]
}
}, {
"id" : 11,
"label" : "software",
"type" : "vertex",
"properties" : {
"name" : [ {
"id" : 5,
"value" : "tinkergraph"
} ]
}
} ]
}
----
==== Property
[source,json]
----
{
"key" : "since",
"value" : 2009
}
----
==== TinkerGraph
`TinkerGraph` has a custom serializer that is registered as part of the `TinkerIoRegistry`.
[source,json]
----
{
"vertices" : [ {
"id" : 1,
"label" : "person",
"type" : "vertex",
"properties" : {
"name" : [ {
"id" : 0,
"value" : "marko"
} ],
"location" : [ {
"id" : 6,
"value" : "san diego",
"properties" : {
"startTime" : 1997,
"endTime" : 2001
}
}, {
"id" : 7,
"value" : "santa cruz",
"properties" : {
"startTime" : 2001,
"endTime" : 2004
}
}, {
"id" : 8,
"value" : "brussels",
"properties" : {
"startTime" : 2004,
"endTime" : 2005
}
}, {
"id" : 9,
"value" : "santa fe",
"properties" : {
"startTime" : 2005
}
} ]
}
}, {
"id" : 7,
"label" : "person",
"type" : "vertex",
"properties" : {
"name" : [ {
"id" : 1,
"value" : "stephen"
} ],
"location" : [ {
"id" : 10,
"value" : "centreville",
"properties" : {
"startTime" : 1990,
"endTime" : 2000
}
}, {
"id" : 11,
"value" : "dulles",
"properties" : {
"startTime" : 2000,
"endTime" : 2006
}
}, {
"id" : 12,
"value" : "purcellville",
"properties" : {
"startTime" : 2006
}
} ]
}
}, {
"id" : 8,
"label" : "person",
"type" : "vertex",
"properties" : {
"name" : [ {
"id" : 2,
"value" : "matthias"
} ],
"location" : [ {
"id" : 13,
"value" : "bremen",
"properties" : {
"startTime" : 2004,
"endTime" : 2007
}
}, {
"id" : 14,
"value" : "baltimore",
"properties" : {
"startTime" : 2007,
"endTime" : 2011
}
}, {
"id" : 15,
"value" : "oakland",
"properties" : {
"startTime" : 2011,
"endTime" : 2014
}
}, {
"id" : 16,
"value" : "seattle",
"properties" : {
"startTime" : 2014
}
} ]
}
}, {
"id" : 9,
"label" : "person",
"type" : "vertex",
"properties" : {
"name" : [ {
"id" : 3,
"value" : "daniel"
} ],
"location" : [ {
"id" : 17,
"value" : "spremberg",
"properties" : {
"startTime" : 1982,
"endTime" : 2005
}
}, {
"id" : 18,
"value" : "kaiserslautern",
"properties" : {
"startTime" : 2005,
"endTime" : 2009
}
}, {
"id" : 19,
"value" : "aachen",
"properties" : {
"startTime" : 2009
}
} ]
}
}, {
"id" : 10,
"label" : "software",
"type" : "vertex",
"properties" : {
"name" : [ {
"id" : 4,
"value" : "gremlin"
} ]
}
}, {
"id" : 11,
"label" : "software",
"type" : "vertex",
"properties" : {
"name" : [ {
"id" : 5,
"value" : "tinkergraph"
} ]
}
} ],
"edges" : [ {
"id" : 13,
"label" : "develops",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 10,
"outV" : 1,
"properties" : {
"since" : 2009
}
}, {
"id" : 14,
"label" : "develops",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 11,
"outV" : 1,
"properties" : {
"since" : 2010
}
}, {
"id" : 15,
"label" : "uses",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 10,
"outV" : 1,
"properties" : {
"skill" : 4
}
}, {
"id" : 16,
"label" : "uses",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 11,
"outV" : 1,
"properties" : {
"skill" : 5
}
}, {
"id" : 17,
"label" : "develops",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 10,
"outV" : 7,
"properties" : {
"since" : 2010
}
}, {
"id" : 18,
"label" : "develops",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 11,
"outV" : 7,
"properties" : {
"since" : 2011
}
}, {
"id" : 19,
"label" : "uses",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 10,
"outV" : 7,
"properties" : {
"skill" : 5
}
}, {
"id" : 20,
"label" : "uses",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 11,
"outV" : 7,
"properties" : {
"skill" : 4
}
}, {
"id" : 21,
"label" : "develops",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 10,
"outV" : 8,
"properties" : {
"since" : 2012
}
}, {
"id" : 22,
"label" : "uses",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 10,
"outV" : 8,
"properties" : {
"skill" : 3
}
}, {
"id" : 23,
"label" : "uses",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 11,
"outV" : 8,
"properties" : {
"skill" : 3
}
}, {
"id" : 24,
"label" : "uses",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 10,
"outV" : 9,
"properties" : {
"skill" : 5
}
}, {
"id" : 25,
"label" : "uses",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : 11,
"outV" : 9,
"properties" : {
"skill" : 3
}
}, {
"id" : 26,
"label" : "traverses",
"type" : "edge",
"inVLabel" : "software",
"outVLabel" : "software",
"inV" : 11,
"outV" : 10
} ]
}
----
==== Vertex
[source,json]
----
{
"id" : 1,
"label" : "person",
"type" : "vertex",
"properties" : {
"name" : [ {
"id" : 0,
"value" : "marko"
} ],
"location" : [ {
"id" : 6,
"value" : "san diego",
"properties" : {
"startTime" : 1997,
"endTime" : 2001
}
}, {
"id" : 7,
"value" : "santa cruz",
"properties" : {
"startTime" : 2001,
"endTime" : 2004
}
}, {
"id" : 8,
"value" : "brussels",
"properties" : {
"startTime" : 2004,
"endTime" : 2005
}
}, {
"id" : 9,
"value" : "santa fe",
"properties" : {
"startTime" : 2005
}
} ]
}
}
----
==== VertexProperty
[source,json]
----
{
"id" : 0,
"value" : "marko",
"label" : "name"
}
----
=== RequestMessage
==== Authentication Response
The following `RequestMessage` is an example of the response that should be made to a SASL-based authentication challenge.
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "authentication",
"processor" : "",
"args" : {
"saslMechanism" : "PLAIN",
"sasl" : "AHN0ZXBocGhlbgBwYXNzd29yZA=="
}
}
----
==== Session Eval
The following `RequestMessage` is an example of a simple session request for a script evaluation with parameters.
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "eval",
"processor" : "session",
"args" : {
"gremlin" : "g.V(x)",
"language" : "gremlin-groovy",
"session" : "unique-session-identifier",
"bindings" : {
"x" : 1
}
}
}
----
==== Session Eval Aliased
The following `RequestMessage` is an example of a session request for a script evaluation with an alias that binds the `TraversalSource` of "g" to "social".
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "eval",
"processor" : "session",
"args" : {
"gremlin" : "social.V(x)",
"language" : "gremlin-groovy",
"aliases" : {
"g" : "social"
},
"session" : "unique-session-identifier",
"bindings" : {
"x" : 1
}
}
}
----
==== Session Close
The following `RequestMessage` is an example of a request to close a session.
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "close",
"processor" : "session",
"args" : {
"session" : "unique-session-identifier"
}
}
----
==== Sessionless Eval
The following `RequestMessage` is an example of a simple sessionless request for a script evaluation with parameters.
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "eval",
"processor" : "",
"args" : {
"gremlin" : "g.V(x)",
"language" : "gremlin-groovy",
"bindings" : {
"x" : 1
}
}
}
----
==== Sessionless Eval Aliased
The following `RequestMessage` is an example of a sessionless request for a script evaluation with an alias that binds the `TraversalSource` of "g" to "social".
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "eval",
"processor" : "",
"args" : {
"gremlin" : "social.V(x)",
"language" : "gremlin-groovy",
"aliases" : {
"g" : "social"
},
"bindings" : {
"x" : 1
}
}
}
----
=== ResponseMessage
==== Authentication Challenge
When authentication is enabled, an initial request to the server will result in an authentication challenge. The typical response message will appear as follows, but handling it could be different dependending on the SASL implementation (e.g. multiple challenges may be requested in some cases, but not in the default provided by Gremlin Server).
[source,json]
----
{
"requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
"status" : {
"message" : "",
"code" : 407,
"attributes" : { }
},
"result" : {
"data" : null,
"meta" : { }
}
}
----
==== Standard Result
The following `ResponseMessage` is a typical example of the typical successful response Gremlin Server will return when returning results from a script.
[source,json]
----
{
"requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
"status" : {
"message" : "",
"code" : 200,
"attributes" : { }
},
"result" : {
"data" : [ {
"id" : 1,
"label" : "person",
"type" : "vertex",
"properties" : {
"name" : [ {
"id" : 0,
"value" : "marko"
} ],
"location" : [ {
"id" : 6,
"value" : "san diego",
"properties" : {
"startTime" : 1997,
"endTime" : 2001
}
}, {
"id" : 7,
"value" : "santa cruz",
"properties" : {
"startTime" : 2001,
"endTime" : 2004
}
}, {
"id" : 8,
"value" : "brussels",
"properties" : {
"startTime" : 2004,
"endTime" : 2005
}
}, {
"id" : 9,
"value" : "santa fe",
"properties" : {
"startTime" : 2005
}
} ]
}
} ],
"meta" : { }
}
}
----
[[graphson-2d0]]
== Version 2.0
Version 2.0 of GraphSON was first introduced on TinkerPop 3.2.2. It was designed to be less tied to
link:https://github.com/FasterXML/jackson-databind[Jackson] (a JVM library) and to be less lossy as it pertained to
types. While the <<graphson-1d0,GraphSON 1.0>> section focused on GraphSON without embedded types, GraphSON 2.0 will
do the opposite as embedded types is the expected manner in which non-JVM languages will interact with TinkerPop.
GraphSON 2.0 is referred to by the following mime types:
* `application/vnd.gremlin-v2.0+json` - Values are typed by way of a "complex object" that defines a `@typeId` and
`@value`. The `@typeId` is composed of two parts: a namespace and a type name, in the format "namespace:typename". A
namespace allows TinkerPop providers and users to categorize custom types that they may implement and avoid collision
with existing TinkerPop types. By default, TinkerPop types will have the namespace "g" (or "gx" for "extended" types).
* `application/vnd.gremlin-v2.0+json;types=false` - Values do not have their types embedded in the JSON. This format
does not follow the 1.0 untyped format in that it does not include a "type" field for `Vertex` and `Edge` objects and
it serializes property values in those graph objects with a `label` field which is redundant as the "key" field for
that property will already represent that value.
=== Core
==== Class
[source,json]
----
{
"@type" : "g:Class",
"@value" : "java.io.File"
}
----
==== Date
Representing a millisecond-precision offset from the unix epoch. In Java, it is simply `Date.getTime()`.
[source,json]
----
{
"@type" : "g:Date",
"@value" : 1481750076295
}
----
==== Double
While the `@value` is expected to be a JSON number, it might also be a `String` of `NaN`, `Infinity` or `-Infinity`.
[source,json]
----
{
"@type" : "g:Double",
"@value" : 100.0
}
----
==== Float
[source,json]
----
{
"@type" : "g:Float",
"@value" : 100.0
}
----
==== Integer
[source,json]
----
{
"@type" : "g:Int32",
"@value" : 100
}
----
==== Long
[source,json]
----
{
"@type" : "g:Int64",
"@value" : 100
}
----
==== Timestamp
[source,json]
----
{
"@type" : "g:Timestamp",
"@value" : 1481750076295
}
----
==== UUID
[source,json]
----
{
"@type" : "g:UUID",
"@value" : "41d2e28a-20a4-4ab0-b379-d810dede3786"
}
----
=== Graph Structure
==== Edge
[source,json]
----
{
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 13
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 1
},
"properties" : {
"since" : {
"@type" : "g:Int32",
"@value" : 2009
}
}
}
}
----
==== Path
[source,json]
----
{
"@type" : "g:Path",
"@value" : {
"labels" : [ [ ], [ ], [ ] ],
"objects" : [ {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person"
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 10
},
"label" : "software",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 4
},
"value" : "gremlin",
"vertex" : {
"@type" : "g:Int32",
"@value" : 10
},
"label" : "name"
}
} ]
}
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 11
},
"label" : "software",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 5
},
"value" : "tinkergraph",
"vertex" : {
"@type" : "g:Int32",
"@value" : 11
},
"label" : "name"
}
} ]
}
}
} ]
}
}
----
==== Property
[source,json]
----
{
"@type" : "g:Property",
"@value" : {
"key" : "since",
"value" : {
"@type" : "g:Int32",
"@value" : 2009
},
"element" : {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 13
},
"label" : "develops",
"outV" : {
"@type" : "g:Int32",
"@value" : 1
},
"inV" : {
"@type" : "g:Int32",
"@value" : 10
}
}
}
}
}
----
==== StarGraph
[source,json]
----
{
"starVertex" : {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 6
},
"value" : "san diego",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1997
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2001
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 7
},
"value" : "santa cruz",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2001
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2004
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 8
},
"value" : "brussels",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 9
},
"value" : "santa fe",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
} ]
}
}
}
}
----
==== TinkerGraph
`TinkerGraph` has a custom serializer that is registered as part of the `TinkerIoRegistry`.
[source,json]
----
{
"@type" : "tinker:graph",
"@value" : {
"vertices" : [ {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 6
},
"value" : "san diego",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1997
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2001
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 7
},
"value" : "santa cruz",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2001
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2004
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 8
},
"value" : "brussels",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 9
},
"value" : "santa fe",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
} ]
}
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 7
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 1
},
"value" : "stephen",
"vertex" : {
"@type" : "g:Int32",
"@value" : 7
},
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 10
},
"value" : "centreville",
"vertex" : {
"@type" : "g:Int32",
"@value" : 7
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1990
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2000
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 11
},
"value" : "dulles",
"vertex" : {
"@type" : "g:Int32",
"@value" : 7
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2000
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2006
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 12
},
"value" : "purcellville",
"vertex" : {
"@type" : "g:Int32",
"@value" : 7
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2006
}
}
}
} ]
}
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 8
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 2
},
"value" : "matthias",
"vertex" : {
"@type" : "g:Int32",
"@value" : 8
},
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 13
},
"value" : "bremen",
"vertex" : {
"@type" : "g:Int32",
"@value" : 8
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2007
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 14
},
"value" : "baltimore",
"vertex" : {
"@type" : "g:Int32",
"@value" : 8
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2007
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2011
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 15
},
"value" : "oakland",
"vertex" : {
"@type" : "g:Int32",
"@value" : 8
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2011
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2014
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 16
},
"value" : "seattle",
"vertex" : {
"@type" : "g:Int32",
"@value" : 8
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2014
}
}
}
} ]
}
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 9
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 3
},
"value" : "daniel",
"vertex" : {
"@type" : "g:Int32",
"@value" : 9
},
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 17
},
"value" : "spremberg",
"vertex" : {
"@type" : "g:Int32",
"@value" : 9
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1982
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 18
},
"value" : "kaiserslautern",
"vertex" : {
"@type" : "g:Int32",
"@value" : 9
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2009
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 19
},
"value" : "aachen",
"vertex" : {
"@type" : "g:Int32",
"@value" : 9
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2009
}
}
}
} ]
}
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 10
},
"label" : "software",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 4
},
"value" : "gremlin",
"vertex" : {
"@type" : "g:Int32",
"@value" : 10
},
"label" : "name"
}
} ]
}
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 11
},
"label" : "software",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 5
},
"value" : "tinkergraph",
"vertex" : {
"@type" : "g:Int32",
"@value" : 11
},
"label" : "name"
}
} ]
}
}
} ],
"edges" : [ {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 13
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 1
},
"properties" : {
"since" : {
"@type" : "g:Int32",
"@value" : 2009
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 14
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 1
},
"properties" : {
"since" : {
"@type" : "g:Int32",
"@value" : 2010
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 15
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 1
},
"properties" : {
"skill" : {
"@type" : "g:Int32",
"@value" : 4
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 16
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 1
},
"properties" : {
"skill" : {
"@type" : "g:Int32",
"@value" : 5
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 17
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 7
},
"properties" : {
"since" : {
"@type" : "g:Int32",
"@value" : 2010
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 18
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 7
},
"properties" : {
"since" : {
"@type" : "g:Int32",
"@value" : 2011
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 19
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 7
},
"properties" : {
"skill" : {
"@type" : "g:Int32",
"@value" : 5
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 20
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 7
},
"properties" : {
"skill" : {
"@type" : "g:Int32",
"@value" : 4
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 21
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 8
},
"properties" : {
"since" : {
"@type" : "g:Int32",
"@value" : 2012
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 22
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 8
},
"properties" : {
"skill" : {
"@type" : "g:Int32",
"@value" : 3
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 23
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 8
},
"properties" : {
"skill" : {
"@type" : "g:Int32",
"@value" : 3
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 24
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 9
},
"properties" : {
"skill" : {
"@type" : "g:Int32",
"@value" : 5
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 25
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 9
},
"properties" : {
"skill" : {
"@type" : "g:Int32",
"@value" : 3
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 26
},
"label" : "traverses",
"inVLabel" : "software",
"outVLabel" : "software",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 10
}
}
} ]
}
}
----
==== Tree
[source,json]
----
{
"@type" : "g:Tree",
"@value" : [ {
"key" : {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 6
},
"value" : "san diego",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1997
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2001
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 7
},
"value" : "santa cruz",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2001
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2004
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 8
},
"value" : "brussels",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 9
},
"value" : "santa fe",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
} ]
}
}
},
"value" : {
"@type" : "g:Tree",
"@value" : [ {
"key" : {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 10
},
"label" : "software",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 4
},
"value" : "gremlin",
"vertex" : {
"@type" : "g:Int32",
"@value" : 10
},
"label" : "name"
}
} ]
}
}
},
"value" : {
"@type" : "g:Tree",
"@value" : [ {
"key" : {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 11
},
"label" : "software",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 5
},
"value" : "tinkergraph",
"vertex" : {
"@type" : "g:Int32",
"@value" : 11
},
"label" : "name"
}
} ]
}
}
},
"value" : {
"@type" : "g:Tree",
"@value" : [ ]
}
} ]
}
} ]
}
} ]
}
----
==== Vertex
[source,json]
----
{
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 6
},
"value" : "san diego",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1997
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2001
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 7
},
"value" : "santa cruz",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2001
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2004
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 8
},
"value" : "brussels",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 9
},
"value" : "santa fe",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
} ]
}
}
}
----
==== VertexProperty
[source,json]
----
{
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "name"
}
}
----
=== Graph Process
==== Barrier
[source,json]
----
{
"@type" : "g:Barrier",
"@value" : "normSack"
}
----
==== Binding
A "Binding" refers to a `Bytecode.Binding`.
[source,json]
----
{
"@type" : "g:Binding",
"@value" : {
"key" : "x",
"value" : {
"@type" : "g:Int32",
"@value" : 1
}
}
}
----
==== Bytecode
The following `Bytecode` example represents the traversal of `g.V().hasLabel('person').out().in().tree()`. Obviously the serialized `Bytecode` woudl be quite different for the endless variations of commands that could be used together in the Gremlin language.
[source,json]
----
{
"@type" : "g:Bytecode",
"@value" : {
"step" : [ [ "V" ], [ "hasLabel", "person" ], [ "out" ], [ "in" ], [ "tree" ] ]
}
}
----
==== Cardinality
[source,json]
----
{
"@type" : "g:Cardinality",
"@value" : "list"
}
----
==== Column
[source,json]
----
{
"@type" : "g:Column",
"@value" : "keys"
}
----
==== Direction
[source,json]
----
{
"@type" : "g:Direction",
"@value" : "OUT"
}
----
==== DT
[source,json]
----
{
"@type" : "g:DT",
"@value" : "minute"
}
----
==== Lambda
[source,json]
----
{
"@type" : "g:Lambda",
"@value" : {
"script" : "{ it.get() }",
"language" : "gremlin-groovy",
"arguments" : 1
}
}
----
==== Merge
[source,json]
----
{
"@type" : "g:Merge",
"@value" : "onMatch"
}
----
==== Metrics
[source,json]
----
{
"@type" : "g:Metrics",
"@value" : {
"dur" : {
"@type" : "g:Double",
"@value" : 100.0
},
"counts" : {
"traverserCount" : {
"@type" : "g:Int64",
"@value" : 4
},
"elementCount" : {
"@type" : "g:Int64",
"@value" : 4
}
},
"name" : "TinkerGraphStep(vertex,[~label.eq(person)])",
"annotations" : {
"percentDur" : {
"@type" : "g:Double",
"@value" : 25.0
}
},
"id" : "7.0.0()",
"metrics" : [ {
"@type" : "g:Metrics",
"@value" : {
"dur" : {
"@type" : "g:Double",
"@value" : 100.0
},
"counts" : {
"traverserCount" : {
"@type" : "g:Int64",
"@value" : 7
},
"elementCount" : {
"@type" : "g:Int64",
"@value" : 7
}
},
"name" : "VertexStep(OUT,vertex)",
"annotations" : {
"percentDur" : {
"@type" : "g:Double",
"@value" : 25.0
}
},
"id" : "3.0.0()"
}
} ]
}
}
----
==== Operator
[source,json]
----
{
"@type" : "g:Operator",
"@value" : "sum"
}
----
==== Order
[source,json]
----
{
"@type" : "g:Order",
"@value" : "shuffle"
}
----
==== P
[source,json]
----
{
"@type" : "g:P",
"@value" : {
"predicate" : "gt",
"value" : {
"@type" : "g:Int32",
"@value" : 0
}
}
}
----
==== P within
[source,json]
----
{
"@type" : "g:P",
"@value" : {
"predicate" : "within",
"value" : [ {
"@type" : "g:Int32",
"@value" : 1
} ]
}
}
----
==== P without
[source,json]
----
{
"@type" : "g:P",
"@value" : {
"predicate" : "without",
"value" : [ {
"@type" : "g:Int32",
"@value" : 1
}, {
"@type" : "g:Int32",
"@value" : 2
} ]
}
}
----
==== P and
[source,json]
----
{
"@type" : "g:P",
"@value" : {
"predicate" : "and",
"value" : [ {
"@type" : "g:P",
"@value" : {
"predicate" : "gt",
"value" : {
"@type" : "g:Int32",
"@value" : 0
}
}
}, {
"@type" : "g:P",
"@value" : {
"predicate" : "lt",
"value" : {
"@type" : "g:Int32",
"@value" : 10
}
}
} ]
}
}
----
==== P or
[source,json]
----
{
"@type" : "g:P",
"@value" : {
"predicate" : "or",
"value" : [ {
"@type" : "g:P",
"@value" : {
"predicate" : "gt",
"value" : {
"@type" : "g:Int32",
"@value" : 0
}
}
}, {
"@type" : "g:P",
"@value" : {
"predicate" : "within",
"value" : [ {
"@type" : "g:Int32",
"@value" : -1
}, {
"@type" : "g:Int32",
"@value" : -10
}, {
"@type" : "g:Int32",
"@value" : -100
} ]
}
} ]
}
}
----
==== Pick
[source,json]
----
{
"@type" : "g:Pick",
"@value" : "any"
}
----
==== Pop
[source,json]
----
{
"@type" : "g:Pop",
"@value" : "all"
}
----
==== Scope
[source,json]
----
{
"@type" : "g:Scope",
"@value" : "local"
}
----
==== T
[source,json]
----
{
"@type" : "g:T",
"@value" : "label"
}
----
==== TextP
[source,json]
----
{
"@type" : "g:TextP",
"@value" : {
"predicate" : "containing",
"value" : "ark"
}
}
----
==== TraversalMetrics
[source,json]
----
{
"@type" : "g:TraversalMetrics",
"@value" : {
"dur" : {
"@type" : "g:Double",
"@value" : 0.004
},
"metrics" : [ {
"@type" : "g:Metrics",
"@value" : {
"dur" : {
"@type" : "g:Double",
"@value" : 100.0
},
"counts" : {
"traverserCount" : {
"@type" : "g:Int64",
"@value" : 4
},
"elementCount" : {
"@type" : "g:Int64",
"@value" : 4
}
},
"name" : "TinkerGraphStep(vertex,[~label.eq(person)])",
"annotations" : {
"percentDur" : {
"@type" : "g:Double",
"@value" : 25.0
}
},
"id" : "7.0.0()"
}
}, {
"@type" : "g:Metrics",
"@value" : {
"dur" : {
"@type" : "g:Double",
"@value" : 100.0
},
"counts" : {
"traverserCount" : {
"@type" : "g:Int64",
"@value" : 13
},
"elementCount" : {
"@type" : "g:Int64",
"@value" : 13
}
},
"name" : "VertexStep(OUT,vertex)",
"annotations" : {
"percentDur" : {
"@type" : "g:Double",
"@value" : 25.0
}
},
"id" : "2.0.0()"
}
}, {
"@type" : "g:Metrics",
"@value" : {
"dur" : {
"@type" : "g:Double",
"@value" : 100.0
},
"counts" : {
"traverserCount" : {
"@type" : "g:Int64",
"@value" : 7
},
"elementCount" : {
"@type" : "g:Int64",
"@value" : 7
}
},
"name" : "VertexStep(OUT,vertex)",
"annotations" : {
"percentDur" : {
"@type" : "g:Double",
"@value" : 25.0
}
},
"id" : "3.0.0()"
}
}, {
"@type" : "g:Metrics",
"@value" : {
"dur" : {
"@type" : "g:Double",
"@value" : 100.0
},
"counts" : {
"traverserCount" : {
"@type" : "g:Int64",
"@value" : 1
},
"elementCount" : {
"@type" : "g:Int64",
"@value" : 1
}
},
"name" : "TreeStep",
"annotations" : {
"percentDur" : {
"@type" : "g:Double",
"@value" : 25.0
}
},
"id" : "4.0.0()"
}
} ]
}
}
----
==== Traverser
[source,json]
----
{
"@type" : "g:Traverser",
"@value" : {
"bulk" : {
"@type" : "g:Int64",
"@value" : 1
},
"value" : {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 6
},
"value" : "san diego",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1997
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2001
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 7
},
"value" : "santa cruz",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2001
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2004
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 8
},
"value" : "brussels",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 9
},
"value" : "santa fe",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
} ]
}
}
}
}
}
----
=== RequestMessage
==== Authentication Response
The following `RequestMessage` is an example of the response that should be made to a SASL-based authentication challenge.
[source,json]
----
{
"requestId" : {
"@type" : "g:UUID",
"@value" : "cb682578-9d92-4499-9ebc-5c6aa73c5397"
},
"op" : "authentication",
"processor" : "",
"args" : {
"saslMechanism" : "PLAIN",
"sasl" : "AHN0ZXBocGhlbgBwYXNzd29yZA=="
}
}
----
==== Session Eval
The following `RequestMessage` is an example of a simple session request for a script evaluation with parameters.
[source,json]
----
{
"requestId" : {
"@type" : "g:UUID",
"@value" : "cb682578-9d92-4499-9ebc-5c6aa73c5397"
},
"op" : "eval",
"processor" : "session",
"args" : {
"gremlin" : "g.V(x)",
"language" : "gremlin-groovy",
"session" : "unique-session-identifier",
"bindings" : {
"x" : {
"@type" : "g:Int32",
"@value" : 1
}
}
}
}
----
==== Session Eval Aliased
The following `RequestMessage` is an example of a session request for a script evaluation with an alias that binds the `TraversalSource` of "g" to "social".
[source,json]
----
{
"requestId" : {
"@type" : "g:UUID",
"@value" : "cb682578-9d92-4499-9ebc-5c6aa73c5397"
},
"op" : "eval",
"processor" : "session",
"args" : {
"gremlin" : "social.V(x)",
"language" : "gremlin-groovy",
"aliases" : {
"g" : "social"
},
"session" : "unique-session-identifier",
"bindings" : {
"x" : {
"@type" : "g:Int32",
"@value" : 1
}
}
}
}
----
==== Session Close
The following `RequestMessage` is an example of a request to close a session.
[source,json]
----
{
"requestId" : {
"@type" : "g:UUID",
"@value" : "cb682578-9d92-4499-9ebc-5c6aa73c5397"
},
"op" : "close",
"processor" : "session",
"args" : {
"session" : "unique-session-identifier"
}
}
----
==== Sessionless Eval
The following `RequestMessage` is an example of a simple sessionless request for a script evaluation with parameters.
[source,json]
----
{
"requestId" : {
"@type" : "g:UUID",
"@value" : "cb682578-9d92-4499-9ebc-5c6aa73c5397"
},
"op" : "eval",
"processor" : "",
"args" : {
"gremlin" : "g.V(x)",
"language" : "gremlin-groovy",
"bindings" : {
"x" : {
"@type" : "g:Int32",
"@value" : 1
}
}
}
}
----
==== Sessionless Eval Aliased
The following `RequestMessage` is an example of a sessionless request for a script evaluation with an alias that binds the `TraversalSource` of "g" to "social".
[source,json]
----
{
"requestId" : {
"@type" : "g:UUID",
"@value" : "cb682578-9d92-4499-9ebc-5c6aa73c5397"
},
"op" : "eval",
"processor" : "",
"args" : {
"gremlin" : "social.V(x)",
"language" : "gremlin-groovy",
"aliases" : {
"g" : "social"
},
"bindings" : {
"x" : {
"@type" : "g:Int32",
"@value" : 1
}
}
}
}
----
=== ResponseMessage
==== Authentication Challenge
When authentication is enabled, an initial request to the server will result in an authentication challenge. The typical response message will appear as follows, but handling it could be different dependending on the SASL implementation (e.g. multiple challenges maybe requested in some cases, but not in the default provided by Gremlin Server).
[source,json]
----
{
"requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
"status" : {
"message" : "",
"code" : 407,
"attributes" : { }
},
"result" : {
"data" : null,
"meta" : { }
}
}
----
==== Standard Result
The following `ResponseMessage` is a typical example of the typical successful response Gremlin Server will return when returning results from a script.
[source,json]
----
{
"requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
"status" : {
"message" : "",
"code" : 200,
"attributes" : { }
},
"result" : {
"data" : [ {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 6
},
"value" : "san diego",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1997
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2001
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 7
},
"value" : "santa cruz",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2001
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2004
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 8
},
"value" : "brussels",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 9
},
"value" : "santa fe",
"vertex" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
} ]
}
}
} ],
"meta" : { }
}
}
----
=== Extended
Note that the "extended" types require the addition of the separate `GraphSONXModuleV2` module as follows:
[source,java]
----
mapper = GraphSONMapper.build().
typeInfo(TypeInfo.PARTIAL_TYPES).
addCustomModule(GraphSONXModuleV2.build()).
version(GraphSONVersion.V2_0).create().createMapper()
----
==== BigDecimal
[source,json]
----
{
"@type" : "gx:BigDecimal",
"@value" : 123456789987654321123456789987654321
}
----
==== BigInteger
[source,json]
----
{
"@type" : "gx:BigInteger",
"@value" : 123456789987654321123456789987654321
}
----
==== Byte
[source,json]
----
{
"@type" : "gx:Byte",
"@value" : 1
}
----
==== ByteBuffer
[source,json]
----
{
"@type" : "gx:ByteBuffer",
"@value" : "c29tZSBieXRlcyBmb3IgeW91"
}
----
==== Char
[source,json]
----
{
"@type" : "gx:Char",
"@value" : "x"
}
----
==== Duration
The following example is a `Duration` of five days.
[source,json]
----
{
"@type" : "gx:Duration",
"@value" : "PT120H"
}
----
==== InetAddress
[source,json]
----
{
"@type" : "gx:InetAddress",
"@value" : "localhost"
}
----
==== Instant
[source,json]
----
{
"@type" : "gx:Instant",
"@value" : "2016-12-14T16:39:19.349Z"
}
----
==== LocalDate
[source,json]
----
{
"@type" : "gx:LocalDate",
"@value" : "2016-01-01"
}
----
==== LocalDateTime
[source,json]
----
{
"@type" : "gx:LocalDateTime",
"@value" : "2016-01-01T12:30"
}
----
==== LocalTime
[source,json]
----
{
"@type" : "gx:LocalTime",
"@value" : "12:30:45"
}
----
==== MonthDay
[source,json]
----
{
"@type" : "gx:MonthDay",
"@value" : "--01-01"
}
----
==== OffsetDateTime
[source,json]
----
{
"@type" : "gx:OffsetDateTime",
"@value" : "2007-12-03T10:15:30+01:00"
}
----
==== OffsetTime
[source,json]
----
{
"@type" : "gx:OffsetTime",
"@value" : "10:15:30+01:00"
}
----
==== Period
The following example is a `Period` of one year, six months and fifteen days.
[source,json]
----
{
"@type" : "gx:Period",
"@value" : "P1Y6M15D"
}
----
==== Short
[source,json]
----
{
"@type" : "gx:Int16",
"@value" : 100
}
----
==== Year
The following example is of the `Year` "2016".
[source,json]
----
{
"@type" : "gx:Year",
"@value" : "2016"
}
----
==== YearMonth
The following example is a `YearMonth` of "June 2016"
[source,json]
----
{
"@type" : "gx:YearMonth",
"@value" : "2016-06"
}
----
==== ZonedDateTime
[source,json]
----
{
"@type" : "gx:ZonedDateTime",
"@value" : "2016-12-23T12:12:24.000000036+02:00[GMT+02:00]"
}
----
==== ZoneOffset
The following example is a `ZoneOffset` of three hours, six minutes, and nine seconds.
[source,json]
----
{
"@type" : "gx:ZoneOffset",
"@value" : "+03:06:09"
}
----
[[graphson-3d0]]
== Version 3.0
Version 3.0 of GraphSON was first introduced on TinkerPop 3.3.0 and is represented by the `application/vnd.gremlin-v3.0+json`
mime type. It was introduced as only having embedded types. It is quite similar to GraphSON 2.0 with embedded types
and in most cases will appear compatible to the eye, however there are some critical differences. GraphSON 2.0 relied
on JSON data types for collections like `Map` and `List`. In GraphSON 3.0, there is explicit typed support for `Map`,
`List` and `Set` as Gremlin relies on those types in quite specific ways that are not directly compatible with the
JSON definitions of those collections. In the case of `List` and `Set`, it was important to distinguish between the
two and for `Map` it was necessary to have the ability to return `Map` instances that did not have `String` keys
(e.g. `g.V().out().groupCount()`).
As of TinkerPop 3.7.0, GraphSON 3.0 also has a typeless representation referenced by the
`application/vnd.gremlin-v3.0+json;types=false`. This format matches the format developed for 1.0.
=== Core
==== Class
[source,json]
----
{
"@type" : "g:Class",
"@value" : "java.io.File"
}
----
==== Date
Representing a millisecond-precision offset from the unix epoch. In Java, it is simply `Date.getTime()`.
[source,json]
----
{
"@type" : "g:Date",
"@value" : 1481750076295
}
----
==== Double
[source,json]
----
{
"@type" : "g:Double",
"@value" : 100.0
}
----
==== Float
[source,json]
----
{
"@type" : "g:Float",
"@value" : 100.0
}
----
==== Integer
[source,json]
----
{
"@type" : "g:Int32",
"@value" : 100
}
----
==== List
List is used to distinguish between different collection types as JSON is not explicit enough for all of Gremlin's requirements.
[source,json]
----
{
"@type" : "g:List",
"@value" : [ {
"@type" : "g:Int32",
"@value" : 1
}, "person", true ]
}
----
==== Long
[source,json]
----
{
"@type" : "g:Int64",
"@value" : 100
}
----
==== Map
Map is redefined so that to provide the ability to allow for non-String keys, which is not possible in JSON.
[source,json]
----
{
"@type" : "g:Map",
"@value" : [ {
"@type" : "g:Date",
"@value" : 1481750076295
}, "red", {
"@type" : "g:List",
"@value" : [ {
"@type" : "g:Int32",
"@value" : 1
}, {
"@type" : "g:Int32",
"@value" : 2
}, {
"@type" : "g:Int32",
"@value" : 3
} ]
}, {
"@type" : "g:Date",
"@value" : 1481750076295
}, "test", {
"@type" : "g:Int32",
"@value" : 123
} ]
}
----
==== Set
Allows a JSON collection to behave as a Set.
[source,json]
----
{
"@type" : "g:Set",
"@value" : [ {
"@type" : "g:Int32",
"@value" : 1
}, "person", true ]
}
----
==== Timestamp
[source,json]
----
{
"@type" : "g:Timestamp",
"@value" : 1481750076295
}
----
==== UUID
[source,json]
----
{
"@type" : "g:UUID",
"@value" : "41d2e28a-20a4-4ab0-b379-d810dede3786"
}
----
=== Graph Structure
==== Edge
[source,json]
----
{
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 13
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 1
},
"properties" : {
"since" : {
"@type" : "g:Property",
"@value" : {
"key" : "since",
"value" : {
"@type" : "g:Int32",
"@value" : 2009
}
}
}
}
}
}
----
==== Path
[source,json]
----
{
"@type" : "g:Path",
"@value" : {
"labels" : {
"@type" : "g:List",
"@value" : [ {
"@type" : "g:Set",
"@value" : [ ]
}, {
"@type" : "g:Set",
"@value" : [ ]
}, {
"@type" : "g:Set",
"@value" : [ ]
} ]
},
"objects" : {
"@type" : "g:List",
"@value" : [ {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person"
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 10
},
"label" : "software"
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 11
},
"label" : "software"
}
} ]
}
}
}
----
==== Property
[source,json]
----
{
"@type" : "g:Property",
"@value" : {
"key" : "since",
"value" : {
"@type" : "g:Int32",
"@value" : 2009
}
}
}
----
==== TinkerGraph
`TinkerGraph` has a custom serializer that is registered as part of the `TinkerIoRegistry`.
[source,json]
----
{
"@type" : "tinker:graph",
"@value" : {
"vertices" : [ {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 6
},
"value" : "san diego",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1997
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2001
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 7
},
"value" : "santa cruz",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2001
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2004
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 8
},
"value" : "brussels",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 9
},
"value" : "santa fe",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
} ]
}
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 7
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 1
},
"value" : "stephen",
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 10
},
"value" : "centreville",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1990
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2000
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 11
},
"value" : "dulles",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2000
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2006
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 12
},
"value" : "purcellville",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2006
}
}
}
} ]
}
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 8
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 2
},
"value" : "matthias",
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 13
},
"value" : "bremen",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2007
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 14
},
"value" : "baltimore",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2007
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2011
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 15
},
"value" : "oakland",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2011
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2014
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 16
},
"value" : "seattle",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2014
}
}
}
} ]
}
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 9
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 3
},
"value" : "daniel",
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 17
},
"value" : "spremberg",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1982
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 18
},
"value" : "kaiserslautern",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2009
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 19
},
"value" : "aachen",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2009
}
}
}
} ]
}
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 10
},
"label" : "software",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 4
},
"value" : "gremlin",
"label" : "name"
}
} ]
}
}
}, {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 11
},
"label" : "software",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 5
},
"value" : "tinkergraph",
"label" : "name"
}
} ]
}
}
} ],
"edges" : [ {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 13
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 1
},
"properties" : {
"since" : {
"@type" : "g:Property",
"@value" : {
"key" : "since",
"value" : {
"@type" : "g:Int32",
"@value" : 2009
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 14
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 1
},
"properties" : {
"since" : {
"@type" : "g:Property",
"@value" : {
"key" : "since",
"value" : {
"@type" : "g:Int32",
"@value" : 2010
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 15
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 1
},
"properties" : {
"skill" : {
"@type" : "g:Property",
"@value" : {
"key" : "skill",
"value" : {
"@type" : "g:Int32",
"@value" : 4
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 16
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 1
},
"properties" : {
"skill" : {
"@type" : "g:Property",
"@value" : {
"key" : "skill",
"value" : {
"@type" : "g:Int32",
"@value" : 5
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 17
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 7
},
"properties" : {
"since" : {
"@type" : "g:Property",
"@value" : {
"key" : "since",
"value" : {
"@type" : "g:Int32",
"@value" : 2010
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 18
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 7
},
"properties" : {
"since" : {
"@type" : "g:Property",
"@value" : {
"key" : "since",
"value" : {
"@type" : "g:Int32",
"@value" : 2011
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 19
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 7
},
"properties" : {
"skill" : {
"@type" : "g:Property",
"@value" : {
"key" : "skill",
"value" : {
"@type" : "g:Int32",
"@value" : 5
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 20
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 7
},
"properties" : {
"skill" : {
"@type" : "g:Property",
"@value" : {
"key" : "skill",
"value" : {
"@type" : "g:Int32",
"@value" : 4
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 21
},
"label" : "develops",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 8
},
"properties" : {
"since" : {
"@type" : "g:Property",
"@value" : {
"key" : "since",
"value" : {
"@type" : "g:Int32",
"@value" : 2012
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 22
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 8
},
"properties" : {
"skill" : {
"@type" : "g:Property",
"@value" : {
"key" : "skill",
"value" : {
"@type" : "g:Int32",
"@value" : 3
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 23
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 8
},
"properties" : {
"skill" : {
"@type" : "g:Property",
"@value" : {
"key" : "skill",
"value" : {
"@type" : "g:Int32",
"@value" : 3
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 24
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 10
},
"outV" : {
"@type" : "g:Int32",
"@value" : 9
},
"properties" : {
"skill" : {
"@type" : "g:Property",
"@value" : {
"key" : "skill",
"value" : {
"@type" : "g:Int32",
"@value" : 5
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 25
},
"label" : "uses",
"inVLabel" : "software",
"outVLabel" : "person",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 9
},
"properties" : {
"skill" : {
"@type" : "g:Property",
"@value" : {
"key" : "skill",
"value" : {
"@type" : "g:Int32",
"@value" : 3
}
}
}
}
}
}, {
"@type" : "g:Edge",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 26
},
"label" : "traverses",
"inVLabel" : "software",
"outVLabel" : "software",
"inV" : {
"@type" : "g:Int32",
"@value" : 11
},
"outV" : {
"@type" : "g:Int32",
"@value" : 10
}
}
} ]
}
}
----
==== Vertex
[source,json]
----
{
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 6
},
"value" : "san diego",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1997
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2001
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 7
},
"value" : "santa cruz",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2001
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2004
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 8
},
"value" : "brussels",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 9
},
"value" : "santa fe",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
} ]
}
}
}
----
==== VertexProperty
[source,json]
----
{
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"label" : "name"
}
}
----
=== Graph Process
==== Barrier
[source,json]
----
{
"@type" : "g:Barrier",
"@value" : "normSack"
}
----
==== Binding
A "Binding" refers to a `Bytecode.Binding`.
[source,json]
----
{
"@type" : "g:Binding",
"@value" : {
"key" : "x",
"value" : {
"@type" : "g:Int32",
"@value" : 1
}
}
}
----
==== BulkSet
[source,json]
----
{
"@type" : "g:BulkSet",
"@value" : [ "marko", {
"@type" : "g:Int64",
"@value" : 1
}, "josh", {
"@type" : "g:Int64",
"@value" : 2
} ]
}
----
==== Bytecode
The following `Bytecode` example represents the traversal of `g.V().hasLabel('person').out().in().tree()`. Obviously the serialized `Bytecode` woudl be quite different for the endless variations of commands that could be used together in the Gremlin language.
[source,json]
----
{
"@type" : "g:Bytecode",
"@value" : {
"step" : [ [ "V" ], [ "hasLabel", "person" ], [ "out" ], [ "in" ], [ "tree" ] ]
}
}
----
==== Cardinality
[source,json]
----
{
"@type" : "g:Cardinality",
"@value" : "list"
}
----
==== Column
[source,json]
----
{
"@type" : "g:Column",
"@value" : "keys"
}
----
==== Direction
[source,json]
----
{
"@type" : "g:Direction",
"@value" : "OUT"
}
----
==== DT
[source,json]
----
{
"@type" : "g:DT",
"@value" : "minute"
}
----
==== Lambda
[source,json]
----
{
"@type" : "g:Lambda",
"@value" : {
"script" : "{ it.get() }",
"language" : "gremlin-groovy",
"arguments" : 1
}
}
----
==== Merge
[source,json]
----
{
"@type" : "g:Merge",
"@value" : "onMatch"
}
----
==== Metrics
[source,json]
----
{
"@type" : "g:Metrics",
"@value" : {
"@type" : "g:Map",
"@value" : [ "dur", {
"@type" : "g:Double",
"@value" : 100.0
}, "counts", {
"@type" : "g:Map",
"@value" : [ "traverserCount", {
"@type" : "g:Int64",
"@value" : 4
}, "elementCount", {
"@type" : "g:Int64",
"@value" : 4
} ]
}, "name", "TinkerGraphStep(vertex,[~label.eq(person)])", "annotations", {
"@type" : "g:Map",
"@value" : [ "percentDur", {
"@type" : "g:Double",
"@value" : 25.0
} ]
}, "id", "7.0.0()", "metrics", {
"@type" : "g:List",
"@value" : [ {
"@type" : "g:Metrics",
"@value" : {
"@type" : "g:Map",
"@value" : [ "dur", {
"@type" : "g:Double",
"@value" : 100.0
}, "counts", {
"@type" : "g:Map",
"@value" : [ "traverserCount", {
"@type" : "g:Int64",
"@value" : 7
}, "elementCount", {
"@type" : "g:Int64",
"@value" : 7
} ]
}, "name", "VertexStep(OUT,vertex)", "annotations", {
"@type" : "g:Map",
"@value" : [ "percentDur", {
"@type" : "g:Double",
"@value" : 25.0
} ]
}, "id", "3.0.0()" ]
}
} ]
} ]
}
}
----
==== Operator
[source,json]
----
{
"@type" : "g:Operator",
"@value" : "sum"
}
----
==== Order
[source,json]
----
{
"@type" : "g:Order",
"@value" : "shuffle"
}
----
==== P
`P` expects a single value of a `List` of values. There is special handling for `List` values when it comes to `within`, `without`, `inside`, `outside` and `between`. For `inside`, `outside` and `between`, the expectation is that the collection contain two objects (the rest will be ignored) and those two objects become the arguments to those methods. For `within` and `without`, these methods will accept an arbitrary number of objects in the collection.
[source,json]
----
{
"@type" : "g:P",
"@value" : {
"predicate" : "gt",
"value" : {
"@type" : "g:Int32",
"@value" : 0
}
}
}
----
==== P within
Please see <<_p,P>> for additional information on `within`.
[source,json]
----
{
"@type" : "g:P",
"@value" : {
"predicate" : "within",
"value" : {
"@type" : "g:List",
"@value" : [ {
"@type" : "g:Int32",
"@value" : 1
} ]
}
}
}
----
==== P without
Please see <<_p,P>> for additional information on `within`.
[source,json]
----
{
"@type" : "g:P",
"@value" : {
"predicate" : "without",
"value" : {
"@type" : "g:List",
"@value" : [ {
"@type" : "g:Int32",
"@value" : 1
}, {
"@type" : "g:Int32",
"@value" : 2
} ]
}
}
}
----
==== P and
[source,json]
----
{
"@type" : "g:P",
"@value" : {
"predicate" : "and",
"value" : [ {
"@type" : "g:P",
"@value" : {
"predicate" : "gt",
"value" : {
"@type" : "g:Int32",
"@value" : 0
}
}
}, {
"@type" : "g:P",
"@value" : {
"predicate" : "lt",
"value" : {
"@type" : "g:Int32",
"@value" : 10
}
}
} ]
}
}
----
==== P or
[source,json]
----
{
"@type" : "g:P",
"@value" : {
"predicate" : "or",
"value" : [ {
"@type" : "g:P",
"@value" : {
"predicate" : "gt",
"value" : {
"@type" : "g:Int32",
"@value" : 0
}
}
}, {
"@type" : "g:P",
"@value" : {
"predicate" : "within",
"value" : {
"@type" : "g:List",
"@value" : [ {
"@type" : "g:Int32",
"@value" : -1
}, {
"@type" : "g:Int32",
"@value" : -10
}, {
"@type" : "g:Int32",
"@value" : -100
} ]
}
}
} ]
}
}
----
==== Pick
[source,json]
----
{
"@type" : "g:Pick",
"@value" : "any"
}
----
==== Pop
[source,json]
----
{
"@type" : "g:Pop",
"@value" : "all"
}
----
==== Scope
[source,json]
----
{
"@type" : "g:Scope",
"@value" : "local"
}
----
==== T
[source,json]
----
{
"@type" : "g:T",
"@value" : "label"
}
----
==== TextP
[source,json]
----
{
"@type" : "g:TextP",
"@value" : {
"predicate" : "containing",
"value" : "ark"
}
}
----
==== TraversalMetrics
[source,json]
----
{
"@type" : "g:TraversalMetrics",
"@value" : {
"@type" : "g:Map",
"@value" : [ "dur", {
"@type" : "g:Double",
"@value" : 0.004
}, "metrics", {
"@type" : "g:List",
"@value" : [ {
"@type" : "g:Metrics",
"@value" : {
"@type" : "g:Map",
"@value" : [ "dur", {
"@type" : "g:Double",
"@value" : 100.0
}, "counts", {
"@type" : "g:Map",
"@value" : [ "traverserCount", {
"@type" : "g:Int64",
"@value" : 4
}, "elementCount", {
"@type" : "g:Int64",
"@value" : 4
} ]
}, "name", "TinkerGraphStep(vertex,[~label.eq(person)])", "annotations", {
"@type" : "g:Map",
"@value" : [ "percentDur", {
"@type" : "g:Double",
"@value" : 25.0
} ]
}, "id", "7.0.0()" ]
}
}, {
"@type" : "g:Metrics",
"@value" : {
"@type" : "g:Map",
"@value" : [ "dur", {
"@type" : "g:Double",
"@value" : 100.0
}, "counts", {
"@type" : "g:Map",
"@value" : [ "traverserCount", {
"@type" : "g:Int64",
"@value" : 13
}, "elementCount", {
"@type" : "g:Int64",
"@value" : 13
} ]
}, "name", "VertexStep(OUT,vertex)", "annotations", {
"@type" : "g:Map",
"@value" : [ "percentDur", {
"@type" : "g:Double",
"@value" : 25.0
} ]
}, "id", "2.0.0()" ]
}
}, {
"@type" : "g:Metrics",
"@value" : {
"@type" : "g:Map",
"@value" : [ "dur", {
"@type" : "g:Double",
"@value" : 100.0
}, "counts", {
"@type" : "g:Map",
"@value" : [ "traverserCount", {
"@type" : "g:Int64",
"@value" : 7
}, "elementCount", {
"@type" : "g:Int64",
"@value" : 7
} ]
}, "name", "VertexStep(OUT,vertex)", "annotations", {
"@type" : "g:Map",
"@value" : [ "percentDur", {
"@type" : "g:Double",
"@value" : 25.0
} ]
}, "id", "3.0.0()" ]
}
}, {
"@type" : "g:Metrics",
"@value" : {
"@type" : "g:Map",
"@value" : [ "dur", {
"@type" : "g:Double",
"@value" : 100.0
}, "counts", {
"@type" : "g:Map",
"@value" : [ "traverserCount", {
"@type" : "g:Int64",
"@value" : 1
}, "elementCount", {
"@type" : "g:Int64",
"@value" : 1
} ]
}, "name", "TreeStep", "annotations", {
"@type" : "g:Map",
"@value" : [ "percentDur", {
"@type" : "g:Double",
"@value" : 25.0
} ]
}, "id", "4.0.0()" ]
}
} ]
} ]
}
}
----
==== Traverser
[source,json]
----
{
"@type" : "g:Traverser",
"@value" : {
"bulk" : {
"@type" : "g:Int64",
"@value" : 1
},
"value" : {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 6
},
"value" : "san diego",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1997
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2001
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 7
},
"value" : "santa cruz",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2001
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2004
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 8
},
"value" : "brussels",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 9
},
"value" : "santa fe",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
} ]
}
}
}
}
}
----
=== RequestMessage
==== Authentication Response
The following `RequestMessage` is an example of the response that should be made to a SASL-based authentication challenge.
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "authentication",
"processor" : "",
"args" : {
"@type" : "g:Map",
"@value" : [ "saslMechanism", "PLAIN", "sasl", "AHN0ZXBocGhlbgBwYXNzd29yZA==" ]
}
}
----
==== Session Eval
The following `RequestMessage` is an example of a simple session request for a script evaluation with parameters.
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "eval",
"processor" : "session",
"args" : {
"@type" : "g:Map",
"@value" : [ "gremlin", "g.V(x)", "language", "gremlin-groovy", "session", "unique-session-identifier", "bindings", {
"@type" : "g:Map",
"@value" : [ "x", {
"@type" : "g:Int32",
"@value" : 1
} ]
} ]
}
}
----
==== Session Eval Aliased
The following `RequestMessage` is an example of a session request for a script evaluation with an alias that binds the `TraversalSource` of "g" to "social".
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "eval",
"processor" : "session",
"args" : {
"@type" : "g:Map",
"@value" : [ "gremlin", "social.V(x)", "language", "gremlin-groovy", "aliases", {
"@type" : "g:Map",
"@value" : [ "g", "social" ]
}, "session", "unique-session-identifier", "bindings", {
"@type" : "g:Map",
"@value" : [ "x", {
"@type" : "g:Int32",
"@value" : 1
} ]
} ]
}
}
----
==== Session Close
The following `RequestMessage` is an example of a request to close a session.
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "close",
"processor" : "session",
"args" : {
"@type" : "g:Map",
"@value" : [ "session", "unique-session-identifier" ]
}
}
----
==== Sessionless Eval
The following `RequestMessage` is an example of a simple sessionless request for a script evaluation with parameters.
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "eval",
"processor" : "",
"args" : {
"@type" : "g:Map",
"@value" : [ "gremlin", "g.V(x)", "language", "gremlin-groovy", "bindings", {
"@type" : "g:Map",
"@value" : [ "x", {
"@type" : "g:Int32",
"@value" : 1
} ]
} ]
}
}
----
==== Sessionless Eval Aliased
The following `RequestMessage` is an example of a sessionless request for a script evaluation with an alias that binds the `TraversalSource` of "g" to "social".
[source,json]
----
{
"requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
"op" : "eval",
"processor" : "",
"args" : {
"@type" : "g:Map",
"@value" : [ "gremlin", "social.V(x)", "language", "gremlin-groovy", "aliases", {
"@type" : "g:Map",
"@value" : [ "g", "social" ]
}, "bindings", {
"@type" : "g:Map",
"@value" : [ "x", {
"@type" : "g:Int32",
"@value" : 1
} ]
} ]
}
}
----
=== ResponseMessage
==== Authentication Challenge
When authentication is enabled, an initial request to the server will result in an authentication challenge. The typical response message will appear as follows, but handling it could be different depending on the SASL implementation (e.g. multiple challenges may be requested in some cases, but not in the default provided by Gremlin Server).
[source,json]
----
{
"requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
"status" : {
"message" : "",
"code" : 407,
"attributes" : {
"@type" : "g:Map",
"@value" : [ ]
}
},
"result" : {
"data" : null,
"meta" : {
"@type" : "g:Map",
"@value" : [ ]
}
}
}
----
==== Standard Result
The following `ResponseMessage` is a typical example of the typical successful response Gremlin Server will return when returning results from a script.
[source,json]
----
{
"requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
"status" : {
"message" : "",
"code" : 200,
"attributes" : {
"@type" : "g:Map",
"@value" : [ ]
}
},
"result" : {
"data" : {
"@type" : "g:List",
"@value" : [ {
"@type" : "g:Vertex",
"@value" : {
"id" : {
"@type" : "g:Int32",
"@value" : 1
},
"label" : "person",
"properties" : {
"name" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 0
},
"value" : "marko",
"label" : "name"
}
} ],
"location" : [ {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 6
},
"value" : "san diego",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 1997
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2001
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 7
},
"value" : "santa cruz",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2001
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2004
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 8
},
"value" : "brussels",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2004
},
"endTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
}, {
"@type" : "g:VertexProperty",
"@value" : {
"id" : {
"@type" : "g:Int64",
"@value" : 9
},
"value" : "santa fe",
"label" : "location",
"properties" : {
"startTime" : {
"@type" : "g:Int32",
"@value" : 2005
}
}
}
} ]
}
}
} ]
},
"meta" : {
"@type" : "g:Map",
"@value" : [ ]
}
}
}
----
=== Extended
Note that the "extended" types require the addition of the separate `GraphSONXModuleV3d0` module as follows:
[source,java]
----
mapper = GraphSONMapper.build().
typeInfo(TypeInfo.PARTIAL_TYPES).
addCustomModule(GraphSONXModuleV3.build()).
version(GraphSONVersion.V3_0).create().createMapper()
----
==== BigDecimal
[source,json]
----
{
"@type" : "gx:BigDecimal",
"@value" : 123456789987654321123456789987654321
}
----
==== BigInteger
[source,json]
----
{
"@type" : "gx:BigInteger",
"@value" : 123456789987654321123456789987654321
}
----
==== Byte
[source,json]
----
{
"@type" : "gx:Byte",
"@value" : 1
}
----
==== ByteBuffer
[source,json]
----
{
"@type" : "gx:ByteBuffer",
"@value" : "c29tZSBieXRlcyBmb3IgeW91"
}
----
==== Char
[source,json]
----
{
"@type" : "gx:Char",
"@value" : "x"
}
----
==== Duration
The following example is a `Duration` of five days.
[source,json]
----
{
"@type" : "gx:Duration",
"@value" : "PT120H"
}
----
==== InetAddress
[source,json]
----
{
"@type" : "gx:InetAddress",
"@value" : "localhost"
}
----
==== Instant
[source,json]
----
{
"@type" : "gx:Instant",
"@value" : "2016-12-14T16:39:19.349Z"
}
----
==== LocalDate
[source,json]
----
{
"@type" : "gx:LocalDate",
"@value" : "2016-01-01"
}
----
==== LocalDateTime
[source,json]
----
{
"@type" : "gx:LocalDateTime",
"@value" : "2016-01-01T12:30"
}
----
==== LocalTime
[source,json]
----
{
"@type" : "gx:LocalTime",
"@value" : "12:30:45"
}
----
==== MonthDay
[source,json]
----
{
"@type" : "gx:MonthDay",
"@value" : "--01-01"
}
----
==== OffsetDateTime
[source,json]
----
{
"@type" : "gx:OffsetDateTime",
"@value" : "2007-12-03T10:15:30+01:00"
}
----
==== OffsetTime
[source,json]
----
{
"@type" : "gx:OffsetTime",
"@value" : "10:15:30+01:00"
}
----
==== Period
The following example is a `Period` of one year, six months and fifteen days.
[source,json]
----
{
"@type" : "gx:Period",
"@value" : "P1Y6M15D"
}
----
==== Short
[source,json]
----
{
"@type" : "gx:Int16",
"@value" : 100
}
----
==== Year
The following example is of the `Year` "2016".
[source,json]
----
{
"@type" : "gx:Year",
"@value" : "2016"
}
----
==== YearMonth
The following example is a `YearMonth` of "June 2016"
[source,json]
----
{
"@type" : "gx:YearMonth",
"@value" : "2016-06"
}
----
==== ZonedDateTime
[source,json]
----
{
"@type" : "gx:ZonedDateTime",
"@value" : "2016-12-23T12:12:24.000000036+02:00[GMT+02:00]"
}
----
==== ZoneOffset
The following example is a `ZoneOffset` of three hours, six minutes, and nine seconds.
[source,json]
----
{
"@type" : "gx:ZoneOffset",
"@value" : "+03:06:09"
}
----