[ https://issues.apache.org/jira/browse/TINKERPOP-2710?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17497006#comment-17497006 ]
Divij Vaidya edited comment on TINKERPOP-2710 at 2/23/22, 7:07 PM: ------------------------------------------------------------------- > We've taken the posture lately that we want to generate less exceptions in > Gremlin The root cause of this error is absence of strongly defined type semantics in Gremlin language. Any step can be placed after any other step in a traversal. At runtime, the code does the validation and if step is used incorrectly we throw an error, e.g. {noformat} gremlin> g.V().union(outE(),out()).in() org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerEdge cannot be cast to org.apache.tinkerpop.gremlin.structure.Vertex Type ':help' or ':h' for help. Display stack trace? [yN]{noformat} Is there a difference between the syntax error for hasKey() posted in the Jira and the query above? was (Author: divijvaidya): > We've taken the posture lately that we want to generate less exceptions in > Gremlin The root cause of this error is absence of strongly defined type semantics in Gremlin language. Any step can be placed after any other step in a traversal. At runtime, the code does the validation and if step is used incorrectly we throw an error, e.g. {noformat} gremlin> g.V().union(outE(),out()).in() org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerEdge cannot be cast to org.apache.tinkerpop.gremlin.structure.Vertex Type ':help' or ':h' for help. Display stack trace? [yN]{noformat} I might have missed the conversation so feel free to point me to it but this is a case of To clarify so that we are on the same page, by keeping the existing behaviour we are saying that it is perfectly fine to have no-op syntax in Gremlin query language. > hasKey() should throw an error when invoked on Elements > ------------------------------------------------------- > > Key: TINKERPOP-2710 > URL: https://issues.apache.org/jira/browse/TINKERPOP-2710 > Project: TinkerPop > Issue Type: Bug > Components: language, process > Affects Versions: 3.6.0 > Reporter: Divij Vaidya > Priority: Major > > *Context* > hasKey() step can be added to the traversal when the traverser is of type > Element or when it is of type Property. > When step is invoked for traverser of type property, the behaviour is well > defined as, "Remove the {{Property}} traverser if it does not match one of > the provided keys." Example query: > {noformat} > gremlin> g.V().properties().hasKey('age').value() > ==>29 > ==>27 > ==>32 > ==>35{noformat} > When the step is invoked for traverser of type Element, the behaviour of the > step is not documented. [Looking at the > code|https://github.com/apache/tinkerpop/blob/master/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java#L59] > implementation, it "removes the element traverser if element has a property > with key as '~key' and the value of that property matches 'age'". > But [this condition is > unsatisfiable|https://github.com/apache/tinkerpop/blob/6a0b71b2af79b1b45f1e2db41946fe85529ed32e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java#L84] > because Element can never have a property with key "~key". It would always > fail at insertion i.e. the output of hasKey() on Element traverser will > always be empty. > *Change proposed* > Hence, I propose the following change: > If hasKey() is applied to a traverser of Element type, then it should throw > an error. > The code change will be made > [here|https://github.com/apache/tinkerpop/blob/master/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java#L59] > . We would introduce a change as follows: > {noformat} > if (this.key.equals(T.key.getAccessor())) { > throw new IllegalArgumentException("hasKey() cannot be applied to > traverser of type Element") > }{noformat} > *Impact of the change* > Before the change: > {noformat} > // the following query always returns empty results gremlin> > g.V().hasKey('age').fold() > gremlin> g.V().hasKey('age').fold() > ==>[]{noformat} > > After the change: > {noformat} > // the following query returns an error > gremlin> g.V().hasKey('age').fold() > hasKey() cannot be applied to traverser of type Element{noformat} > > > -- This message was sent by Atlassian Jira (v8.20.1#820001)