使用Lambda函数构造Gremlin遍历时出错

Error when constructing Gremlin traversal using Lambda function

我有一个设置了属性 startDateendDate:

的顶点
Date start = new Date();
Date end = Date.from(start.toInstant().plusSeconds(600));
g.V(8L).property("startDate", start).property("endDate", end).next();

现在我想计算差 endDate-startDate 我可以用 sack():

g.V(8L)
    .sack(Operator.assign).by(values("endDate").map(it -> ((Date)it.get()).getTime()))
    .sack(Operator.minus).by(values("startDate").map(it -> ((Date)it.get()).getTime()))
    .sack()

但是,如果遍历是远程发送的,这将不起作用。

通过将 Lambda 转换为 Lambda.function(),以下遍历远程工作:

String funcGetTime = "v -> ((Date)v.get()).getTime()";
g.V(8L)
        .sack(Operator.assign).by(values("endDate").map(Lambda.function(funcGetTime)))
        .sack(Operator.minus).by(values("startDate").map(Lambda.function(funcGetTime)))
        .sack()

但是,遍历在我的内存图本地设置中不再有效。错误信息是:

java.lang.IllegalArgumentException: The provided traverser does not map to a value: v[8]->[PropertiesStep([endDate],value), LambdaMapStep(lambda[v -> ((Date)v.get()).getTime()])]

我的问题是:是否有一种遍历可以同时适用于本地和远程?我需要它,因为我的单元测试是 运行 在本地使用内存图,而在 运行 期间,我的应用程序通过连接到远程图来调用遍历。

我必须在遍历中计算差异(而不是在我的应用程序中计算)的原因是我想在以后的遍历中进一步使用这个差异。

谢谢。

Gremlin 还没有可以帮助您解决此问题的日期时间运算符,而且您发现远程 lambda 的计算方式与本地 lambda 的计算方式不同。远程需要在 GremlinGroovyScriptEngine 中评估整个遍历,它基本上采用 Gremlin Bytecode,通过 GroovyTranslator 运行它,然后将整个过程作为脚本进行评估。我可以在 Gremlin 控制台中模拟如下:

gremlin> evaluate(GroovyTranslator.of("g").translate(g.V().map(Lambda.function("v -> v"))).script)
==>v[1]
==>v[2]
==>v[3]
==>v[4]
==>v[5]
==>v[6]

如果您需要远程与本地一样工作,除了上述方法或通过存储您的日期(可能是一种非规范化形式)之外,我想不出任何解决方法,以便您可以直接进行计算,无需 DateTime 转换。希望 Gremlin 在未来的版本中能获得更好的日期操作。