В JVM вы можете получить объект Bytecode
из любого обхода с asAdmin().getBytecode()
следующим образом:
gremlin> g.V().hasLabel('person').out().in().tree().asAdmin().getBytecode()
==>[[], [V(), hasLabel(person), out(), in(), tree()]]
Преобразованный в формат GraphSON формат Bytecode
выглядит следующим образом (пример из Документация ввода-вывода ):
{
"@type" : "g:Bytecode",
"@value" : {
"step" : [ [ "V" ], [ "hasLabel", "person" ], [ "out" ], [ "in" ], [ "tree" ] ]
}
}
В настоящее время полный набор команд в основном привязан к JVM и представляет собой просто список шагов Gremlin плюс связанные выражения / токены(например, P
, T
и т. д.).Мы в настоящее время работаем над тем, чтобы сначала определить Gremlin, скорее, как спецификацию, а не привязывать ее к JVM, как сегодня, но это займет некоторое время.
Обратите внимание, что вымы говорим о разработке компилятора Gremlin.Уже есть пример, который почти готов к выпуску, так как я пишу это в sparql-gremlin
- предварительную документацию можно найти здесь .Этот модуль берет язык запросов 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]
Код не очень сложен - возможно, вы можете обратиться к нему за вдохновением.Если у вас есть дополнительные вопросы, пожалуйста, подумайте о том, чтобы задать их в списке рассылки gremlin-users .Было бы здорово увидеть больше доступных компиляторов Gremlin.В настоящее время есть другие (SQL и Cypher), но я считаю, что компилятор SPARQL - единственный, который в настоящее время основан на байт-коде.