Java TinkerPop Gremlin如何实现在步骤之前传入的谓词
我有一个遍历,我需要重复,直到没有更多的新边被发现。在gremlin console/groovy中,我通过传递始终返回false的lambda来实现这一点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
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
步骤将继续,直到到达空遍历
例如: