You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by pieter gmail <pi...@gmail.com> on 2017/11/22 17:49:43 UTC

RE: dropStep and BarrierStep

Hi,

Whilst optimizing the DropStep in Sqlg I came across RepeatStep plus 
DropStep in a traversal going into a infinite loop.

To test Sqlg I tested on TinkerPop's ComplexTest.playlistPath() changing 
the gremlin to have a drop()

     @Test
     public void testDropPlaylist() {
         final TinkerGraph g = TinkerGraph.open();
         Io.Builder<GraphSONIo> builder = 
GraphSONIo.build(GraphSONVersion.V3_0);
         final GraphReader reader = g.io(builder).reader().create();
         try (final InputStream stream = 
AbstractGremlinTest.class.getResourceAsStream("/grateful-dead-v3d0.json")) {
             reader.readGraph(stream, g);
         } catch (IOException e) {
             Assert.fail(e.getMessage());
         }
         Traversal<Vertex, Vertex> playListTraversal = getPlaylistPaths(g);
         System.out.println(playListTraversal.toString());
         List<Vertex> vertices = playListTraversal.toList();
         Assert.assertEquals(100, vertices.size());
         System.out.println("counted");
         Traversal<Vertex, Vertex> dropTraversal = 
getPlaylistPaths(g).drop().drop().iterate();
         System.out.println("done");
     }

     public GraphTraversal<Vertex, Vertex> getPlaylistPaths(Graph graph) {
         return graph.traversal().V().has("name", 
"Bob_Dylan").in("sungBy").as("a").
repeat(__.out().order().by(Order.shuffle).simplePath().from("a")).
                 until(__.out("writtenBy").has("name", 
"Johnny_Cash")).limit(1).as("b").
repeat(__.out().order().by(Order.shuffle).as("c").simplePath().from("b").to("c")).
                 until(__.out("sungBy").has("name", 
"Grateful_Dead")).limit(100);
     }

The second dropTraversal goes into an infinite loop.

A simpler scenario illustrating the infinite loop,

     @Test
     public void testRepeatDrop() {
         final TinkerGraph g = TinkerGraph.open();
         Vertex a1 = g.addVertex(T.label, "A");
         Vertex b1 = g.addVertex(T.label, "B");
         Vertex c1 = g.addVertex(T.label, "C");
         a1.addEdge("ab", b1);
         b1.addEdge("ba", a1);
         b1.addEdge("bc", c1);

         Vertex a2 = g.addVertex(T.label, "A");
         Vertex b2 = g.addVertex(T.label, "B");
         Vertex c2 = g.addVertex(T.label, "C");
         a2.addEdge("ab", b2);
         b2.addEdge("ba", a2);
         b2.addEdge("bc", c2);

         a1.addEdge("ac", c1);
         a1.addEdge("ac", c2);

         List<Vertex> vertices = 
g.traversal().withoutStrategies(LazyBarrierStrategy.class)
                 .V().hasLabel("A")
                 .repeat(__.out("ab", "ba"))
                 .until(__.out("bc"))
                 .out("bc")
                 .in("ac")
                 .out("ac")
                 .toList();
         Assert.assertEquals(4, vertices.size());
g.traversal().withoutStrategies(LazyBarrierStrategy.class)
                 .V().hasLabel("A")
                 .repeat(__.out("ab", "ba"))
                 .until(__.out("bc"))
                 .out("bc")
                 .in("ac")
                 .out("ac")
                 .drop()
                 .iterate();
         System.out.println("asdasdasd");
     }

Adding a BarrierStep before drop() resolves the issue but probably this 
should happen automatically in a strategy?
Afraid I can not quite tell what the scenarios are that would cause this 
issue so not sure if a BarrierStep should always be added or only sometimes.

Cheers
Pieter



Re: dropStep and BarrierStep

Posted by Daniel Kuppitz <me...@gremlin.guru>.
Hi Pieter,

can you create a Jira ticket for this issue? I think it's a general problem
related to mutating steps and a strategy that inserts BarrierSteps in front
of mutating steps should solve this and a few other issues.

Cheers,
Daniel


On Thu, Nov 30, 2017 at 8:28 AM, pieter gmail <pi...@gmail.com>
wrote:

> Hi,
>
> Any ideas about this one?
>
> Thanks
> Pieter
>
>
> On 22/11/2017 19:49, pieter gmail wrote:
>
>> Hi,
>>
>> Whilst optimizing the DropStep in Sqlg I came across RepeatStep plus
>> DropStep in a traversal going into a infinite loop.
>>
>> To test Sqlg I tested on TinkerPop's ComplexTest.playlistPath() changing
>> the gremlin to have a drop()
>>
>>     @Test
>>     public void testDropPlaylist() {
>>         final TinkerGraph g = TinkerGraph.open();
>>         Io.Builder<GraphSONIo> builder = GraphSONIo.build(GraphSONVersi
>> on.V3_0);
>>         final GraphReader reader = g.io(builder).reader().create();
>>         try (final InputStream stream = AbstractGremlinTest.class.getR
>> esourceAsStream("/grateful-dead-v3d0.json")) {
>>             reader.readGraph(stream, g);
>>         } catch (IOException e) {
>>             Assert.fail(e.getMessage());
>>         }
>>         Traversal<Vertex, Vertex> playListTraversal = getPlaylistPaths(g);
>>         System.out.println(playListTraversal.toString());
>>         List<Vertex> vertices = playListTraversal.toList();
>>         Assert.assertEquals(100, vertices.size());
>>         System.out.println("counted");
>>         Traversal<Vertex, Vertex> dropTraversal =
>> getPlaylistPaths(g).drop().drop().iterate();
>>         System.out.println("done");
>>     }
>>
>>     public GraphTraversal<Vertex, Vertex> getPlaylistPaths(Graph graph) {
>>         return graph.traversal().V().has("name",
>> "Bob_Dylan").in("sungBy").as("a").
>> repeat(__.out().order().by(Order.shuffle).simplePath().from("a")).
>>                 until(__.out("writtenBy").has("name",
>> "Johnny_Cash")).limit(1).as("b").
>> repeat(__.out().order().by(Order.shuffle).as("c").simplePath().from("b").to("c")).
>>
>>                 until(__.out("sungBy").has("name",
>> "Grateful_Dead")).limit(100);
>>     }
>>
>> The second dropTraversal goes into an infinite loop.
>>
>> A simpler scenario illustrating the infinite loop,
>>
>>     @Test
>>     public void testRepeatDrop() {
>>         final TinkerGraph g = TinkerGraph.open();
>>         Vertex a1 = g.addVertex(T.label, "A");
>>         Vertex b1 = g.addVertex(T.label, "B");
>>         Vertex c1 = g.addVertex(T.label, "C");
>>         a1.addEdge("ab", b1);
>>         b1.addEdge("ba", a1);
>>         b1.addEdge("bc", c1);
>>
>>         Vertex a2 = g.addVertex(T.label, "A");
>>         Vertex b2 = g.addVertex(T.label, "B");
>>         Vertex c2 = g.addVertex(T.label, "C");
>>         a2.addEdge("ab", b2);
>>         b2.addEdge("ba", a2);
>>         b2.addEdge("bc", c2);
>>
>>         a1.addEdge("ac", c1);
>>         a1.addEdge("ac", c2);
>>
>>         List<Vertex> vertices = g.traversal().withoutStrategie
>> s(LazyBarrierStrategy.class)
>>                 .V().hasLabel("A")
>>                 .repeat(__.out("ab", "ba"))
>>                 .until(__.out("bc"))
>>                 .out("bc")
>>                 .in("ac")
>>                 .out("ac")
>>                 .toList();
>>         Assert.assertEquals(4, vertices.size());
>> g.traversal().withoutStrategies(LazyBarrierStrategy.class)
>>                 .V().hasLabel("A")
>>                 .repeat(__.out("ab", "ba"))
>>                 .until(__.out("bc"))
>>                 .out("bc")
>>                 .in("ac")
>>                 .out("ac")
>>                 .drop()
>>                 .iterate();
>>         System.out.println("asdasdasd");
>>     }
>>
>> Adding a BarrierStep before drop() resolves the issue but probably this
>> should happen automatically in a strategy?
>> Afraid I can not quite tell what the scenarios are that would cause this
>> issue so not sure if a BarrierStep should always be added or only sometimes.
>>
>> Cheers
>> Pieter
>>
>>
>>
>

Re: dropStep and BarrierStep

Posted by pieter gmail <pi...@gmail.com>.
Hi,

Any ideas about this one?

Thanks
Pieter

On 22/11/2017 19:49, pieter gmail wrote:
> Hi,
>
> Whilst optimizing the DropStep in Sqlg I came across RepeatStep plus 
> DropStep in a traversal going into a infinite loop.
>
> To test Sqlg I tested on TinkerPop's ComplexTest.playlistPath() 
> changing the gremlin to have a drop()
>
>     @Test
>     public void testDropPlaylist() {
>         final TinkerGraph g = TinkerGraph.open();
>         Io.Builder<GraphSONIo> builder = 
> GraphSONIo.build(GraphSONVersion.V3_0);
>         final GraphReader reader = g.io(builder).reader().create();
>         try (final InputStream stream = 
> AbstractGremlinTest.class.getResourceAsStream("/grateful-dead-v3d0.json")) 
> {
>             reader.readGraph(stream, g);
>         } catch (IOException e) {
>             Assert.fail(e.getMessage());
>         }
>         Traversal<Vertex, Vertex> playListTraversal = 
> getPlaylistPaths(g);
>         System.out.println(playListTraversal.toString());
>         List<Vertex> vertices = playListTraversal.toList();
>         Assert.assertEquals(100, vertices.size());
>         System.out.println("counted");
>         Traversal<Vertex, Vertex> dropTraversal = 
> getPlaylistPaths(g).drop().drop().iterate();
>         System.out.println("done");
>     }
>
>     public GraphTraversal<Vertex, Vertex> getPlaylistPaths(Graph graph) {
>         return graph.traversal().V().has("name", 
> "Bob_Dylan").in("sungBy").as("a").
> repeat(__.out().order().by(Order.shuffle).simplePath().from("a")).
>                 until(__.out("writtenBy").has("name", 
> "Johnny_Cash")).limit(1).as("b").
> repeat(__.out().order().by(Order.shuffle).as("c").simplePath().from("b").to("c")). 
>
>                 until(__.out("sungBy").has("name", 
> "Grateful_Dead")).limit(100);
>     }
>
> The second dropTraversal goes into an infinite loop.
>
> A simpler scenario illustrating the infinite loop,
>
>     @Test
>     public void testRepeatDrop() {
>         final TinkerGraph g = TinkerGraph.open();
>         Vertex a1 = g.addVertex(T.label, "A");
>         Vertex b1 = g.addVertex(T.label, "B");
>         Vertex c1 = g.addVertex(T.label, "C");
>         a1.addEdge("ab", b1);
>         b1.addEdge("ba", a1);
>         b1.addEdge("bc", c1);
>
>         Vertex a2 = g.addVertex(T.label, "A");
>         Vertex b2 = g.addVertex(T.label, "B");
>         Vertex c2 = g.addVertex(T.label, "C");
>         a2.addEdge("ab", b2);
>         b2.addEdge("ba", a2);
>         b2.addEdge("bc", c2);
>
>         a1.addEdge("ac", c1);
>         a1.addEdge("ac", c2);
>
>         List<Vertex> vertices = 
> g.traversal().withoutStrategies(LazyBarrierStrategy.class)
>                 .V().hasLabel("A")
>                 .repeat(__.out("ab", "ba"))
>                 .until(__.out("bc"))
>                 .out("bc")
>                 .in("ac")
>                 .out("ac")
>                 .toList();
>         Assert.assertEquals(4, vertices.size());
> g.traversal().withoutStrategies(LazyBarrierStrategy.class)
>                 .V().hasLabel("A")
>                 .repeat(__.out("ab", "ba"))
>                 .until(__.out("bc"))
>                 .out("bc")
>                 .in("ac")
>                 .out("ac")
>                 .drop()
>                 .iterate();
>         System.out.println("asdasdasd");
>     }
>
> Adding a BarrierStep before drop() resolves the issue but probably 
> this should happen automatically in a strategy?
> Afraid I can not quite tell what the scenarios are that would cause 
> this issue so not sure if a BarrierStep should always be added or only 
> sometimes.
>
> Cheers
> Pieter
>
>