Multi-step traversal predicates in a SubgraphStrategy cause StackOverflowError

223 views
Skip to first unread message

James

unread,
Aug 5, 2016, 2:53:37 AM8/5/16
to Gremlin-users
I'm hoping someone can help me with my understanding.

I've been using a subgraph strategy and it appears to work for a predicate traversal with a single step, e.g. has(...) but not a longer traversal.

So:

gremlin> graph = TinkerFactory.createModern()

==>tinkergraph[vertices:6 edges:6]

gremlin> g = graph.traversal()

==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]

gremlin> s = SubgraphStrategy.build().vertexCriterion(hasId(1)).create()

==>SubgraphStrategy

gremlin> g.V().filter(hasId(1))

==>v[1]

gremlin> g.withStrategies(s).V()

==>v[1]


works as expected. But if I change the predicate traversal to something slightly more complex, e.g. in('knows').hasId(1) things start to go haywire.

The single step predicates works as expected in 3.1.1-incubating, 3.1.3 and 3.2.1.

In 3.1.1-incubating the multi-step predicate subgraph strategy seems to end up generating the same traversal as using filter(...) but fails to execute:

$ sh apache-gremlin-console-3.1.1-incubating/bin/gremlin.sh 


         \,,,/

         (o o)

-----oOOo-(3)-oOOo-----

plugin activated: tinkerpop.server

plugin activated: tinkerpop.utilities

plugin activated: tinkerpop.tinkergraph

gremlin> graph = TinkerFactory.createModern()

==>tinkergraph[vertices:6 edges:6]

gremlin> g = graph.traversal()

==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]

gremlin> s = SubgraphStrategy.build().vertexCriterion(__.in('knows').hasId(1)).create()

==>SubgraphStrategy

gremlin> g1 = GraphTraversalSource.build().with(s).create(graph)

==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]

gremlin> g.V().filter(__.in('knows').hasId(1)).explain()

==>Traversal Explanation

===========================================================================================================================================

Original Traversal                 [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]


ConnectiveStrategy           [D]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

IdentityRemovalStrategy      [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

IncidentToAdjacentStrategy   [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

AdjacentToIncidentStrategy   [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

FilterRankingStrategy        [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

MatchPredicateStrategy       [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

RangeByIsCountStrategy       [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

TinkerGraphStepStrategy      [P]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

EngineDependentStrategy      [F]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

ProfileStrategy              [F]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

StandardVerificationStrategy [V]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

ComputerVerificationStrategy [V]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]


Final Traversal                    [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

gremlin> g.V().filter(__.in('knows').hasId(1))

==>v[2]

==>v[4]

gremlin> g1.V().explain()

==>Traversal Explanation

===========================================================================================================================================

Original Traversal                 [GraphStep([],vertex)]


ConnectiveStrategy           [D]   [GraphStep([],vertex)]

SubgraphStrategy             [D]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

IdentityRemovalStrategy      [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

IncidentToAdjacentStrategy   [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

AdjacentToIncidentStrategy   [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

FilterRankingStrategy        [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

MatchPredicateStrategy       [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

RangeByIsCountStrategy       [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

TinkerGraphStepStrategy      [P]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

EngineDependentStrategy      [F]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

ProfileStrategy              [F]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

StandardVerificationStrategy [V]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

ComputerVerificationStrategy [V]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]


Final Traversal                    [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

gremlin> g1.V()

java.lang.StackOverflowError

Display stack trace? [yN] y

java.lang.StackOverflowError

at org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep.clone(TraversalFilterStep.java:57)

at org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep.clone(TraversalFilterStep.java:35)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.clone(DefaultTraversal.java:213)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:50)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:28)

at org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep.clone(ConnectiveStep.java:67)

at org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep.clone(ConnectiveStep.java:36)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.clone(DefaultTraversal.java:213)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:50)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:28)

at org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy.lambda$apply$264(SubgraphStrategy.java:115)

at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)

at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)

at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)

at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)

at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)

at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)

at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)

at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)

at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)

at org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy.apply(SubgraphStrategy.java:102)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies.applyStrategies(DefaultTraversalStrategies.java:77)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:83)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:97)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:97)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:97)

        [... about 1000 more repetitions of the applyStrategies(DefaultTraversal.java:97) line deleted ...]

gremlin>


In 3.1.3 and 3.2.1 the .filter(...) version works as expected but the subgraph strategy version dies with the StackOverflowError expressing itself earlier in the explain():


$ sh apache-gremlin-console-3.1.3/bin/gremlin.sh 


         \,,,/

         (o o)

-----oOOo-(3)-oOOo-----

plugin activated: tinkerpop.server

plugin activated: tinkerpop.utilities

plugin activated: tinkerpop.tinkergraph

gremlin> graph = TinkerFactory.createModern()

==>tinkergraph[vertices:6 edges:6]

gremlin> g = graph.traversal()

==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]

gremlin> s = SubgraphStrategy.build().vertexCriterion(__.in('knows').hasId(1)).create()

==>SubgraphStrategy

gremlin> g1 = GraphTraversalSource.build().with(s).create(graph)

==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]

gremlin> g.V().filter(__.in('knows').hasId(1)).explain()

==>Traversal Explanation

===========================================================================================================================================

Original Traversal                 [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]


ConnectiveStrategy           [D]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

IdentityRemovalStrategy      [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

FilterRankingStrategy        [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

IncidentToAdjacentStrategy   [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

AdjacentToIncidentStrategy   [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

MatchPredicateStrategy       [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

RangeByIsCountStrategy       [O]   [GraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

TinkerGraphStepStrategy      [P]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

EngineDependentStrategy      [F]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

ProfileStrategy              [F]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

ComputerVerificationStrategy [V]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

StandardVerificationStrategy [V]   [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]


Final Traversal                    [TinkerGraphStep([],vertex), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

gremlin> g.V().filter(__.in('knows').hasId(1))

==>v[2]

==>v[4]

gremlin> g1.V().explain()

java.lang.StackOverflowError

Display stack trace? [yN] y

java.lang.StackOverflowError

at org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.clone(AbstractStep.java:179)

at org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep.clone(TraversalFilterStep.java:56)

at org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep.clone(TraversalFilterStep.java:35)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.clone(DefaultTraversal.java:213)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:50)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:28)

at org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep.clone(ConnectiveStep.java:67)

at org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep.clone(ConnectiveStep.java:36)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.clone(DefaultTraversal.java:213)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:50)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:28)

at org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy.lambda$apply$0(SubgraphStrategy.java:116)

at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)

at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)

at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)

at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)

at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)

at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)

at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)

at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)

at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)

at org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy.apply(SubgraphStrategy.java:103)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies.applyStrategies(DefaultTraversalStrategies.java:77)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:83)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:97)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:97)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:97)

        [... and so on ...]


And in 3.2.1:


$ sh apache-gremlin-console-3.2.1/bin/gremlin.sh 


         \,,,/

         (o o)

-----oOOo-(3)-oOOo-----

plugin activated: tinkerpop.server

plugin activated: tinkerpop.utilities

plugin activated: tinkerpop.tinkergraph

gremlin> graph = TinkerFactory.createModern()

==>tinkergraph[vertices:6 edges:6]

gremlin> g = graph.traversal()

==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]

gremlin> s = SubgraphStrategy.build().vertexCriterion(__.in('knows').hasId(1)).create()

==>SubgraphStrategy

gremlin> g.V().filter(__.in('knows').hasId(1)).explain()

==>Traversal Explanation

===========================================================================================================================================

Original Traversal                 [GraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]


ConnectiveStrategy           [D]   [GraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

RepeatUnrollStrategy         [O]   [GraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

IdentityRemovalStrategy      [O]   [GraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

IncidentToAdjacentStrategy   [O]   [GraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

MatchPredicateStrategy       [O]   [GraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

AdjacentToIncidentStrategy   [O]   [GraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

PathRetractionStrategy       [O]   [GraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

FilterRankingStrategy        [O]   [GraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

RangeByIsCountStrategy       [O]   [GraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

TinkerGraphStepStrategy      [P]   [TinkerGraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

ProfileStrategy              [F]   [TinkerGraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

StandardVerificationStrategy [V]   [TinkerGraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]


Final Traversal                    [TinkerGraphStep(vertex,[]), TraversalFilterStep([VertexStep(IN,[knows],vertex), HasStep([~id.eq(1)])])]

gremlin> g.V().filter(__.in('knows').hasId(1))

==>v[2]

==>v[4]

gremlin> g.withStrategies(s).V().explain()

java.lang.StackOverflowError

Display stack trace? [yN] y

java.lang.StackOverflowError

at java.util.AbstractCollection.addAll(AbstractCollection.java:343)

at java.util.LinkedHashSet.<init>(LinkedHashSet.java:169)

at org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.clone(AbstractStep.java:182)

at org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.clone(AbstractStep.java:38)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.clone(DefaultTraversal.java:212)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:50)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:28)

at org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep.clone(ConnectiveStep.java:67)

at org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep.clone(ConnectiveStep.java:36)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.clone(DefaultTraversal.java:212)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:50)

at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.clone(DefaultGraphTraversal.java:28)

at org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy.lambda$apply$0(SubgraphStrategy.java:116)

at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)

at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)

at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)

at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)

at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)

at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)

at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)

at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)

at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)

at org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy.apply(SubgraphStrategy.java:103)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies.applyStrategies(DefaultTraversalStrategies.java:79)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:92)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:106)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:106)

at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:106)

        [... and so on ...]


I’m not trying to misuse SubgraphStrategy by having a multi-step traversal as the predicate am I?

Marko Rodriguez

unread,
Aug 5, 2016, 11:01:21 AM8/5/16
to gremli...@googlegroups.com
Hello,

I played with SubgraphStrategy in the console (3.2.1-SNAPSHOT) and get the same behavior you are reporting. 

This is a bug. SubgraphStrategy is very old (and complex) and I suspect there are some traversal cloning issues happening. What is scary is that we don’t have a test case that exposes this — its such a simple usage!

Can you please file a JIRA ticket?

Thank you for explaining the problem clearly. 

*** Also, if you feel like solving it, please feel free to provide a PR :).

Take care,
Marko.
--
You received this message because you are subscribed to the Google Groups "Gremlin-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to gremlin-user...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/gremlin-users/6466184c-bf52-41dd-9ff5-c317ca9f47ef%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Marko Rodriguez

unread,
Aug 5, 2016, 3:19:31 PM8/5/16
to gremli...@googlegroups.com
Hello,

I got interested in the problem and decided to fix it. Unfortunately it took me longer than I expected. The problem is that an infinite recursion occurs when the subgraph filter’s traversal is subjected to SubgraphStrategy! I have added more test cases and have cleaned up SubgraphStrategy accordingly.

The fix is now up for vote at:

Please make sure it meets your requirements and VOTE on the PR if you would be so kind.

Thank you,
Marko.

James

unread,
Aug 8, 2016, 9:29:48 AM8/8/16
to Gremlin-users
Thanks, Marko.

I'll take a look.
Reply all
Reply to author
Forward
0 new messages