Как добавить собственный DSL в консоль Gremlin - PullRequest
2 голосов
/ 07 мая 2020

Я использую консоль Gremlin с AWS сервером Neptune.
Я хочу добавить собственный 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.
Есть простой способ сделать это?

1 Ответ

2 голосов
/ 08 мая 2020

Процесс разработки DSL одинаков для любого случая. Напишите свой DSL, как описано в документации, на которую вы ссылаетесь, а затем скомпилируйте его в файл jar. Скопируйте файл jar в каталог /lib консоли Gremlin Console. Запустите консоль и используйте команду import, чтобы ссылаться на ваши классы DSL, чтобы вы могли их использовать.

Оттуда вам нужно будет подключиться к вашему графу, используя обходы на основе удаленного / байт-кода, поэтому предполагая, что ваши конструкции DSL a SocialTraversalSource, как показано в примере, вы можете:

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

Если вы хотите разработать свой DSL исключительно в консоли Gremlin, вспомните, что вы просто работаете в среде 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 без особых проблем.

...