11

我想使用 Java API 在远程服务器上操作图形,服务器实际上托管在 localhost 中。我用来连接服务器的代码是:

JanusGraphFactory.Builder b = JanusGraphFactory.build();
b.set("hosts", "[localhost]");
JanusGraph graph = b.open();

但是在我运行程序之后,它会抛出如下异常:

线程“main”java.lang.IllegalStateException 中的异常:需要设置配置值:root.storage.backend

那么如何使用 Java API 连接到远程 JanusGraph 服务器呢?

4

6 回答 6

9

我发现的文档建议创建一个 EmtpyGraph 并从中获取远程遍历:

EmptyGraph.instance().traversal().withRemote(config);

其中 config 是您的具有远程属性的配置对象,例如:

    config.setProperty("clusterConfiguration.hosts", HOST);
    config.setProperty("clusterConfiguration.port", PORT);
    config.setProperty("clusterConfiguration.serializer.className", "org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0");
    config.setProperty("clusterConfiguration.serializer.config.ioRegistries", ioRegistries); // (e.g. [ org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry) ]
    config.setProperty("gremlin.remote.remoteConnectionClass", "org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection");
    config.setProperty("gremlin.remote.driver.sourceName", "g");

但是,我在使用 JanusGraph 特定功能(例如提交事务)时遇到了问题,因为图实例是 EmptyGraph 本身,而不是 JanusGraph。所以,试试:

GraphTraversalSource g = JanusGraphFactory.open("inmemory").traversal().withRemote(config);

这将为您提供远程 gremlin-server 的遍历源,您可以执行 g.addV("vertexLabel")....;, g.tx().commit(); 等等。

于 2017-08-17T11:27:29.847 回答
4

这是一个简单的方法:

graph = JanusGraphFactory.open("conf/janusgraph-cassandra-solr.properties") juno = graph.addVertex() //Automatically opens a new transaction juno.property("name", "juno") graph.tx().commit() //Commits transaction

Janus 用户文档

Janus 使用 cassandra、hbase、berkelydb 等现有存储解决方案来存储数据。

您可以通过 2 种方式连接: 1 - 连接到远程 gremlin 服务器并远程执行遍历/查询。这是通过使用 tinkerpop gremlin 2 的 Cluster 和 EmptyGraph - 使用我在上面的帖子中建议的技术直接从您的应用程序连接。

连接到远程 gremlin 服务器的优缺点

优点

  • 服务器有更多的控制权,所有的查询都是集中的。
  • 由于每个人都通过远程 gremlin 服务器运行遍历/查询,因此所有这些都受到事务保护。默认情况下,远程 gremlin 服务器在事务中运行您的遍历/查询。
  • 中央战略管理
  • 中央模式管理

缺点

  • 很难进行手动事务管理
  • 您必须使用 groovy 脚本作为字符串并将其发送到删除(集群提交)以进行代码的事务执行。

通过直接从您的客户端代码连接(避免远程连接),您可以获得更多控制权。

此外,您可以直接在代码中使用 JanusGraph 实例,这仍然是 gremlin 的抱怨,以充分利用 JanusGraph API。

于 2017-10-28T03:16:31.713 回答
2

上面的大多数答案都已过时。现在,要通过远程连接到 janusgraph 或任何 tinkerpop 投诉图数据库,我们需要创建集群对象。使用这个集群对象,我们可以获得graphTraversalSource。当程序结束释放连接池时,这两个对象都需要关闭。

    private static Cluster cluster;
    private static GraphTraversalSource gts;

    private static void init() {
        cluster = Cluster.build()
                .addContactPoint(uri)
                .port(port)
                .serializer(Serializers.GRYO_V3D0)
                .maxInProcessPerConnection(32)
                .maxSimultaneousUsagePerConnection(32)
                .maxContentLength(10000000)
                .maxWaitForConnection(10)
                .minConnectionPoolSize(poolSize)
                .maxConnectionPoolSize(poolSize+5)
                .create();

        gts = AnonymousTraversalSource
                .traversal()
                .withRemote(DriverRemoteConnection.using(cluster));
    }


    public GraphTraversalSource getConnection() {
        return gts;
    }

    public static void finalise() throws Exception {
        gts.close();
        cluster.close();
    }

GraphTraversalSource 是一个线程安全的对象,理想情况下应该是一个单例。每个 graphTraversalSource 对象都将其连接池保存在其上下文中。

于 2020-09-25T13:05:53.030 回答
2

尝试这个:

JanusGraphFactory.Builder builder = JanusGraphFactory.build().
            set("storage.hostname", "localhost").
            set('storage.backend', 'cassandra') //or whatever you are using as backend
builder.open();
于 2017-08-14T12:51:57.177 回答
1

检查janusgraph 示例中的RemoteGraph

您可以在 Class RemoteGraphApp下找到如何连接到远程 janusgraph 服务器(集群)。

 conf = new PropertiesConfiguration(propFileName);

    // using the remote driver for schema
    try {
        cluster = Cluster.open(conf.getString("gremlin.remote.driver.clusterFile"));
        client = cluster.connect();
    } catch (Exception e) {
        throw new ConfigurationException(e);
    }

    // using the remote graph for queries
    graph = EmptyGraph.instance();
    g = graph.traversal().withRemote(conf);

集群配置文件包含:

 hosts: [127.0.0.1]
 port: 8182
 serializer: {
   className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0,
   config: {
    ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry]
   } 
 }
于 2019-03-11T10:29:43.347 回答
0

使用以下代码:

        JanusGraphFactory.Builder config = JanusGraphFactory.build();
        config.set("storage.backend", "cassandrathrift");
        config.set("storage.cassandra.keyspace", "graph1");
        config.set("storage.hostname", "127.0.0.1");

        JanusGraph graph = config.open();
于 2020-02-18T06:03:00.187 回答