#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 не пытаются этого сделать.