One of the recent items I have heard quite a few requests for, and had
several on and off conversations about, is the ability to cast values
within a Gremlin traversal.  Due to the schemaless nature of Gremlin it is
very easy to get into a situation where you have a single property that
contains different datatypes across elements and it would be very nice to
be able to create a consistent datatype to allow comparisons.  I'd like to
throw this proposal out here to see what people think.

What if we added a step to handle converting to a defined subset of
datatypes:


Function Signature:

cast(Enum, string)

Enum - This would be an enum containing the datatypes you can cast to:
* DT.short
* DT.int
* DT.long
* DT.float
* DT.double
* DT.char
* DT.boolean
* DT.string

string - The property name to cast

Example usages:

g.V().project('name', 'age').by(cast(DT.String, 'name')).by(cast(DT.int,
'age'))
g.V().order().by(cast(DT.int, 'age'))
g.V().group().by(cast(DT.int, 'age'))

So what happens if the value cannot be cast to the defined type:

I think that the default behavior in this case should be to throw an error.

I would like to provide two configuration options (via with)

with(CAST.remove) - in any case where the value cannot be cast the
traverser would be filtered out

with(CAST.default, -999) - in any case the value cannot be cast the
specified default value (e.g. -999) would be used.  This would reduce the
complexity and increase the readability of many queries by no longer
requiring the use of a coalesce() to handle creation of default values .
This would also enable customers to handle use cases where data is of
varying types which cannot be handled by the current coalesce() pattern.

Dave

Reply via email to