`
g.V().hasLabel('node1') \
.as('prop1', 'prop2', 'prop3', 'prop4', 'prop5', 'prop6', 'prop7', 'node1_id_prop8', 'prop9') \
.inE().hasLabel('edge').outV().hasLabel('node2').id().as('node2_id_prop10') \
.select('prop1', 'prop2', 'prop3', 'prop4', 'prop5', 'prop6', 'prop7',
'node1_id_prop8', 'prop9', 'node2_id_prop10') \
.by('prop1').by('prop2').by('prop3').by('prop4').by('prop5') \
.by(values('prop6').fold()).by('prop7').by(T.id).by('prop9').by(T.id).toList()
Here I want to get values include both node ID's?
But I am getting
error message '{'requestId': '7abb9f32-a228-44fb-9206-8b034eb67aa5', 'status': {'message': '{"code":"InternalFailureException","requestId":"7abb9f32-a228-
44fb-9206-8b034eb67aa5","detailedMessage":"TokenTraversal support of java.lang.String does not allow selection by id"}', 'code': 500, 'attributes': {}}, 'result':
{'data': None, 'meta': {}}}'
`
I am expecting to get list of key value pair values that traverse through this node.
With Gremlin, you typically want to follow a pattern where you're touching/fetching the higher level components in the graph first, and then applying filters and serialization techniques later in the query.
In your example, you want to traverse from node1 to node2 first and gather up those higher level components (the vertices) before starting to worry about the properties. You can do that using as() or aggregate()...
A side note here: You typically want to use labels as lower cardinality concepts. Think of them as groupings, or if coming from a relational database background, you can think of them as table names. You typically would not have a vertex/node with a label of "node1". It is more common that you would have a vertex/node with an ID of "node1".
g.V().hasLabel('node1').
aggregate('v').
inE().hasLabel('edge').outV(). # this can be simplified as in('edge')
hasLabel('node2').
aggregate('v').
The values in the aggregate then form a list that you can now select and perform other operations upon. In this case, you want all of the available properties for each of those two vertices. The valueMap() step creates a map of all properties associated with a vertex. Adding true inside of the valueMap() adds the ID and label. The unfold() step here is to unroll the aggregated list and pass each vertex in the list to valueMap():
select('v').
unfold().
valueMap(true)
That would get you a list of maps for each vertex in the following fashion:
[{
<T.id: 1>: <id>,
<T.label: 4>: 'node2',
'Prop1': ['prop1']
},{
<T.id: 1>: <id>,
<T.label: 4>: 'node1',
'Prop1': ['prop1'],
'Prop2': ['prop2'],
'Prop3': ['prop3'],
'Prop4': ['prop4'],
'Prop5': ['prop5'],
...
'Propn': ['propn']
}]
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"}]}
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())