[ 
https://issues.apache.org/jira/browse/TINKERPOP-2854?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17679222#comment-17679222
 ] 

Stephen Mallette commented on TINKERPOP-2854:
---------------------------------------------

Using the Gremlin Console's {{:bc}} command we can turn that GraphSON bytecode 
into a nice Gremlin string representation:
{code:java}
gremlin> :bc translate g <your-graphson-with-line-breaks-removed>
==>Script[(g.inject(" cypher.start").map(__.project(" GENERATED1"," 
GENERATED2"," 
GENERATED3").by(__.constant(1L)).by(__.constant(2L)).by(__.constant(3L)).select(Column.values)).project("r").by(__.project("
 GENERATED5"," GENERATED6"," 
GENERATED7").by(__.identity()).by(__.choose(__.constant(from),__.constant(from),__.constant("
 cypher.null"))).by(__.choose(__.constant(to),__.constant(to),__.constant(" 
cypher.null"))).select(Column.values).map({cypherListSlice().apply(it)})).inject("
 cypher.start").map(__.project(" GENERATED1"," GENERATED2"," 
GENERATED3").by(__.constant(1L)).by(__.constant(2L)).by(__.constant(3L)).select(Column.values)).project("r").by(__.project("
 GENERATED5"," GENERATED6"," 
GENERATED7").by(__.identity()).by(__.choose(__.constant(from),__.constant(from),__.constant("
 cypher.null"))).by(__.choose(__.constant(to),__.constant(to),__.constant(" 
cypher.null"))).select(Column.values).map({cypherListSlice().apply(it)})),Optional.empty)]
{code}
which formats more nicely in Gremlint to:
{code:java}
g.inject(" cypher.start").
  map(
    __.project(" GENERATED1", " GENERATED2", " GENERATED3").
      by(__.constant(1L)).
      by(__.constant(2L)).
      by(__.constant(3L)).
    select(Column.values)).
  project("r").
    by(
      __.project(" GENERATED5", " GENERATED6", " GENERATED7").
        by(__.identity()).
        by(
          __.choose(
  __.constant(from),
  __.constant(from),
  __.constant(" cypher.null"))).
        by(
          __.choose(__.constant(to), __.constant(to), __.constant(" 
cypher.null"))).
      select(Column.values).
      map({cypherListSlice().apply(it)})).
  inject(" cypher.start").
  map(
    __.project(" GENERATED1", " GENERATED2", " GENERATED3").
      by(__.constant(1L)).
      by(__.constant(2L)).
      by(__.constant(3L)).
    select(Column.values)).
  project("r").
    by(
      __.project(" GENERATED5", " GENERATED6", " GENERATED7").
        by(__.identity()).
        by(
          __.choose(
  __.constant(from),
  __.constant(from),
  __.constant(" cypher.null"))).
        by(
          __.choose(__.constant(to), __.constant(to), __.constant(" 
cypher.null"))).
      select(Column.values).
      map({cypherListSlice().apply(it)}))
{code}
I believe the problem is that 3.6.x introduces two {{Direction}} alias values 
for {{OUT}} and {{IN}} called {{from}} and {{to}} respectively making those 
tokens reserved. Rather than treat those tokens as variable bindings (which i 
believe cypher-for-gremlin intended them to be) they are now being considered 
{{{}Direction{}}}.

As a result, I don't think this is a bug in TinkerPop, but rather a breaking 
change that consuming libraries and clients would have to adjust to. I think 
that if cypher-for-gremlin were to change its naming of "from" and "to" this 
part would start working again. 

> Generated Traversal differs from v3.4.13 to v3.6.1
> --------------------------------------------------
>
>                 Key: TINKERPOP-2854
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-2854
>             Project: TinkerPop
>          Issue Type: Bug
>    Affects Versions: 3.6.1
>            Reporter: Andrea Santurbano
>            Priority: Major
>
> Hi everybody,
> I'm playing with Gremlin and OpenCypher query transpiler by using the 
> following bytecode query:
> {code:java}
> [[], [inject(  cypher.start), map([[], [project(  GENERATED1,   GENERATED2,   
> GENERATED3), by([[], [constant(1)]]), by([[], [constant(2)]]), by([[], 
> [constant(3)]]), select(values)]]), project(r), by([[], [project(  
> GENERATED5,   GENERATED6,   GENERATED7), by([[], [identity()]]), by([[], 
> [choose([[], [constant(binding[from=3])]], [[], [constant(binding[from=3])]], 
> [[], [constant(  cypher.null)]])]]), by([[], [choose([[], 
> [constant(binding[to=1])]], [[], [constant(binding[to=1])]], [[], [constant(  
> cypher.null)]])]]), select(values), 
> map(lambda[cypherListSlice().apply(it)])]])]]{code}
> Using Gremlin 3.4.13 produces the following traversal:
>  
>  
> {code:java}
> [InjectStep([  cypher.start]), TraversalMapStep([ProjectStep([  GENERATED1,   
> GENERATED2,   GENERATED3],[[ConstantStep(1)], [ConstantStep(2)], 
> [ConstantStep(3)]]), TraversalMapStep(values)]), 
> ProjectStep([r],[[ProjectStep([  GENERATED5,   GENERATED6,   
> GENERATED7],[[IdentityStep], [ChooseStep([ConstantStep(3), 
> HasNextStep],[[(eq(true)), [ConstantStep(3), EndStep]], [(eq(false)), 
> [ConstantStep(  cypher.null), EndStep]]])], [ChooseStep([ConstantStep(1), 
> HasNextStep],[[(eq(true)), [ConstantStep(1), EndStep]], [(eq(false)), 
> [ConstantStep(  cypher.null), EndStep]]])]]), TraversalMapStep(values), 
> LambdaMapStep(lambda)]])]{code}
> while 3.6.1 creates this one (we only upgraded the library and changed some 
> package name references):
>  
>  
> {code:java}
> [InjectStep([  cypher.start]), TraversalMapStep([ProjectStep([  GENERATED1,   
> GENERATED2,   GENERATED3],[[ConstantStep(1)], [ConstantStep(2)], 
> [ConstantStep(3)]]), TraversalMapStep(values)]), 
> ProjectStep([r],[[ProjectStep([  GENERATED5,   GENERATED6,   
> GENERATED7],[[IdentityStep], [ChooseStep([ConstantStep(OUT), 
> HasNextStep],[[(eq(true)), [ConstantStep(OUT), EndStep]], [(eq(false)), 
> [ConstantStep(  cypher.null), EndStep]]])], [ChooseStep([ConstantStep(IN), 
> HasNextStep],[[(eq(true)), [ConstantStep(IN), EndStep]], [(eq(false)), 
> [ConstantStep(  cypher.null), EndStep]]])]]), TraversalMapStep(values), 
> LambdaMapStep(lambda)]])]{code}
> Indeed the one in 3.6.1 is the wrong one because it adds some extra steps 
> like {*}ConstantStep(IN){*}.
>  
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to