Retrieve both edges and vertices in gremlin json - gremlin

Hi I'm new to gremlin and need to, basically, get everything current to return as a json file. I'm using Syndeia which has a raw query option. I'm having difficulty figuring out how to get both vertices and edges to output. This is what I have thus far:
g.V().has('sLabel','Artifact').has('_isLatest','TRUE').both()
But I also need
g.V().has('sLabel','Artifact').has('_isLatest','TRUE').bothE()
Which gives me all the edges I need, but not the vertices. I realize that g.V() gives vertices and g.E() gives edges, but am unsure how to obtain both/combine them in the one line query. My json comes back as either
"vertices":[] 0 items
"edges":[...] 90 items
Or
"vertices":[...] 90 items
"edges":[] 0 items
My next idea is to do multiple queries into java to parse, combine, and manipulate there. I would really like to avoid doing this, but will if it's the only way. Thank you for being kind and understanding and for your help. I appreciate you all.

You can write a Gremlin query that gives you both the vertices and the edges. There are a few ways to do that. Probably the easiest way is to use path as shown below.
g.V().has('sLabel','Artifact').
has('_isLatest','TRUE').
bothE().
otherV().
path()
as an alternative, you could do:
g.V().has('sLabel','Artifact').
has('_isLatest','TRUE').
bothE().as('e').
otherV().as('v').
select('v','e')

You can do it as follows,
Just see the code below have demonstrated the following,
Vertex query
Edge query
combined query
converted combined query into valueMap
Converted the combined query valueMap into JSON (using version 3)
Converted the combined query valueMap into JSON (using version 1)
Vertex Query
gremlin> g.V(131200).both()
==>v[40992]
==>v[12336]
==>v[20608]
==>v[180376]
gremlin>
Edge query
gremlin> g.V(131200).bothE()
==>e[7rps-2t8g-1fdh-vmo][131200-locatedin->40992]
==>e[3qpy-9io-1bf9-2t8g][12336-containedin->131200]
==>e[7rbk-fwg-1bf9-2t8g][20608-containedin->131200]
==>e[7l03-3v6g-1bf9-2t8g][180376-containedin->131200]
gremlin>
Combined query
gremlin>
gremlin>g.V(131200).project('nodes','edges').by(both().fold()).by(bothE().fold())
==>[nodes:[v[40992],v[12336],v[20608],v[180376]],edges:[e[7rps-2t8g-1fdh-vmo][131200-locatedin->40992],e[3qpy-9io-1bf9-2t8g][12336-containedin->131200],e[7rbk-fwg-1bf9-2t8g][20608-containedin->131200],e[7l03-3v6g-1bf9-2t8g][180376-containedin->131200]]]
gremlin>
converted combined query into valueMap
gremlin>
gremlin> output = g.V(131200).project('nodes','edges').by(both().valueMap().fold()).by(bothE().valueMap().fold()).next()
==>nodes=[{gId=[0b98e8d5-681d-4155-8aaf-5d86babc0cff], isDeleted=[FALSE], isEntity=[TRUE], name=[TotsukaCDC], basetype=[GeoLocation], source=[RCP-Base], type=[DC], geographyL2DisplayName=[KANAGAWA], geographyL2Name=[KANAGAWA], geographyL4Name=[KNG-TOTSUKAKU-NORTH], geographyL4DisplayName=[KNG-TOTSUKAKU-NORTH], displayName=[TotsukaCDC], latitude=[139.525166], locationType=[CDC], geographyL1Name=[KANTO], geographyL3DisplayName=[YOKOHAMA-SHI], geographyL3Name=[YOKOHAMA-SHI], geographyL1DisplayName=[KANTO], locationCode=[tt], longitude=[35.416535]}, {gId=[90e7407c-cd34-44b0-9bf9-1a8866aac429], isDeleted=[FALSE], isEntity=[TRUE], name=[UHN2KNGcdcttRA01_HundredGigE0/0/0/6], basetype=[Entity], source=[RCP-Base], type=[PhysicalPort], portInUse=[TRUE], portNum=[HundredGigE0/0/0/6]}, {gId=[d0fc7284-4cd8-4cba-8d3d-be3c4ca2ba31], isDeleted=[FALSE], isEntity=[TRUE], name=[UHN2KNGcdcttRA01_Hu0/2/0/35], basetype=[Entity], source=[RCP-Base], type=[PhysicalPort], portInUse=[TRUE], portNum=[Hu0/2/0/35]}, {gId=[2f4f5a3a-b88f-4915-acd5-a1d873507f11], isDeleted=[FALSE], isEntity=[TRUE], name=[UHN2KNGcdcttRA01_HundredGigE0/1/0/6], basetype=[Entity], source=[RCP-Base], type=[PhysicalPort], portInUse=[TRUE], portNum=[HundredGigE0/1/0/6]}]
==>edges=[{destName=TotsukaCDC, srcName=UHN2KNGcdcttRA01, gId=1133ff0f-2f4b-4d21-b2d6-fed796ed13f9}, {gId=220d7d2b-8b96-4331-bdc1-50127685946a, destName=UHN2KNGcdcttRA01, srcName=UHN2KNGcdcttRA01_HundredGigE0/0/0/6}, {gId=ebd78fc0-a66c-4033-a776-f80210c02e63, destName=UHN2KNGcdcttRA01, srcName=UHN2KNGcdcttRA01_Hu0/2/0/35}, {srcName=UHN2KNGcdcttRA01_HundredGigE0/1/0/6, gId=0df0f3d0-037a-4caa-9f81-6a6df1c22e25, destName=UHN2KNGcdcttRA01}]
gremlin>
Converted the combined query valueMap into JSON (Using Version 3)
gremlin>
gremlin> mapper = GraphSONMapper.build().version(GraphSONVersion.V3_0).create().createMapper()
==>org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper#10a907ec
gremlin>
gremlin> mapper.writeValueAsString(output) // output is a variable in which data is collected in step 4
==>{"#type":"g:Map","#value":["nodes",{"#type":"g:List","#value":[{"#type":"g:Map","#value":["gId",{"#type":"g:List","#value":["0b98e8d5-681d-4155-8aaf-5d86babc0cff"]},"isDeleted",{"#type":"g:List","#value":["FALSE"]},"isEntity",{"#type":"g:List","#value":["TRUE"]},"name",{"#type":"g:List","#value":["TotsukaCDC"]},"basetype",{"#type":"g:List","#value":["GeoLocation"]},"source",{"#type":"g:List","#value":["RCP-Base"]},"type",{"#type":"g:List","#value":["DC"]},"geographyL2DisplayName",{"#type":"g:List","#value":["KANAGAWA"]},"geographyL2Name",{"#type":"g:List","#value":["KANAGAWA"]},"geographyL4Name",{"#type":"g:List","#value":["KNG-TOTSUKAKU-NORTH"]},"geographyL4DisplayName",{"#type":"g:List","#value":["KNG-TOTSUKAKU-NORTH"]},"displayName",{"#type":"g:List","#value":["TotsukaCDC"]},"latitude",{"#type":"g:List","#value":[{"#type":"g:Double","#value":139.525166}]},"locationType",{"#type":"g:List","#value":["CDC"]},"geographyL1Name",{"#type":"g:List","#value":["KANTO"]},"geographyL3DisplayName",{"#type":"g:List","#value":["YOKOHAMA-SHI"]},"geographyL3Name",{"#type":"g:List","#value":["YOKOHAMA-SHI"]},"geographyL1DisplayName",{"#type":"g:List","#value":["KANTO"]},"locationCode",{"#type":"g:List","#value":["tt"]},"longitude",{"#type":"g:List","#value":[{"#type":"g:Double","#value":35.416535}]}]},{"#type":"g:Map","#value":["gId",{"#type":"g:List","#value":["90e7407c-cd34-44b0-9bf9-1a8866aac429"]},"isDeleted",{"#type":"g:List","#value":["FALSE"]},"isEntity",{"#type":"g:List","#value":["TRUE"]},"name",{"#type":"g:List","#value":["UHN2KNGcdcttRA01_HundredGigE0/0/0/6"]},"basetype",{"#type":"g:List","#value":["Entity"]},"source",{"#type":"g:List","#value":["RCP-Base"]},"type",{"#type":"g:List","#value":["PhysicalPort"]},"portInUse",{"#type":"g:List","#value":["TRUE"]},"portNum",{"#type":"g:List","#value":["HundredGigE0/0/0/6"]}]},{"#type":"g:Map","#value":["gId",{"#type":"g:List","#value":["d0fc7284-4cd8-4cba-8d3d-be3c4ca2ba31"]},"isDeleted",{"#type":"g:List","#value":["FALSE"]},"isEntity",{"#type":"g:List","#value":["TRUE"]},"name",{"#type":"g:List","#value":["UHN2KNGcdcttRA01_Hu0/2/0/35"]},"basetype",{"#type":"g:List","#value":["Entity"]},"source",{"#type":"g:List","#value":["RCP-Base"]},"type",{"#type":"g:List","#value":["PhysicalPort"]},"portInUse",{"#type":"g:List","#value":["TRUE"]},"portNum",{"#type":"g:List","#value":["Hu0/2/0/35"]}]},{"#type":"g:Map","#value":["gId",{"#type":"g:List","#value":["2f4f5a3a-b88f-4915-acd5-a1d873507f11"]},"isDeleted",{"#type":"g:List","#value":["FALSE"]},"isEntity",{"#type":"g:List","#value":["TRUE"]},"name",{"#type":"g:List","#value":["UHN2KNGcdcttRA01_HundredGigE0/1/0/6"]},"basetype",{"#type":"g:List","#value":["Entity"]},"source",{"#type":"g:List","#value":["RCP-Base"]},"type",{"#type":"g:List","#value":["PhysicalPort"]},"portInUse",{"#type":"g:List","#value":["TRUE"]},"portNum",{"#type":"g:List","#value":["HundredGigE0/1/0/6"]}]}]},"edges",{"#type":"g:List","#value":[{"#type":"g:Map","#value":["destName","TotsukaCDC","srcName","UHN2KNGcdcttRA01","gId","1133ff0f-2f4b-4d21-b2d6-fed796ed13f9"]},{"#type":"g:Map","#value":["gId","220d7d2b-8b96-4331-bdc1-50127685946a","destName","UHN2KNGcdcttRA01","srcName","UHN2KNGcdcttRA01_HundredGigE0/0/0/6"]},{"#type":"g:Map","#value":["gId","ebd78fc0-a66c-4033-a776-f80210c02e63","destName","UHN2KNGcdcttRA01","srcName","UHN2KNGcdcttRA01_Hu0/2/0/35"]},{"#type":"g:Map","#value":["srcName","UHN2KNGcdcttRA01_HundredGigE0/1/0/6","gId","0df0f3d0-037a-4caa-9f81-6a6df1c22e25","destName","UHN2KNGcdcttRA01"]}]}]}
gremlin>
Converted the combined query valueMap into JSON (Using Version 1)
gremlin>
gremlin> mapper1 = GraphSONMapper.build().version(GraphSONVersion.V1_0).create().createMapper()
==>org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper#1a7163e3
gremlin>
gremlin> mapper1.writeValueAsString(output)
==>{"nodes":[{"gId":["0b98e8d5-681d-4155-8aaf-5d86babc0cff"],"isDeleted":["FALSE"],"isEntity":["TRUE"],"name":["TotsukaCDC"],"basetype":["GeoLocation"],"source":["RCP-Base"],"type":["DC"],"geographyL2DisplayName":["KANAGAWA"],"geographyL2Name":["KANAGAWA"],"geographyL4Name":["KNG-TOTSUKAKU-NORTH"],"geographyL4DisplayName":["KNG-TOTSUKAKU-NORTH"],"displayName":["TotsukaCDC"],"latitude":[139.525166],"locationType":["CDC"],"geographyL1Name":["KANTO"],"geographyL3DisplayName":["YOKOHAMA-SHI"],"geographyL3Name":["YOKOHAMA-SHI"],"geographyL1DisplayName":["KANTO"],"locationCode":["tt"],"longitude":[35.416535]},{"gId":["90e7407c-cd34-44b0-9bf9-1a8866aac429"],"isDeleted":["FALSE"],"isEntity":["TRUE"],"name":["UHN2KNGcdcttRA01_HundredGigE0/0/0/6"],"basetype":["Entity"],"source":["RCP-Base"],"type":["PhysicalPort"],"portInUse":["TRUE"],"portNum":["HundredGigE0/0/0/6"]},{"gId":["d0fc7284-4cd8-4cba-8d3d-be3c4ca2ba31"],"isDeleted":["FALSE"],"isEntity":["TRUE"],"name":["UHN2KNGcdcttRA01_Hu0/2/0/35"],"basetype":["Entity"],"source":["RCP-Base"],"type":["PhysicalPort"],"portInUse":["TRUE"],"portNum":["Hu0/2/0/35"]},{"gId":["2f4f5a3a-b88f-4915-acd5-a1d873507f11"],"isDeleted":["FALSE"],"isEntity":["TRUE"],"name":["UHN2KNGcdcttRA01_HundredGigE0/1/0/6"],"basetype":["Entity"],"source":["RCP-Base"],"type":["PhysicalPort"],"portInUse":["TRUE"],"portNum":["HundredGigE0/1/0/6"]}],"edges":[{"destName":"TotsukaCDC","srcName":"UHN2KNGcdcttRA01","gId":"1133ff0f-2f4b-4d21-b2d6-fed796ed13f9"},{"gId":"220d7d2b-8b96-4331-bdc1-50127685946a","destName":"UHN2KNGcdcttRA01","srcName":"UHN2KNGcdcttRA01_HundredGigE0/0/0/6"},{"gId":"ebd78fc0-a66c-4033-a776-f80210c02e63","destName":"UHN2KNGcdcttRA01","srcName":"UHN2KNGcdcttRA01_Hu0/2/0/35"},{"srcName":"UHN2KNGcdcttRA01_HundredGigE0/1/0/6","gId":"0df0f3d0-037a-4caa-9f81-6a6df1c22e25","destName":"UHN2KNGcdcttRA01"}]}

Related

what is the best way to search with multi properties in gremlin

I want a path from vertex A,C,D,E,G,H,
I tired with following code
g.V().hasLabel('a').repeat(out().simplePath()).until(hasLabel('h')).
path().by(values('vehicle','time').fold())
my received output
[[10.00,8.30,v1,v2],[10.30,9.00,9.30,v1,v2,v3],[11.00,9.30,10.00,v1,v2,v3],[1
1.30,10.00,10.30,v1,v2,v3],[12.00,11.00,v1,v3],[12.30,11.30,v1,v3]]
expected output
[a:[10.00,v1],c:[11.00,v1],d:[11.30,v1],e:[12.00,v1],g:[12.30,v1],h:[1.00,v1]],[a:[8.30,v2],c:[9.00,v2],d:[9.30,v2],e:[10.00,v2],g:[11.00,v3],h:[11.30,v3]]
the following is a sample graph
v1 = graph.addVertex(id,1,label,'a','vehicle','v1','time',10.00)
v2 = graph.addVertex(id,2,label,'b','vehicle','v1','time',10.30)
v3 = graph.addVertex(id,3,label,'c','vehicle','v1','time',11.00)
v4 = graph.addVertex(id,4,label,'d','vehicle','v1','time',11.30)
v5 = graph.addVertex(id,5,label,'e','vehicle','v1','time',12.00)
v7 = graph.addVertex(id,7,label,'g','vehicle','v1','time',12.30)
v8 = graph.addVertex(id,8,label,'h','vehicle','v1','time',1.00)
v1.addEdge('traveles',v3)
v3.addEdge('traveles',v4)
v4.addEdge('traveles',v5)
v5.addEdge('traveles',v7)
v7.addEdge('traveles',v8)
g.V(1).property(list,'vehicle','v2').property(list,'time',8.30)
g.V(3).property(list,'vehicle','v2').property(list,'time',9.00).property(list,'vehicle','v3').property(list,'time',9.30)
g.V(4).property(list,'vehicle','v2').property(list,'time',9.30).property(list,'vehicle','v3').property(list,'time',10.00)
g.V(5).property(list,'vehicle','v2').property(list,'time',10.00).property(list,'vehicle','v3').property(list,'time',10.30)
g.V(7).property(list,'vehicle','v3').property(list,'time',11.00)
g.V(8).property(list,'vehicle','v3').property(list,'time',11.30)
can anyone help me please
If your property has multiple values then the values step will return them all. Assuming you have two values you can select one or the other using limit or tail.
gremlin> g.addV('test').property(list,'x',1).property(list,'x',2)
==>v[61316]
gremlin> g.V(61316).values('x')
==>1
==>2
gremlin> g.V(61316).values('x').tail(1)
==>2
gremlin> g.V(61316).values('x').limit(1)
==>1
If you have more than 2 values and you need to select one from the middle of a list or set you can use the range step to select that value.
gremlin> g.V(61316).property(list,'x',5)
==>v[61316]
gremlin> g.V(61316).values('x')
==>1
==>2
==>5
gremlin> g.V(61316).values('x').range(1,2)
==>2
All of this said if you could edit your question with some sample data it would help give a better answer as it seems your data model has lots of values for each property so Gremlin is doing what you are asking it to.
Also, in your example you are finding vertices by their label and not testing the values at all. You can test a multi-property just as you would a single property
gremlin> g.V().has('x',2)
==>v[61316
EDITED to add:
Using these techniques, you could change your path statement to something like this:
path().
by(union(label,
values('time').limit(1),
values('vehicle').limit(1)).fold())

How do I collect values from a vertex used in a traversal?

I want the details of a vertex along with details of vertices that are joined to it.
I have a group vertex, incoming 'member' edges to user vertices. I want the details of the vertices.
g.V(1).as('a').in('member').valueMap().as('b').select('a','b').unfold().dedup()
==>a=v[1]
==>b={image=[images/profile/friend9.jpg], name=[Thomas Thompson], email=[me#thomasthompson.co.uk]}
==>b={image=[images/profile/friend13.jpg], name=[Laura Tostevin], email=[me#lauratostevin.co.uk]}
==>b={image=[images/profile/friend5.jpg], name=[Alan Thompson], email=[me#alanthompson.co.uk]}
==>b={image=[images/profile/friend10.jpg], name=[Laura Bourne], email=[me#laurabourne.co.uk]}
Ideally what I'd want is:
{label: 'group', id=1, name='A Group', users=[{id=2, label="user",name=".."}, ... }]}
When I tried a project, it didn't like me using 'in'
gremlin> g.V('1').project('name','users').by('name').by(in('member').select())
groovysh_parse: 1: unexpected token: in # line 1, column 83.
'name','users').by('name').by(in('member
To get your preferred output format, you have to join the group's valueMap() with the list of users. On TinkerPop's modern toy graph you would do something like this:
gremlin> g.V(3).union(valueMap(true).
by(unfold()),
project('users').
by(__.in('created').
valueMap(true).
by(unfold()).
fold())).
unfold().
group().
by(keys).
by(select(values))
==>[name:lop,id:3,lang:java,label:software,users:[[id:1,label:person,name:marko,...],...]]
Mapping this to your graph should be pretty straight-forward, it's basically just about changing labels.
Because in is a reserved keyword in Groovy you must use the verbose syntax __.in
try:
g.V('1').project('name','users').by('name').by(__.in('member').valueMap(true).fold())

Gremlin traversal.Output all Edge details and also in/out Vertex id's

I'm having trouble constructing the gremlin query to give me all of the Edge details(label, properties) and also the ID's of the Inv and OutV adjoining Vertex's (I don't need any more info from the linked Vertex's, just the ID's).
All I have is the Edge ID as a starting point.
So my Edge is as follows:
Label: "CONTAINS"
id: c6b4f3cb-f96e-cc97-dedb-e405771cb4f2
keys:
key="ekey1", value="e1"
key="ekey2", value="e2"
inV has id 50b4f3cb-f907-c31c-6284-1a3463fd72b9
outV has id 7cb4f3cb-d9a2-1398-61d7-9339be34833b
What I want is a single query that will return me something like -
"CONTAINS", "c6b4f3cb-f96e-cc97-dedb-e405771cb4f2", {ekey1=e1, ekey2=e2, ...}, "50b4f3cb-f907-c31c-6284-1a3463fd72b9", "7cb4f3cb-d9a2-1398-61d7-9339be34833b"
I can get the info in separate queries i.e.
g.E("c6b4f3cb-f96e-cc97-dedb-e405771cb4f2").bothV()
==>v[50b4f3cb-f907-c31c-6284-1a3463fd72b9]
==>v[7cb4f3cb-d9a2-1398-61d7-9339be34833b]
g.E("c6b4f3cb-f96e-cc97-dedb-e405771cb4f2").valueMap()
==>{ekey1=e1, ekey2=e2}
g.E("c6b4f3cb-f96e-cc97-dedb-e405771cb4f2").label()
==>CONTAINS
But I can't for the life of me work out how to combine these into one.
You could use project() to get what you're looking for:
g.E("c6b4f3cb-f96e-cc97-dedb-e405771cb4f2").
project('ekey1', 'inV', 'outV', 'label').
by('ekey1').
by(inV().id()).
by(outV().id()).
by(label).

Gremlin: Can't sum property from other node

I have a graph with post vertices, which have edges to 1 or more tag vertices.
I'm trying to compute the total weight for each tag:
// Create empty graph
graph = TinkerGraph.open()
g = graph.traversal()
// Create some tag vertices
g.inject('food', 'drink').addV('tag').property(id, identity())
// Create some posts with 'food' tag
posts = g.inject(10, 20).addV('post').property('weight', identity()).toList()
g.V(posts).addE('tagged').to(g.V('food'))
// Create some posts with 'drink' tag
posts = g.inject(5).addV('post').property('weight', identity()).toList()
g.V(posts).addE('tagged').to(g.V('drink'))
// Attempt to calculate total weight for each tag
g.V().
hasLabel('post').as('p').
out('tagged').
group('g').
by(id).
by(select('p').values('weight').sum()).
cap('g').next()
but I get this error:
java.lang.Long cannot be cast to org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet
Note that computing the total weight for all the posts works fine:
g.V().hasLabel('post').values('weight').sum()
Any suggestions?
Using Gremlin Server 3.3.4
This is a bug in 3.3.4 (and earlier versions). Here's a workaround:
gremlin> g.V().hasLabel('post').as('p').
......1> out('tagged').
......2> group().
......3> by(id).
......4> by(select('p').by('weight').sum())
==>[food:30,drink:5]

Gremlin Query to return multiple Result in a ResultSet

May be my understanding of gremlin query is wrong :). I am trying to execute a query from Java client and the query is: g.V().hasLabel('MYLABEL').
Have multiple (say 20) vertices that match the label and the ResultSet just have one Result with the data of all twenty vertices included. I would like to have the ResultSet with 20 Results. What way that I need to rearrange the query. please suggest.
few more details:
From Console.
[query result as run from gremlin console][1]
gremlin> client.submit("g.V().hasLabel('PERSON')")
==>result{object=v[11] class=org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex}
==>result{object=v[13] class=org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex}
==>result{object=v[15] class=org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex}
From Java Client
Query -> g.V().hasLabel('PERSON')
The result -> result{object={#type=g:List, #value=[{#type=g:Vertex, #value={id={#type=g:Int64, #value=11}, label=PERSON, properties={AGE=[{#type=g:VertexProperty, #value={id={#type=g:Int64, #value=12}, value={#type=g:Int32, #value=11}, label=AGE}}]}}}, {#type=g:Vertex, #value={id={#type=g:Int64, #value=13}, label=PERSON, properties={AGE=[{#type=g:VertexProperty, #value={id={#type=g:Int64, #value=14}, value={#type=g:Int32, #value=12}, label=AGE}}]}}}, {#type=g:Vertex, #value={id={#type=g:Int64, #value=15}, label=PERSON, properties={AGE=[{#type=g:VertexProperty, #value={id={#type=g:Int64, #value=16}, value={#type=g:Int32, #value=13}, label=AGE}}]}}}]} class=java.util.LinkedHashMap}
Just use fold() as in - you can see my example here:
gremlin> cluster = Cluster.open()
==>localhost/127.0.0.1:8182
gremlin> client = cluster.connect()
==>org.apache.tinkerpop.gremlin.driver.Client$ClusteredClient#51efb731
gremlin> r = client.submit("g.V().hasLabel('person')").all().get()
==>result{object=v[1] class=org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex}
==>result{object=v[2] class=org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex}
==>result{object=v[4] class=org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex}
==>result{object=v[6] class=org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex}
gremlin> r = client.submit("g.V().hasLabel('person').fold()").all().get()
==>result{object=[v[1], v[2], v[4], v[6]] class=java.util.ArrayList}
Note that the downside to fold() in this example is that the result won't be streamed back to the client. You will build the entire list in memory on the server and then it will serialize that list as a single payload. If that list is sufficiently large and you generate enough of such lists you may hit memory/GC issues.

Resources