Java TinkerPop Gremlin如何实现在步骤之前传入的谓词

Java TinkerPop Gremlin如何实现在步骤之前传入的谓词,java,gremlin,tinkerpop,kryo,amazon-neptune,Java,Gremlin,Tinkerpop,Kryo,Amazon Neptune,我有一个遍历,我需要重复,直到没有更多的新边被发现。在gremlin console/groovy中,我通过传递始终返回false的lambda来实现这一点 g.V(7). repeat(out().not(hasLabel('region', 'business')).simplePath()). until(outE().count().is(0)). repeat(both().not(hasLabel('region', 'business')).dedup()). em

我有一个遍历,我需要重复,直到没有更多的新边被发现。在gremlin console/groovy中,我通过传递始终返回false的lambda来实现这一点

g.V(7).
  repeat(out().not(hasLabel('region', 'business')).simplePath()).
  until(outE().count().is(0)).
  repeat(both().not(hasLabel('region', 'business')).dedup()).
  emit().until{t -> false}.
  where(hasLabel('account'))
当我从Java应用程序尝试相同的方法并连接到AWS Neptune实例时,我得到一个异常,说明无法将命令发送到服务器

GraphTraversal t =
    g.V(uid).union(__.identity(),
        __.repeat(__.out().not(__.hasLabel("region", "business")).simplePath()).
            until(__.outE().limit(1).count().is(0)).
            repeat(__.both().not(__.hasLabel("region", "business")).simplePath()).
            until(x -> false).emit(__.hasLabel("account")));
我知道,我需要注册Java Lambda,可能还需要将谓词注册为可序列化的,但无法理解语法。另外,如何使用“序列化器”将其添加到集群生成器中

完整堆栈跟踪:

线程“main”io.netty.handler.codec.EncoderException中出现异常异常: org.apache.tinkerpop.gremlin.driver.exception.ResponseException: 序列化此请求[RequestMessage{, requestId=28cd3e32-306a-457e-a6d2-2dc5bc9797d8,op='bytecode', processor='traversal',args={gremlin=[[],[V(A_639008103873), 联合([[],[identity()]],[[],[repeat([[],[out()),而非([[],], [hasLabel(region,business)]),simplePath()],直到([[],[outE(), 限制(1),计数(),是(0)]),重复([[],[both(),而不是([[], [hasLabel(地区、业务)]),simplePath()]], 直到(org.saswata.Main$$Lambda$34/1735507635@6110020d),发射([[], [hasLabel(aws_account)]]]]]]],别名={g=g}}}]-无法删除它 已发送到服务器-原因: org.apache.tinkerpop.gremlin.driver.ser.SerializationException: java.lang.IllegalArgumentException:未注册类: org.saswata.Main$$Lambda$34/1735507635注意:注册这个类 使用:kryo.register(org.saswata.Main$$Lambda$34/1735507635.class);在 io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:106) 在 io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738) 在 io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730) 在 io.netty.channel.AbstractChannelHandlerContext.access$1900(AbstractChannelHandlerContext.java:38) 在 io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(AbstractChannelHandlerContext.java:1081) 在 io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1128) 在 io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1070) 在 io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) 在 io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) 运行(NioEventLoop.java:465) io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) 在java.lang.Thread.run(Thread.java:748)处,由以下原因引起: org.apache.tinkerpop.gremlin.driver.exception.ResponseException: 序列化此请求[RequestMessage{, requestId=28cd3e32-306a-457e-a6d2-2dc5bc9797d8,op='bytecode', processor='traversal',args={gremlin=[[],[V(A_639008103873), 联合([[],[identity()]],[[],[repeat([[],[out()),而非([[],], [hasLabel(region,business)]),simplePath()],直到([[],[outE(), 限制(1),计数(),是(0)]),重复([[],[both(),而不是([[], [hasLabel(地区、业务)]),simplePath()]], 直到(org.saswata.Main$$Lambda$34/1735507635@6110020d),发射([[], [hasLabel(aws_account)]]]]]]],别名={g=g}}}]-无法删除它 已发送到服务器-原因: org.apache.tinkerpop.gremlin.driver.ser.SerializationException: java.lang.IllegalArgumentException:未注册类: org.saswata.Main$$Lambda$34/1735507635注意:注册这个类 使用:kryo.register(org.saswata.Main$$Lambda$34/1735507635.class);在 org.apache.tinkerpop.gremlin.driver.handler.WebSocketGremlInRequestCoder.encode(WebSocketGremlInRequestCoder.java:63) 在 org.apache.tinkerpop.gremlin.driver.handler.WebSocketGremlInRequestCoder.encode(WebSocketGremlInRequestCoder.java:40) 在 io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:88) ... 还有11个

同时,我用一个hack来检查until参数
hasLabel('fake')

中不存在的标签,从而避开了这个问题,因为您可以看到Neptune不支持lambdas步骤。 所以不能使用这种语法

同样,在您的用例中,直到步骤之前,您根本不需要
。如果不使用它,
repeat
步骤将继续,直到到达空遍历

例如: