如果有一种方法可以让 Gremlin 查询以某种方式终止,那就太好了 如果作为查询的一部分,确定没有点,则会出现错误消息 进一步进行。一种不太好的方法是触发异常。为了 例如这样的事情:
gremlin> g.inject(1).math('_/0')
Division by zero!
当查询确定时,是否有更好的方法来触发更有意义的异常 没有必要继续吗?
从 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 > {}
==================================================================================================================================
===