如何将自定义 DSL 添加到 Gremlin 控制台

How to add custom DSL to Gremlin Console

我在 AWS Neptune 服务器上使用 Gremlin 控制台。
我想添加自定义 DSL 以缩短数据分析,如下所述:DSL
所以我可以 运行 查询为:

g.persons('marko').knows('josh').hasNext()  

而不是:

g.V().hasLabel('person').has('name','marko').out('knows').hasLabel('person').has('name','josh').hasNext()

如果我对文档的理解正确,他们描述了如何扩展 TinkerPop 服务器,但由于 Neptune 不支持它,我想扩展 Gremlin 控制台。
有简单的方法吗?

开发 DSL 的过程在任何情况下都是相同的。按照您引用的文档中的描述编写您的 DSL,然后将其编译为 jar 文件。将 jar 文件复制到 Gremlin 控制台 /lib 目录。启动控制台并使用 import 命令引用您的 DSL 类 以便您可以使用它们。

从那里您将需要使用 remote/bytecode-based 遍历连接到您的图表,因此假设您的 DSL 构建了一个 SocialTraversalSource,如示例所示,您可以:

gremlin> import com.mycompany.gremlin.dsl.SocialTraversalSource
...
gremlin> social = traversal(SocialTraversalSource.class).withRemote(...)
...
gremlin> social.persons("marko").knows("josh")

如果您想纯粹在 Gremlin 控制台中开发 DSL,请记住您只是在 Groovy 环境中工作,因此可以访问其全部范围:

gremlin> g = traversal().withRemote('conf/remote-graph.properties')
==>graphtraversalsource[emptygraph[empty], standard]
gremlin> GraphTraversal.metaClass.knows = { String personName ->
......1>     return delegate.out("knows").hasLabel("person").has("name", personName)
......2> }
==>groovysh_evaluate$_run_closure1@6a638c79
gremlin> g.V().has('person','name','marko').knows('josh')
==>v[4]
gremlin> g.V().has('person','name','marko').knows('josh').out().elementMap()
==>[id:5,label:software,name:ripple,lang:java]
==>[id:3,label:software,name:lop,lang:java]

只需一点metaprogramming,您就可以毫不费力地破解 DSL 方法。