You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by "Matt Frantz (JIRA)" <ji...@apache.org> on 2015/04/15 20:31:58 UTC

[jira] [Commented] (TINKERPOP3-628) {{as}} step should never be ignored

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

Matt Frantz commented on TINKERPOP3-628:
----------------------------------------

This also happens in traversals where the two {{as}} steps are not adjacent.
{noformat}
gremlin> g.traversal().V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").select('person')
The step with label person  does not exist
{noformat}

This traversal is based on a unit test in {{SelectTest}}, and might explain why that test had to be disabled.
{code:java}
@Test
@LoadGraphWith(MODERN)
@Ignore("There is a HashMap to Element cast problem happening here for some reason in both OLTP and OLAP")  // TODO: dkuppitz this has been ignored for some time now -- don't know if the test is bad or the code is bad.
@IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
{code}

That unit test uses this traversal:
{noformat}
gremlin> g.traversal().V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").select().by("name").by()
java.util.HashMap cannot be cast to org.apache.tinkerpop.gremlin.structure.Element
{noformat}

The reason this fails is because we expect two things to be selected, "person" and "relations".  However, "person" is not in the Path for some reason.
{noformat}
gremlin> g.traversal().V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").sideEffect{it -> System.err.println(it.path().labels())}.select()
[[relations]]
==>[relations:[created:1, knows:2]]
[[relations]]
==>[relations:[knows:1]]
[[relations]]
==>[relations:[created:2, knows:1]]
[[relations]]
==>[relations:[created:1]]
{noformat}

If you eliminate the {{select}} step, then "person" shows up!
{noformat}
gremlin> g.traversal().V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").map{it -> it.path().labels()}
==>[[person], [relations]]
==>[[person], [relations]]
==>[[person], [relations]]
==>[[person], [relations]]
{noformat}

We end up using two different {{Path}} implementations.
{noformat}
gremlin> g.traversal().V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").map{it -> it.path().getClass().getName()}
==>org.apache.tinkerpop.gremlin.process.traversal.step.util.SparsePath
==>org.apache.tinkerpop.gremlin.process.traversal.step.util.SparsePath
==>org.apache.tinkerpop.gremlin.process.traversal.step.util.SparsePath
==>org.apache.tinkerpop.gremlin.process.traversal.step.util.SparsePath

gremlin> g.traversal().V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").sideEffect{it -> System.err.println(it.path().getClass().getName())}.select()
org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath
==>[relations:[created:1, knows:2]]
org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath
==>[relations:[knows:1]]
org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath
==>[relations:[created:2, knows:1]]
org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath
==>[relations:[created:1]]
{noformat}

That comes down to the choice of {{Traverser}} subtype.
{noformat}
gremlin> g.traversal().V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").map{it -> it.getClass().getName()}
==>org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser
==>org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser
==>org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser
==>org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser

gremlin> g.traversal().V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").sideEffect{it -> System.err.println(it.getClass().getName())}.select()
org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_Traverser
==>[relations:[created:1, knows:2]]
org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_Traverser
==>[relations:[knows:1]]
org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_Traverser
==>[relations:[created:2, knows:1]]
org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_Traverser
==>[relations:[created:1]]
{noformat}


> {{as}} step should never be ignored
> -----------------------------------
>
>                 Key: TINKERPOP3-628
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP3-628
>             Project: TinkerPop 3
>          Issue Type: Bug
>            Reporter: Matt Frantz
>
> M8 repro:
> {noformat}
> gremlin> g = TinkerFactory.createModern()
> ==>tinkergraph[vertices:6 edges:6]
> gremlin> g.traversal().V(1).as('a').as('b').select('a')
> The step with label a  does not exist
> {noformat}
> My use case involves building complex traversals that use step labels as symbolic references for certain subsets of the traversal.  It is often desirable to point several references at the same location.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)