如何生成 TinkerPOP 字节码?

How to Generate TinkerPOP ByteCode?

我想知道是否有人可以就如何实现从查询语言 A 到 TinkerPop Graph Traversal 的转换给我一些建议(从哪里开始)。假设 A 语义直观地转换为 TinkerPop Traversal 的子集。换句话说,我要问的是:

  1. 哪里可以找到TinkerPOP虚拟机的set指令集
  2. 什么是 TinkerPOP 虚拟机字节码。
  3. 是否有任何文档 API 对此有帮助。

文档说生成字节码很容易,但没有详细介绍字节码及其形状等。

我希望有人可以提供帮助:图形语言提供程序部分在当前文档

中是空的

在 JVM 上,您可以通过 asAdmin().getBytecode() 的任何遍历获得一个 Bytecode 对象,如下所示:

gremlin> g.V().hasLabel('person').out().in().tree().asAdmin().getBytecode()
==>[[], [V(), hasLabel(person), out(), in(), tree()]]

转换为 GraphSON 格式 Bytecode 格式如下所示(来自 IO documentation 的示例):

{
  "@type" : "g:Bytecode",
  "@value" : {
    "step" : [ [ "V" ], [ "hasLabel", "person" ], [ "out" ], [ "in" ], [ "tree" ] ]
  }
}

此时完整的指令集基本上绑定到 JVM,只是 list of Gremlin steps plus related expressions/tokens (e.g. P, T, etc). We are currently working 首先将 Gremlin 定义为规范,而不是像今天那样将其绑定到 JVM,但是这需要一些时间才能完成。

请注意,您正在谈论 Gremlin 编译器的开发。当我在 sparql-gremlin 中写这篇文章时,已经有一个即将发布的示例 - 可以找到预发布文档 here。该模块采用 SPARQL 查询语言并将其转换为 Gremlin Bytecode

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal(SparqlTraversalSource) //1\
==>sparqltraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.sparql("""SELECT ?name ?age
                     WHERE { ?person v:name ?name . ?person v:age ?age }
                     ORDER BY ASC(?age)""") //2\
==>[name:vadas,age:27]
==>[name:marko,age:29]
==>[name:josh,age:32]
==>[name:peter,age:35]

The code is not terribly complex - perhaps you could look to it for inspiration. If you have further questions please consider asking them on gremlin-users mailing list。很高兴看到更多可用的 Gremlin 编译器。目前还有其他的(SQL 和 Cypher),但我相信 SPARQL 编译器是目前唯一基于字节码的编译器。