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



我正在使用带有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类,以便使用它们。

从那里,您将需要使用基于远程/字节码的遍历连接到图形,因此假设您的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]

有了一点元编程,你就可以毫不费力地破解DSL方法。

最新更新