[ https://issues.apache.org/jira/browse/TINKERPOP-2968?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Saikiran Boga updated TINKERPOP-2968: ------------------------------------- Component/s: process > Fix DropStep semantics for deleted element referenced by upstream steps > ----------------------------------------------------------------------- > > Key: TINKERPOP-2968 > URL: https://issues.apache.org/jira/browse/TINKERPOP-2968 > Project: TinkerPop > Issue Type: Bug > Components: process > Reporter: Saikiran Boga > Priority: Major > > This is from a recent user question on StackOverflow here > [https://stackoverflow.com/questions/76662422/how-does-it-come-that-my-gremlin-query-delivers-two-different-results] > for difference in behavior when using drop step. > > With this preloaded data: > {code:java} > g.addV("TopVertex").property('id', > 4713).property('testProperty1','testProperty1').as('vertex1') > .addV("SubVertex").property('name','C1').as('C1') > .addV("SubVertex").property('name','C2').as('C2') > .addV("SubVertex").property('name','C3').as('C3') > .addE("splitsInto").from('vertex1').to('C1').property('ordinal',1) > .addE("splitsInto").from('vertex1').to('C2').property('ordinal',2) > .addE("splitsInto").from('vertex1').to('C3').property('ordinal',3) > .addV("TopVertex").property('id', > 4713).property('testProperty2','testProperty2').as('vertex2') > .addV("SubVertex").property('name','C4').as('C4') > .addV("SubVertex").property('name','C5').as('C5') > .addV("SubVertex").property('name','C6').as('C6') > .addE("splitsInto").from('vertex2').to('C4').property('ordinal',4) > .addE("splitsInto").from('vertex2').to('C5').property('ordinal',5) > .addE("splitsInto").from('vertex2').to('C6').property('ordinal',6) {code} > And when we run the below query: > {code:java} > g.withoutStrategies(LazyBarrierStrategy.class). > addV("MergedVertex").property('id', 4713).as('mergedVertex'). > V().hasLabel("TopVertex").has('id', 4713).as('oldVertices'). > outE().as('oldEdges'). > inV().as('inVertices'). > select('mergedVertex'). > addE('splitsInto').to('inVertices').as('newEdges'). > sideEffect(select('oldEdges').properties(). > unfold().as('props'). > select('newEdges'). > property(select('props').key(), select('props').value())). > select('oldVertices').drop() {code} > When LazyBarrierStrategy is disabled, drop() step at the end here drops > `oldVertices` one at a time, i.e., no batching before drop() step. > > This results in one of the `oldVertices` deleted when it is first > encountered, along with its edges. But the same vertex or related edges are > used by subsequent solutions in the same query it no longer exists and the > query does not work as intended. > > With LazyBarrierStrategy enabled, the query adds 6 edges, each with a > property `ordinal`. But without the strategy, it adds only 2 edges. There is > a difference in query behavior and is confusing to users. > > TinkerPop should define semantics for this case how drop will behave in this > case and what guarantees a provider should provide to the users. For > instance, as mentioned in the SO post in Neptune without using an explicit > barrier the query does not work similar to TinkerPop. > -- This message was sent by Atlassian Jira (v8.20.10#820010)