1

我有一个场景,我在更新遍历中想要检查一个条件,如果该条件为假,我想中断遍历并保持图形不变。另外我想知道遍历被跳过,所以我可以向调用代码抛出异常。

约束:

  • 我需要在一次遍历中执行此操作,因为我使用的图形数据库服务无法在多次遍历中保存事务。
  • 我确实需要一种方法来确定遍历被中断的原因。
  • 此外,似乎我不能使用 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$$Lambda$155/352598575@1b7f1140)]], aliases={g=g}}}] 无法被 org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0 序列化。

4

1 回答 1

2

无法序列化 Lambda,这就是您遇到该异常的原因。此外,Neptune 不支持lambda,因此您的方法无论如何都行不通。您对 TinkerGraph 的实验奏效了,因为它没有这些限制。

我不确定你能做些什么来解决这个问题,因为你提到过:

我确实需要一种方法来确定遍历被中断的原因。

也许你可以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

我不确定这是否会完美运行,因为您想

保持图表不变

根据您编写 Gremlin 的方式,这甚至在 TinkerGraph 中都行不通。constant()不是将被识别为回滚事务的方法的“错误条件”。也许这只是需要注意的事情。根据你的逻辑有多复杂,你最终可能会得到一些非常难以阅读的 Gremlin。您可能需要重新考虑您的方法。

于 2018-09-27T11:03:01.830 回答