[
https://issues.apache.org/jira/browse/TINKERPOP3-693?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Marko A. Rodriguez closed TINKERPOP3-693.
-----------------------------------------
Resolution: Won't Fix
I tried to implement this a while back. I got it working for a few steps, but
it was so crazy and a near rewrite of those steps I had it working for that I
got discouraged... I think TINKERPOP3-940 might be the way forward on this
front. Either way, closing this ticket as I don't its ideas corrupting a future
realization.
> [Proposal] Local Nested Traversals Beyond the Star Graph in OLAP
> ----------------------------------------------------------------
>
> Key: TINKERPOP3-693
> URL: https://issues.apache.org/jira/browse/TINKERPOP3-693
> Project: TinkerPop 3
> Issue Type: Improvement
> Components: process
> Affects Versions: 3.0.2-incubating
> Reporter: Marko A. Rodriguez
> Assignee: Marko A. Rodriguez
>
> Here is a half-baked solution to the "local star graph"-problem in Gremlin
> OLAP.
> A {{Traverser}} not only maintains a pointer to its current object, but also
> to its "local traversal spawn object." For instance:
> {code}
> g.V.where(out('knows').has('name','bob')).name
> {code}
> The {{Traverser}} going into the {{where()}} step will, lets say, be at
> {{v[1]}}. Thus:
> {code}
> Traverser.get() == v[1]
> Traverser.spawn() == v[1]
> Traverser.stepId() == "out('knows')"-stepId
> {code}
> At the next step, the {{Traverser[v[1]]}} hits up the {{out("knows")}} step.
> This will trigger a message pass. Lets say {{v[1]--knows-->v[2]}}.
> {code}
> Traverser.get() == v[2]
> Traverser.spawn() == v[1]
> Traverser.stepId() == "has('name','bob')"-stepId
> {code}
> At this point, the {{Traverser[v[2]]}} is shoved into {{has("name","bob")}}
> and lets say that {{v[2]}} is "bob." What is the next step? There is none
> because its at the end of the local traversal. So, {{TraverserExecutor}}
> looks up {{step.getTraversal().getTraversalParent()}} and executes the local
> {{where()}}-step with a behavior of "v[1] went into , and v[2] came out."
> Thus, a "simulated local traversal" is "v[1] --> v[2]" and {{where()}}-step
> simply says "ah, v[2], then let me emit v[1]". This yields a {{Traverser}} of:
> {code}
> Traverser.get() == v[1]
> Traverser.spawn() == null
> Traverser.stepId() == values('name')-stepId
> {code}
> The {{Traverser}} is sent back to {{v[1]}} to solve the
> {{values('name')}}-step function.
> This notion of a "simulated local traversal" is that the {{where()-step}}
> local traversal can be "wrapped" on the fly by {{TraverserExecutor}} such
> that:
> {code}
> out('knows').has('name','bob') --> directMap(v[1],v[2])
> {code}
> So this is doable for a single local traversal. What about parallel local
> traversals like {{and(a,b,c)}}. In this situation, {{a}}, {{b}}, and {{c}}
> must all come back before {{and()}} is complete. I think it might work
> something like this:
> {code}
> Traverser.get() == v[1]
> Traverser.spawn() == v[1]
> Traverser.sessionId() == uuid:123-456-789(3)
> {code}
> In this way, before the {{spawn}} is "released" by {{and()}}, three
> uuid:123-456-789 session ids must be returned with {{Traverser.get() !=
> null}}. If that happens, the {{and()}} released {{v[1]}} to the next step.
> Note that in this model all the state is in the {{Traverser}}. There is no
> step state required. Given that {{Traversers}} are stored at the local vertex
> during iterations, looking up a {{Traverser}} by {{sessionId}} can be just as
> easy as looking it up by {{Traverser.get()}}. In this way, a placeholder
> {{Traverser}} exists at the {{and()}}-ing vertex waiting for its
> {{sessionId}} to complete.
> .......................... a little sketchy and involved. But I think with
> some more mulling we can come up with a simple "ah, that is just a that which
> makes this just that and I can delete the entire codebase because there never
> was a problem to begin with. I can die yielding no intent. Finally."
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)