How do I retrieve multiple multi-properties in Gremlin?

Tags: ,



I have a Person object that I’m writing to a graph like this:

gts.addV(newId).label('Person')
  .property(single, 'name', 'Alice')
  .property(set, 'email', 'alice1@example.invalid')
  .property(set, 'email', 'alice2@example.invalid')

Now I want to retrieve contents of the vertex. As documented, elementMap doesn’t work because it returns just a single property value for multi-properties. I tried values('name', 'email'), but that returned all of the properties in a flattened list instead of the nested structure I expected:

['Alice', 'alice2@example.invalid', 'alice1@example.invalid']

I’ve tried various combinations of values, project, and as/select, but I always get an empty result, a flat list, or a single value on multi-properties.

How can I query a vertex so that I get something like these results?

['Alice', ['alice2@example.invalid', 'alice1@example.invalid']]

or

[name:'Alice', email:['alice2@example.invalid', 'alice1@example.invalid']]

Answer

If you are just looking to return a map of the values you can achieve this using the valueMap() step:

g.V(newId).valueMap('name', 'email')

which will return:

[name:[Alice],email:[alice1@example.invalid,alice2@example.invalid]]

If you want to return just the values you can do that by adding a select(values):

g.V().valueMap('name', 'email').select(values)

which returns

[[Alice],[alice1@example.invalid,alice2@example.invalid]]



Source: stackoverflow