1

假设我有以下内容: - 一个能够查询数据库并接收(可能很大)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$2(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 服务器上?我必须发送要执行的整个脚本吗?如果我想创建两个图表并稍后查询它们怎么办?

谢谢!

4

1 回答 1

4

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

如果要为服务器全局创建图形,它们必须是:

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

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

于 2017-07-05T11:01:14.313 回答