Gremlin 服务器作为 REST API 具有动态创建的数据

Gremlin Server as REST API with dynamically created data

假设我有以下内容: - 能够查询数据库并接收(可能很大)JSON 的 node.js 服务器 - 一个 gremlin 服务器(配置有 gremlin-server-rest-modern.yaml 但也许里面一定有更多东西)

我的问题是:有没有办法以动态和编程方式添加新图以供服务器提供?我希望我的节点服务器查询数据库并将 JSON 响应发送到 gremlin 服务器;在那里,响应将被转换成图表;从节点服务器,用户将能够发送其他查询并接收复杂的响应。我怎样才能做到这一点?

我尝试使用 [1],但我不确定如何做我想做的事。您实际上如何发送多个(链接的)命令,例如迷你脚本?我知道如何使用控制台来完成它,但不知道如何使用服务器(作为 REST 服务),因为没有公开的 API。你能给我一个建议或一些例子吗?谢谢!

阿德里安

[1] https://github.com/jbmusso/gremlin-javascript

编辑: 我设法用一些简单的命令向服务器发送了 POST 消息。如果我发送带有所有命令(图形创建和查询)的 POST,它就会起作用。但是,对于多个 POST,上下文不会被保存。首先,我发送 POST 内容为:

{
 "gremlin" : "graph = TinkerGraph.open(); g = graph .traversal(); graph .addVertex('name', 'adrian', 'age', 21); "
}

然后,我发送另一个 POST

{
 "gremlin" : "v2 = graph.addVertex('name', 'gigel', 'age', 22); g.V()"
}

但是,我收到以下错误:

{
    "message": "No such property: graf for class: Script4",
    "Exception-Class": "groovy.lang.MissingPropertyException",
    "exceptions": [
        "groovy.lang.MissingPropertyException"
    ],
    "stackTrace": "groovy.lang.MissingPropertyException: No such property: graf for class: Script4\n\tat org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)\n\tat org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:52)\n\tat org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307)\n\tat Script4.run(Script4.groovy:1)\n\tat org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.eval(GremlinGroovyScriptEngine.java:834)\n\tat org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.eval(GremlinGroovyScriptEngine.java:547)\n\tat javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:233)\n\tat org.apache.tinkerpop.gremlin.groovy.engine.ScriptEngines.eval(ScriptEngines.java:120)\n\tat org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor.lambda$eval(GremlinExecutor.java:314)\n\tat java.util.concurrent.FutureTask.run(FutureTask.java:266)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n\tat java.lang.Thread.run(Thread.java:745)\n"
}

上下文没有保存在 gremlin 服务器上?我必须发送要执行的整个脚本吗?如果我想创建两个图并稍后查询怎么办?

谢谢!

您通过无会话请求(如 REST)在脚本中创建的图表不会得到维护。您可以创建在会话中的请求之间维护的图形实例,但它们仅在该会话中维护并且在该会话之外无法访问。

如果您想为服务器全局创建图表,它们必须是:

  1. 在服务器配置文件中配置
  2. 作为初始化脚本的一部分生成
  3. 由自定义 GraphManager 实例构建(涉及编写一些 Java 代码)

我想也可以构建一个自定义端点,让您以某种方式管理他的图表,但您必须对 Gremlin Server 的代码有一个粗略的了解才能实现它(不会'不过不要太难)。