使用Lambda函数构造Gremlin遍历时出错
Error when constructing Gremlin traversal using Lambda function
我有一个设置了属性 startDate
和 endDate
:
的顶点
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 在未来的版本中能获得更好的日期操作。
我有一个设置了属性 startDate
和 endDate
:
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 在未来的版本中能获得更好的日期操作。