[
https://issues.apache.org/jira/browse/TINKERPOP-2874?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Stephen Mallette closed TINKERPOP-2874.
---------------------------------------
Resolution: Duplicate
thanks for suggesting this. it's definitely a problem and we have
TINKERPOP-2234 tracking it. i've linked your issue here to it as you have a
nice write-up to consider in a design. not sure when that feature will land but
it's on the radar of things to do.
> Allow to filter traversal elements by class without using a lambda
> ------------------------------------------------------------------
>
> Key: TINKERPOP-2874
> URL: https://issues.apache.org/jira/browse/TINKERPOP-2874
> Project: TinkerPop
> Issue Type: New Feature
> Components: language
> Affects Versions: 3.6.2
> Reporter: Martin Häusler
> Priority: Major
>
> I sometimes end up in traversals which contain both Vertices and Edges, and I
> want to filter the elements by type. To the best of my knowledge (please
> correct me if I'm wrong) the only way to do this at the moment is with a
> lambda step:
> {code:java}
> ....filter(t -> t.get() instanceof Vertex)...{code}
>
> This is somewhat problematic:
> * Lambdas don't transfer over the network
> * Lambda filters are black boxes for query optimizers, so most optimizers
> don't reorder them (because of potential side effects), leading to suboptimal
> queries
>
> At the very least, we should have a way to filter {{isVertex()}} and
> {{{}isEdge(){}}}. An arguably even better way to do this (because it is more
> generic) would be {{{}hasType(Class<?> type){}}}. We could translate
> {{isVertex()}} to {{hasType(Vertex.class)}} and {{isEdge()}} to
> {{{}hasType(Edge.class){}}}.
> This new step would allow to filter by type with an easy syntax. In addition:
> * it transfers well across the network (if the step stores the qualified
> class name). The prerequisite is that the JVM running the graph server has
> access to the class. This is very likely, because it only makes sense to
> filter for elements flowing through the traversal.
> * it can be analyzed by query optimizers, so they can treat it like a
> regular {{has(key, value)}} step and reorder it if necessary.
>
> It is debatable whether {{hasType(Class<?> type)}} should internally check
> via {{instanceof}} or via {{{}getClass().equals(type){}}}. I would personally
> vouch for the polymorphic {{instanceof}} solution.
> Non-Java drivers could accept a {{String}} instead of a {{Class<?>}} to
> achieve the same server-side effect. We could even have a fixed list of "well
> known types" which do not require fully qualified class names (e.g.
> {{hasType("Vertex")}} could be valid).
--
This message was sent by Atlassian Jira
(v8.20.10#820010)