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/02/11 14:03:18 UTC

RE: failing optional and order by gremlin

Hi,

The following query no longer works on 3.2.4

    @Test
    public void testOptionalWithOrderBy() {
        final TinkerGraph g = TinkerGraph.open();
        Vertex a1 = g.addVertex(T.label, "A", "name", "a1");
        Vertex b1 = g.addVertex(T.label, "B", "name", "b1");
        Vertex b2 = g.addVertex(T.label, "B", "name", "b2");
        Vertex b3 = g.addVertex(T.label, "B", "name", "b3");
        Vertex c1 = g.addVertex(T.label, "C", "name", "c1");
        Vertex c2 = g.addVertex(T.label, "C", "name", "c2");
        Vertex c3 = g.addVertex(T.label, "C", "name", "c3");
        a1.addEdge("ab", b1, "order", 3);
        a1.addEdge("ab", b2, "order", 2);
        a1.addEdge("ab", b3, "order", 1);
        b1.addEdge("bc", c1, "order", 3);
        b1.addEdge("bc", c2, "order", 2);
        b1.addEdge("bc", c3, "order", 1);
        GraphTraversal<Vertex, Vertex> traversal = g.traversal().V(a1.id())
                .optional(
                        __.outE("ab").as("ab").otherV().as("vb")
                                .optional(
                                       
__.outE("bc").as("bc").otherV().as("vc")
                                )
                )
                .order().by(__.select("ab").by("order"),
Order.incr).by(__.select("bc").by("order"), Order.incr);
        while (traversal.hasNext()) {
            System.out.println(traversal.next().<String>value("name"));
        }
    }

On 3.2.3 it returns

b3
b2
c3
c2
c1

On 3.2.4 it throws the following exception,

java.lang.IllegalArgumentException: The provided traverser does not map
to a value: v[6]->[SelectOneStep(bc,value(order))]
    at
org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil.apply(TraversalUtil.java:45)
    at
org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep.createProjectedTraverser(OrderGlobalStep.java:155)
    at
org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep.processAllStarts(OrderGlobalStep.java:74)
    at
org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep.processNextStart(CollectingBarrierStep.java:108)
    at
org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.hasNext(AbstractStep.java:143)
    at
org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.hasNext(DefaultTraversal.java:184)

Has the semantics changed or is it a bug?

Thanks
Pieter


Re: failing optional and order by gremlin

Posted by pieter-gmail <pi...@gmail.com>.
OK got it.

Thanks for the help.

Cheers,
Pieter

On 11/02/2017 16:46, Daniel Kuppitz wrote:
> This looks like a bug in 3.2.3. It's clearly expected to fail, since by()
> modulators should always fail if the traverser can't emit a value. What you
> actually want to do is this:
>
> gremlin> g.traversal().V(a1.id()).optional(
> ......1>     outE("ab").as("e").otherV().as("vb").optional(
> ......2>       outE("bc").as("e").otherV().as("vc"))).
> ......3>   order().by(select(first, "e").by("order")).
> ......4>           by(select(last, "e").by("order")).values("name")
> ==>b3
> ==>b2
> ==>c3
> ==>c2
> ==>c1
>
> Not related to your problem, but I thought I should point that out: don't
> use otherV() when you know the direction.
>
> g.traversal().V(a1.id()).optional(
>     outE("ab").as("e").inV().as("vb").optional(
>       outE("bc").as("e").inV().as("vc"))).
>   order().by(select(first, "e").by("order")).
>           by(select(last, "e").by("order")).values("name")
>
> Also, some labels are redundant in this particular traversal; get rid of
> them:
>
> g.traversal().V(a1.id()).optional(
>     outE("ab").as("e").inV().optional(
>       outE("bc").as("e").inV())).
>   order().by(select(first, "e").by("order")).
>           by(select(last, "e").by("order")).values("name")
>
> Oh, and there's something else: The query would fail if there wouldn't be a
> single "ab" edge. If you want to take this into account, do:
>
> g.traversal().V(a1.id()).optional(
>     outE("ab").as("e").inV().optional(
>       outE("bc").as("e").inV())).
>   order().by(coalesce(select(first, "e").by("order"), constant(0))).
>           by(coalesce(select(last, "e").by("order"),
> constant(0))).values("name")
>
> And finally, pointing out the obvious: don't create a new traversal source
> for every query.
>
> That's it.
>
> Cheers,
> Daniel
>
>
> On Sat, Feb 11, 2017 at 3:03 PM, pieter-gmail <pi...@gmail.com>
> wrote:
>
>> Hi,
>>
>> The following query no longer works on 3.2.4
>>
>>     @Test
>>     public void testOptionalWithOrderBy() {
>>         final TinkerGraph g = TinkerGraph.open();
>>         Vertex a1 = g.addVertex(T.label, "A", "name", "a1");
>>         Vertex b1 = g.addVertex(T.label, "B", "name", "b1");
>>         Vertex b2 = g.addVertex(T.label, "B", "name", "b2");
>>         Vertex b3 = g.addVertex(T.label, "B", "name", "b3");
>>         Vertex c1 = g.addVertex(T.label, "C", "name", "c1");
>>         Vertex c2 = g.addVertex(T.label, "C", "name", "c2");
>>         Vertex c3 = g.addVertex(T.label, "C", "name", "c3");
>>         a1.addEdge("ab", b1, "order", 3);
>>         a1.addEdge("ab", b2, "order", 2);
>>         a1.addEdge("ab", b3, "order", 1);
>>         b1.addEdge("bc", c1, "order", 3);
>>         b1.addEdge("bc", c2, "order", 2);
>>         b1.addEdge("bc", c3, "order", 1);
>>         GraphTraversal<Vertex, Vertex> traversal = g.traversal().V(a1.id
>> ())
>>                 .optional(
>>                         __.outE("ab").as("ab").otherV().as("vb")
>>                                 .optional(
>>
>> __.outE("bc").as("bc").otherV().as("vc")
>>                                 )
>>                 )
>>                 .order().by(__.select("ab").by("order"),
>> Order.incr).by(__.select("bc").by("order"), Order.incr);
>>         while (traversal.hasNext()) {
>>             System.out.println(traversal.next().<String>value("name"));
>>         }
>>     }
>>
>> On 3.2.3 it returns
>>
>> b3
>> b2
>> c3
>> c2
>> c1
>>
>> On 3.2.4 it throws the following exception,
>>
>> java.lang.IllegalArgumentException: The provided traverser does not map
>> to a value: v[6]->[SelectOneStep(bc,value(order))]
>>     at
>> org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil.apply(
>> TraversalUtil.java:45)
>>     at
>> org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep.
>> createProjectedTraverser(OrderGlobalStep.java:155)
>>     at
>> org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep.
>> processAllStarts(OrderGlobalStep.java:74)
>>     at
>> org.apache.tinkerpop.gremlin.process.traversal.step.util.
>> CollectingBarrierStep.processNextStart(CollectingBarrierStep.java:108)
>>     at
>> org.apache.tinkerpop.gremlin.process.traversal.step.util.
>> AbstractStep.hasNext(AbstractStep.java:143)
>>     at
>> org.apache.tinkerpop.gremlin.process.traversal.util.
>> DefaultTraversal.hasNext(DefaultTraversal.java:184)
>>
>> Has the semantics changed or is it a bug?
>>
>> Thanks
>> Pieter
>>
>>


Re: failing optional and order by gremlin

Posted by Daniel Kuppitz <me...@gremlin.guru>.
This looks like a bug in 3.2.3. It's clearly expected to fail, since by()
modulators should always fail if the traverser can't emit a value. What you
actually want to do is this:

gremlin> g.traversal().V(a1.id()).optional(
......1>     outE("ab").as("e").otherV().as("vb").optional(
......2>       outE("bc").as("e").otherV().as("vc"))).
......3>   order().by(select(first, "e").by("order")).
......4>           by(select(last, "e").by("order")).values("name")
==>b3
==>b2
==>c3
==>c2
==>c1

Not related to your problem, but I thought I should point that out: don't
use otherV() when you know the direction.

g.traversal().V(a1.id()).optional(
    outE("ab").as("e").inV().as("vb").optional(
      outE("bc").as("e").inV().as("vc"))).
  order().by(select(first, "e").by("order")).
          by(select(last, "e").by("order")).values("name")

Also, some labels are redundant in this particular traversal; get rid of
them:

g.traversal().V(a1.id()).optional(
    outE("ab").as("e").inV().optional(
      outE("bc").as("e").inV())).
  order().by(select(first, "e").by("order")).
          by(select(last, "e").by("order")).values("name")

Oh, and there's something else: The query would fail if there wouldn't be a
single "ab" edge. If you want to take this into account, do:

g.traversal().V(a1.id()).optional(
    outE("ab").as("e").inV().optional(
      outE("bc").as("e").inV())).
  order().by(coalesce(select(first, "e").by("order"), constant(0))).
          by(coalesce(select(last, "e").by("order"),
constant(0))).values("name")

And finally, pointing out the obvious: don't create a new traversal source
for every query.

That's it.

Cheers,
Daniel


On Sat, Feb 11, 2017 at 3:03 PM, pieter-gmail <pi...@gmail.com>
wrote:

> Hi,
>
> The following query no longer works on 3.2.4
>
>     @Test
>     public void testOptionalWithOrderBy() {
>         final TinkerGraph g = TinkerGraph.open();
>         Vertex a1 = g.addVertex(T.label, "A", "name", "a1");
>         Vertex b1 = g.addVertex(T.label, "B", "name", "b1");
>         Vertex b2 = g.addVertex(T.label, "B", "name", "b2");
>         Vertex b3 = g.addVertex(T.label, "B", "name", "b3");
>         Vertex c1 = g.addVertex(T.label, "C", "name", "c1");
>         Vertex c2 = g.addVertex(T.label, "C", "name", "c2");
>         Vertex c3 = g.addVertex(T.label, "C", "name", "c3");
>         a1.addEdge("ab", b1, "order", 3);
>         a1.addEdge("ab", b2, "order", 2);
>         a1.addEdge("ab", b3, "order", 1);
>         b1.addEdge("bc", c1, "order", 3);
>         b1.addEdge("bc", c2, "order", 2);
>         b1.addEdge("bc", c3, "order", 1);
>         GraphTraversal<Vertex, Vertex> traversal = g.traversal().V(a1.id
> ())
>                 .optional(
>                         __.outE("ab").as("ab").otherV().as("vb")
>                                 .optional(
>
> __.outE("bc").as("bc").otherV().as("vc")
>                                 )
>                 )
>                 .order().by(__.select("ab").by("order"),
> Order.incr).by(__.select("bc").by("order"), Order.incr);
>         while (traversal.hasNext()) {
>             System.out.println(traversal.next().<String>value("name"));
>         }
>     }
>
> On 3.2.3 it returns
>
> b3
> b2
> c3
> c2
> c1
>
> On 3.2.4 it throws the following exception,
>
> java.lang.IllegalArgumentException: The provided traverser does not map
> to a value: v[6]->[SelectOneStep(bc,value(order))]
>     at
> org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil.apply(
> TraversalUtil.java:45)
>     at
> org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep.
> createProjectedTraverser(OrderGlobalStep.java:155)
>     at
> org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep.
> processAllStarts(OrderGlobalStep.java:74)
>     at
> org.apache.tinkerpop.gremlin.process.traversal.step.util.
> CollectingBarrierStep.processNextStart(CollectingBarrierStep.java:108)
>     at
> org.apache.tinkerpop.gremlin.process.traversal.step.util.
> AbstractStep.hasNext(AbstractStep.java:143)
>     at
> org.apache.tinkerpop.gremlin.process.traversal.util.
> DefaultTraversal.hasNext(DefaultTraversal.java:184)
>
> Has the semantics changed or is it a bug?
>
> Thanks
> Pieter
>
>