有没有更好的方法来强制 Gremlin 查询在发现无效状态时失败?

问题描述 投票:0回答:1

如果有一种方法可以让 Gremlin 查询以某种方式终止,那就太好了 如果作为查询的一部分,确定没有点,则会出现错误消息 进一步进行。一种不太好的方法是触发异常。为了 例如这样的事情:

gremlin> g.inject(1).math('_/0')
Division by zero!  

当查询确定时,是否有更好的方法来触发更有意义的异常 没有必要继续吗?

gremlin tinkerpop amazon-neptune tinkerpop3
1个回答
0
投票

从 Apache TinkerPop 3.6.0 版本(2022 年 4 月)开始,现在有一个新的

fail
步骤 Gremlin 语言的一部分。所以对于问题中的简单情况,你可以做一些事情 像这样:

g.inject(1).fail('The query encountered an issue')

运行时会产生应用程序可以捕获的更好的异常。运行时使用 Gremlin 控制台,这是

fail
步骤的输出。

>gremlin g.inject(1).fail('The query encountered an issue') 

fail() Step Triggered
=================================================================
Message  > The query encountered an issue
Traverser> 1
  Bulk   > 1
Traversal> inject((int) 1).fail("The query encountered an issue")
Metadata > {}
=================================================================   

在此基础上,一个更现实的例子可能是我们期望节点 存在,如果我们发现它不存在,我们想立即失败。

gremlin> g.addV('Dog').property('name','Toby')
==>v[9]

gremlin> g.V().has('name','Toby').fold().coalesce(unfold().constant('I found Toby'),fail('I did not find Toby'))
==>I found Toby

gremlin> g.V().drop()

gremlin> g.V().has('name','Toby').fold().coalesce(unfold().constant('I found Toby'),fail('I did not find Toby'))

fail() Step Triggered
==================================================================================================================================
===
Message  > I did not find Toby
Traverser> []
  Bulk   > 1
Traversal> fail("I did not find Toby")
Parent   > CoalesceStep [V().has("name","Toby").fold().coalesce(__.unfold().constant("I found Toby"),__.fail("I did not find Toby"
))]
Metadata > {}
==================================================================================================================================
===                         
© www.soinside.com 2019 - 2024. All rights reserved.