Как сгенерировать TinkerPOP ByteCode? - PullRequest
0 голосов
/ 31 декабря 2018

Интересно, кто-нибудь может дать мне несколько советов (то есть, с чего начать), о том, как реализовать перевод, скажем, с языка запросов A на TinkerPop Graph Traversal.Предположим, что семантика интуитивно переводится в подмножество TinkerPop Traversal.Другими словами, я спрашиваю:

  1. Где я могу найти набор команд набора виртуальной машины TinkerPOP
  2. Что такое ByteCode виртуальной машины TinkerPOP.
  3. Существует ли какой-либо API документации, который поможет в этом.

В документации сказано, что легко сгенерировать ByteCode, но нет подробной информации о байт-коде, его формах и т. Д.

Я надеюсь, что кто-то может помочь с этим: раздел Поставщик языка графиков пуст в текущей документации

1 Ответ

0 голосов
/ 31 декабря 2018

В 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 - единственный, который в настоящее время основан на байт-коде.

...