【问题标题】:Is it possible to generate gremlin queries from bytecode in python是否可以从 python 中的字节码生成 gremlin 查询
【发布时间】:2019-08-11 15:41:43
【问题描述】:

是否可以从字节码生成 gremlin 脚本?

我正在开发一个 POC,我需要在其中通过 Gremlin API 查询图形 Azure CosmosDB 数据库。

目前,Azure CosmosDB 不支持字节码。 Azure 开发团队有started working on this,但目前尚未公布发布时间表。

我想准备工作代码,以便在将来普遍提供字节码支持时需要最少的重构。

基于Apache TinkerPop docs,提交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 智能感知等),而且我对创建 DSL(域特定语言)感兴趣。

是否可以使用fluent api并将其序列化为字符串,类似于以下方式:

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

【问题讨论】:

  • 还有gremlinpy 为您构建脚本(带有绑定参数)。我个人觉得(由于供应商对字节码的支持乏善可陈,例如 CosmosDB)如果你想使用 python,这条路线可能是更好的方法。
  • @Sascha 谢谢,我一定会试一试。我可能错了,但我认为编写翻译器会更有益,因为它使我有可能使用 GraphTraversal 扩展编写 DSL 并将字节码输出转换为 groovy 脚本。在某些时候,当字节码可用时,我将切换到字节码。不确定 gremlinpy 是否也可以做到这一点。

标签: python gremlin bytecode azure-cosmosdb-gremlinapi gremlinpython


【解决方案1】:

绝对有可能从字节码生成一个遍历的字符串表示。 TinkerPop 已经为 Groovy 和 Python 脚本使用了它(出于各种原因,主要用于测试,但它还有其他用途,例如支持字节码中的 lambda 和其他实用目的)。我们通过ScriptTranslator 实现来实现这一点,Groovy 有一个,Python 有两个(其中一个实际上是Jython)。问题当然是所有这些ScriptTranslator 实例在技术上都是用于 JVM 的,听起来你需要一些用于原生 Python 的东西。

也许您可以检查PythonTranslator 代码并在本机Python 中实现它?它基本上只是一堆if-then 和字符串连接。

【讨论】:

  • 感谢您将我指向 PythonTranslator。我还发现有类似的 JavaScript 请求 issues.apache.org/jira/browse/TINKERPOP-1959github.com/apache/tinkerpop/pull/952,I 尚未验证但也许 github.com/apache/tinkerpop/blob/master/gremlin-javascript/src/… 将更简单的代码移植到 python ??
  • 也许——是这样。无论你觉得哪个更容易阅读。重点是解析字节码并从中构建一个 Gremlin 字符串。从那里的所有示例中可以看出,这并不难。只是工作要做。
  • 我终于找到了一些时间来移植 PythonTranslator.java。它几乎完成了,但这里需要一些指导。我在 python 中找不到 TraversalStrategyProxy、ConnectiveP 类。在 gremlin_python 中跳过它们是否可以保存?
  • 也需要建议,是否值得为已翻译的脚本创建绑定?我在某处读过(可能是 tinkerpop 的文档),这有助于提高使用参数化查询的性能。如果是这样,哪些部分应该和不应该参数化,例如是否应将包括属性和标签名称在内的所有 args 更改为参数或仅值,例如在 .has() 步骤中?
  • 你可以跳过ConnectiveP作为python中的一个类,但你可能仍然需要考虑它——该类基本上处理P.and/P.or。同样,您应该考虑 TraversalStrategyProxy 所代表的内容 - 基本上,只需调用 g.withStrategy() (我认为它并不比副手更复杂)。尽管它可能会产生改进,但我不会尝试动态参数化。 afaik,groovy 或 js 翻译器都没有尝试这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2017-05-31
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
相关资源
最近更新 更多