If you really want to have your result and your side-effects returned by a single request, you could do something like this:
gremlin> g.V(1,2,4).aggregate("names").by("name").aggregate("ages").by("age")*.fold().as("data").select("data", "names", "ages")* ==>[data:[v[1], v[2], v[4]], names:[marko, vadas, josh], ages:[29, 27, 32]] gremlin> g.V(1,2,4).aggregate("names").by("name").aggregate("ages").by("age")*.fold().project("data", "se").by().by(cap("names","ages"))* ==>[data:[v[1], v[2], v[4]], se:[names:[marko, vadas, josh], ages:[29, 27, 32]]] gremlin> g.V(1,2,4).aggregate("names").by("name")*.fold().project("data", "se").by().by(cap("names"))* ==>[data:[v[1], v[2], v[4]], se:[marko, vadas, josh]] I'm not saying it would be bad to have Gremlin Server handle that for you, just wanted to show that it's actually pretty easy to get the data and the side-effects without using the traversal admin methods (hence it should work for all GLVs). Cheers, Daniel On Thu, Jul 21, 2016 at 4:51 PM, Stephen Mallette <spmalle...@gmail.com> wrote: > As we look to build out GLVs and expand Gremlin into other programming > languages, one of the important aspects of doing this should be to consider > consistency across GLVs. We should try to prevent capabilities of Java from > being lost in Python, JS, etc. > > As we look at both RemoteGraph in Java and gremlin-python we find that > there is no way to get traversal side-effects. If you write a Traversal and > want side-effects from it, you have to write your traversal to return them > so that it comes back as part of the result set. Since RemoteGraph and > gremlin-python don't really allow you to directly "submit a script" it's > not as though you can execute a traversal once for both the result and the > side-effect and package them together in a single request as you might do > with a simple script request: > > $ curl -X POST -d > > "{\"gremlin\":\"t=g.V(1).values('name').aggregate('x');[v:t.toList(),se:t.getSideEffects().get('x')]\"}" > http://localhost:8182 > > {"requestId":"3d3258b2-e421-459a-bf53-ea1e58ece4aa","status":{"message":"","code":200,"attributes":{}},"result":{"data":[{"v":["marko"]},{"se":["marko"]}],"meta":{}}} > > I'm thinking that we could alter things in a non-breaking way to allow > optional return of side-effect data so that there is a way to have this all > streamed back without the need for the little workaround I just > demonstrated. For REST I think we could just include a sideEffect request > parameter that allowed for a list of side-effect keys to return. Perhaps > the a "*" could indicate that all should be returned. the side-effects > could be serialized into a key sibling to "data" called "sideEffect". > > I think a similar approach could be used for websockets and NIO where we > could amend the protocol to accept that sideEffect parameter. We would > first stream results (marked with meta data to specify a "result") and then > stream side effects (again marked with meta data as such). > > I considered caching the Traversal instances so that a future request could > get the side effects, but for a variety of reasons I abandoned that (the > cache meant more heap and trying to get the right balance, new transactions > would have to be opened if the side-effect contained graph elements, etc.) > > I like the approach of just maintaining our single request-response model > with the changes I proposed above.It seems to provide the least impact with > no new dependencies, is backward compatible and could be completely > optional to RemoteConnections. >