Возможно ли генерировать запросы gremlin из байт-кода в python

#python #gremlin #bytecode #azure-cosmosdb-gremlinapi #gremlinpython

#python #gremlin #байт-код #azure-cosmosdb-gremlinapi #gremlinpython

Вопрос:

Возможно ли сгенерировать скрипт gremlin из байт-кода?

Я работаю над POC, в котором мне нужно запросить базу данных Azure CosmosDB Graph через API Gremlin.

В настоящее время Azure CosmosDB не поддерживает байт-код. Команда разработчиков Azure начала работать над этим, но пока сроки выпуска не опубликованы.

Я хотел бы подготовить рабочий код, который потребовал бы минимального рефакторинга в будущем, когда поддержка байт-кода будет общедоступной.

Основываясь на документах Apache TinkerPop, существует два способа отправки запросов Gremlin: байт-код и скрипт

 # script
client = Client('ws://localhost:8182/gremlin', 'g')
list = client.submit("g.V().has('person','name',name).out('knows')",{'name': 'marko'}).all()

# bytecode
g = traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin','g'))
list = g.V().has("person","name","marko").out("knows").toList()
  

«Способ байт-кода» кажется мне гораздо более эффективным (проверка синтаксиса, IDE intellisens и т.д.). Более того, я заинтересован в создании DSL (язык, специфичный для домена).

Можно ли было бы использовать fluent api и сериализовать его в string способом, подобным этому:

 client = Client('ws://localhost:8182/gremlin', 'g')
g = traversal()
q = g.V().has("person","name","marko").out("knows").toString()
list = client.submit(q).all()
  

Я использую python 3.5 и gremlinpython 3.4.0

Комментарии:

1. Также существует gremlinpy , который создает скрипты (с привязанными параметрами) для вас. Я лично считаю (из-за состояния слабой поддержки байт-кода от поставщиков, например CosmosDB), что этот маршрут, возможно, лучший способ, если вы хотите использовать python.

2. @Sascha Спасибо, я обязательно попробую. Возможно, я ошибаюсь, но я думаю, что написание транслятора было бы более выгодным, потому что это дает мне возможность писать DSL, используя GraphTraversal extensions и переводя вывод байт-кода в groovy script. В какой-то момент, когда байт-код будет доступен, я просто переключусь на байт-код. Не уверен, что это также было бы возможно с gremlinpy.

Ответ №1:

Определенно возможно сгенерировать строковое представление обхода из байт-кода. TinkerPop уже делает это для скриптов Groovy и Python (по разным причинам, в первую очередь для тестирования, но у него есть и другие применения, такие как поддержка лямбд в байт-коде и для других утилитарных целей). Мы достигаем этого с помощью ScriptTranslator реализаций, и есть одна для Groovy и две для Python (где одна на самом деле для Jython). Проблема, конечно, в том, что все эти ScriptTranslator экземпляры технически предназначены для JVM, и звучит так, как будто вам нужно что-то для родного Python.

Возможно, вы могли бы изучить PythonTranslator код и реализовать это на родном Python? По сути, это просто связка if-then и конкатенация строк.

Комментарии:

1. Спасибо, что указали мне на PythonTranslator. Я также обнаружил, что был аналогичный запрос для JavaScript issues.apache.org/jira/browse/TINKERPOP-1959 и github.com/apache/tinkerpop/pull/952 Я еще не проверил, если, но, возможно github.com/apache/tinkerpop/blob/master/gremlin-javascript/src / … было бы проще перенести код на python??

2. может быть, и так. в зависимости от того, что вам будет легче читать. основной момент заключается в разборе байт-кода и создании из него строки Gremlin. это не очень сложно, как вы можете видеть из всех приведенных примеров. просто нужно работать.

3. Я, наконец, нашел время для переноса PythonTranslator.java . Это почти завершено, но здесь требуется несколько рекомендаций. Я не могу найти классы TraversalStrategyProxy, ConnectiveP в python. Можно ли пропустить их в gremlin_python?

4. Также нужен совет, стоит ли создавать привязку для переведенного скрипта? Я где-то читал (вероятно, документы tinkerpop), которые помогают повысить производительность при использовании параметризованных запросов. Если да, то какие части должны и не должны быть параметризованы, например, должны ли все аргументы, включая имена свойств и меток, быть изменены на параметры или только значения, например, на шаге .has() ?

5. вы можете пропустить ConnectiveP как класс в python, но вам, вероятно, все равно нужно учитывать это — этот класс в основном обрабатывает P.and / P.or . Аналогично, вы должны учитывать то, что TraversalStrategyProxy представляет — в основном, просто вызовы g.withStrategy() (я не думаю, что это сложнее, чем это навскидку). Я бы не стал пытаться динамически параметризовать, несмотря на улучшения, которые он может генерировать. afaik, ни переводчики groovy, ни js не пытаются этого сделать.