条件中断java-gremlin更新遍历,有错误信息
Conditionally interrupt java-gremlin update traversal, with error message
我有一个场景,在更新遍历过程中我想检查一个条件,如果那个条件为假,我想中断遍历并保持图形不变。
我还想知道遍历被跳过了,所以我可以向调用代码抛出异常。
约束条件:
- 我需要在一次遍历中执行此操作,因为我使用的图数据库服务无法在多次遍历中保存一个事务。
- 我确实需要一种方法来确定遍历被中断的原因。
- 而且我似乎无法使用 sideEffect() 步骤 (?),因为这似乎与 gremlin 查询的序列化无关。
使用 TinkerGraph 在本地运行但未部署为调用 AWS Neptune 的 lambda 的主要遍历。
GraphTraversalSource g = graph.traversal();
g.V().hasLabel("ops").fold()
.coalesce(
unfold(),
sideEffect(t -> { throw new RuntimeException("First vertice not found"); }))
.as("a")
// do much more stuff
.hasNext();
sideEffect(org.someone.graph.ClassImpl$$Lambda5/352598575@1b7f1140)]], aliases={g=g}}}] could not be serialized by org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0.
Lambda 无法序列化,这就是您收到该异常的原因。此外,lambdas 是 not supported in Neptune 所以你的方法无论如何都行不通。您使用 TinkerGraph 进行的实验之所以成功,是因为它没有这些限制。
我不确定你能做些什么来解决这个问题,因为你提到过:
I do need a way to identify why the traversal was interrupted.
也许你可以使用 constant()
以某种方式?
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().has('person','name','marko').fold().coalesce(unfold(), constant('Not Found'))
==>v[1]
gremlin> g.V().has('person','name','x').fold().coalesce(unfold(), constant('Not Found'))
==>Not Found
我不确定这是否会完美运行,因为你想要
leave the graph unchanged
根据您编写 Gremlin 的方式,这甚至在 TinkerGraph 中都行不通。 constant()
不是将被识别为回滚事务的方法的 "error condition"。也许这只是需要注意的事情。根据您的逻辑有多复杂,您最终可能会遇到一些非常难以阅读的 Gremlin。您可能需要重新考虑您的方法。
我有一个场景,在更新遍历过程中我想检查一个条件,如果那个条件为假,我想中断遍历并保持图形不变。 我还想知道遍历被跳过了,所以我可以向调用代码抛出异常。
约束条件:
- 我需要在一次遍历中执行此操作,因为我使用的图数据库服务无法在多次遍历中保存一个事务。
- 我确实需要一种方法来确定遍历被中断的原因。
- 而且我似乎无法使用 sideEffect() 步骤 (?),因为这似乎与 gremlin 查询的序列化无关。
使用 TinkerGraph 在本地运行但未部署为调用 AWS Neptune 的 lambda 的主要遍历。
GraphTraversalSource g = graph.traversal();
g.V().hasLabel("ops").fold()
.coalesce(
unfold(),
sideEffect(t -> { throw new RuntimeException("First vertice not found"); }))
.as("a")
// do much more stuff
.hasNext();
sideEffect(org.someone.graph.ClassImpl$$Lambda5/352598575@1b7f1140)]], aliases={g=g}}}] could not be serialized by org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0.
Lambda 无法序列化,这就是您收到该异常的原因。此外,lambdas 是 not supported in Neptune 所以你的方法无论如何都行不通。您使用 TinkerGraph 进行的实验之所以成功,是因为它没有这些限制。
我不确定你能做些什么来解决这个问题,因为你提到过:
I do need a way to identify why the traversal was interrupted.
也许你可以使用 constant()
以某种方式?
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().has('person','name','marko').fold().coalesce(unfold(), constant('Not Found'))
==>v[1]
gremlin> g.V().has('person','name','x').fold().coalesce(unfold(), constant('Not Found'))
==>Not Found
我不确定这是否会完美运行,因为你想要
leave the graph unchanged
根据您编写 Gremlin 的方式,这甚至在 TinkerGraph 中都行不通。 constant()
不是将被识别为回滚事务的方法的 "error condition"。也许这只是需要注意的事情。根据您的逻辑有多复杂,您最终可能会遇到一些非常难以阅读的 Gremlin。您可能需要重新考虑您的方法。