0

我已经用 Cassandra + ES 建立了一个 Janusgraph 集群。集群已设置为支持 ConfiguredGraphFactory。另外,我正在远程连接 gremlin 集群。我已经设置了一个客户端,并且能够使用以下方法创建一个图表:

client.submit(String.format("ConfiguredGraphFactory.create(\"%s\")", graphName));

但是,我无法获得使用 gremlin 驱动程序创建的图形的 traversalSource。我是否必须创建原始 gremlin 查询并使用 client.submit 遍历图形,或者有没有办法使用 Emptygraph.Instance() 通过 gremlin 驱动程序获取它。

4

1 回答 1

3

要获取远程遍历引用,您需要传入一个绑定到图遍历的变量名。当您启动远程服务器时,此绑定通常作为启动脚本中“全局变量”的一部分完成(启动脚本配置为作为 gremlin-server.yaml 的一部分运行)。

目前没有将变量动态绑定到图形或遍历引用的固有方法,但我计划在某个时候修复这个问题。

一个短期的解决方法是将您的图形和遍历引用绑定到将被可变定义的方法,然后创建一些机制来动态更改变量。

进一步解释一个潜在的解决方案:

  1. 更新服务器的启动脚本以绑定g到某个变量:

    globals << [g : DynamicBindingTool.getBoundGraphTraversal()]
    
  2. Create DynamicBindingTool,它必须做两件事:

    A. 提供一种setBoundGraph()可能类似于以下内容的方式:

    setBoundGraph(graphName) {
        this.boundGraph = ConfiguredGraphFactory.open(graphName);
    }
    

    B. 提供一种getBoundGraphTraversal()可能类似于以下内容的方式:

    getBoundGraphTraversal() {
        this.boundGraph.traversal();
    }
    

您可以在您的启动脚本中包含这些类型的函数,或者甚至可以创建一个单独的 jar 附加到您的 Gremlin 服务器。

最后,我想指出,建议的示例解决方案没有考虑多节点 JanusGraph 集群,即您的概念current bound graph不会在 JG 节点之间共享。要使其成为多节点解决方案,您可以更新函数以在外部数据库上定义绑定图,甚至可以在 JanusGraph 图上进行定义。

例如,这样的事情将是一个多节点安全实现:

setBoundGraph(graphName) {
    def managementGraph = ConfiguredGraphFactory.open("managementGraph");
    managementGraph.traversal().V().has("boundGraph", true).remove();
    def v = managementGraph.addVertex();
    v.property("boundGraph", true);
    v.property("graph.graphname", graphName);
}

和:

getBoundGraphTraversal() {
    def managementGraph = ConfiguredGraphFactory.open("managementGraph");
    def graphName = managementGraph.traversal().V().has("boundGraph", true).values("graph.graphname");
    return ConfiguredGraphFactory.open(graphName).traversal();
}

编辑:

不幸的是,上述“短期技巧”将不起作用,因为全局绑定被评估一次并在服务器生命周期的持续时间内存储在 Map 中。有关修复的更多信息和更新,请参见此处:https ://issues.apache.org/jira/browse/TINKERPOP-1839 。

于 2017-11-17T16:04:33.667 回答