【问题标题】:How can I acquire JanusGraphManagement over a remote connection?如何通过远程连接获取 JanusGraphManagement?
【发布时间】:2020-05-06 15:57:09
【问题描述】:

我有一个运行 gremlin-server 的 docker 容器。

它是通过以下方式启动的:

./bin/gremlin-server.sh conf/gremlin-server/gremlin-server.yaml

在 docker 容器中,运行此映像: https://hub.docker.com/r/janusgraph/janusgraph

服务器已启动并正在侦听端口 8182

$ docker ps
6019adda6081        janusgraph/janusgraph                                         "docker-entrypoint.s…"   2 days ago          Up 26 hours         0.0.0.0:8182->8182/tcp                             

我对使用架构和索引很感兴趣。

Janus 在这里提供这个:https://docs.janusgraph.org/basics/schema/

以下是我用来尝试连接 gremlin-server 的配置:

AbstractConfiguration config = new BaseConfiguration();

    config.setListDelimiter('/');
    // contents of conf/remote-graph.properties
    config.setProperty("gremlin.remote.driver.sourceName", "g");
    config.setProperty("gremlin.remote.remoteConnectionClass", "org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection");
    // contents of conf/remote-objects.yaml:
    config.setProperty("clusterConfiguration.hosts", databaseUrl);
    config.setProperty("clusterConfiguration.port", 8182);
    config.setProperty("clusterConfiguration.serializer.className", "org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0/");

    config.setProperty("storage.backend", "cql");
    config.setProperty("clusterConfiguration.serializer.config.ioRegistries", "org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry");

当我打电话时

GraphTraversalSource g = traversal().withRemote(config);

我得到了一个遍历源,一切似乎都很好。但是,要使用 Janus 提供的管理功能,我似乎需要一个 JanusGraphManagement 对象。我无法获得上面的通用Graph 对象并将其转换为JanusGraph。文档建议使用 JanusGraphFactory:https://docs.janusgraph.org/basics/configuration/#janusgraphfactory

所以我打电话

    JanusGraph janusGraph = JanusGraphFactory.open(config);

我得到以下堆栈跟踪:

    Exception in thread "main" java.lang.IllegalArgumentException: Could not find implementation class: org.janusgraph.diskstorage.cql.CQLStoreManager
    at org.janusgraph.util.system.ConfigurationUtil.instantiate(ConfigurationUtil.java:60)
    at org.janusgraph.diskstorage.Backend.getImplementationClass(Backend.java:440)
    at org.janusgraph.diskstorage.Backend.getStorageManager(Backend.java:411)
    at org.janusgraph.graphdb.configuration.builder.GraphDatabaseConfigurationBuilder.build(GraphDatabaseConfigurationBuilder.java:50)
    at org.janusgraph.core.JanusGraphFactory.open(JanusGraphFactory.java:161)
    at org.janusgraph.core.JanusGraphFactory.open(JanusGraphFactory.java:132)
    at org.janusgraph.core.JanusGraphFactory.open(JanusGraphFactory.java:112)
    at com.activitystream.database.GraphMigration.migrateDatabase(GraphMigration.java:69)
    at com.activitystream.runners.persistence.DataStores.migrateDatabase(DataStores.java:27)
    at com.activitystream.runners.persistence.EntityPersistenceRunner.main(EntityPersistenceRunner.java:23)
    Caused by: java.lang.ClassNotFoundException: org.janusgraph.diskstorage.cql.CQLStoreManager
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
at org.janusgraph.util.system.ConfigurationUtil.instantiate(ConfigurationUtil.java:56)
    ... 9 more

是否可以通过远程连接修改架构?

如果不可能,如何修改架构?

任何见解都将不胜感激。

【问题讨论】:

    标签: java gremlin janusgraph gremlin-server


    【解决方案1】:

    你基本上有两个选择 - 要么:

    1. way of scripts 发送到 Gremlin 服务器的 JanusGraphManagement 对象交互(通常通过会话的方式,但我想您可以将整个“管理脚本”打包在一起并作为一个请求提交)或
    2. 绕过 Gremlin 服务器并按照 JanusGraph 文档中的说明在本地实例化您的 JanusGraphManagement 对象。

    无法将JanusGraphManagement 返回给您的客户端,因为它不是可以从服务器发回的可序列化对象。

    【讨论】:

    • 感谢您解决此问题。我目前正在尝试第 2 步。我的“empty-sample.groovy”中有以下几行`PropertyKey streamIdKey; if(!mgmt.containsPropertyKey("stream_id")) { streamIdKey = mgmt.makePropertyKey("stream_id").dataType(String.class).cardinality(Cardinality.SINGLE).make(); ` 但是 groovy 脚本抱怨它无法识别 Cardinality 类。 (这是org.janusgraph.core 的一部分)。如何将类添加到启动脚本的执行上下文中?
    • 在脚本顶部添加 import org.janusgraph.core.Cardinality 应该可以解决这个问题。
    • 对我有用的是通过完整的包名引用 Cardinality 类。例如。 .cardinality(org.janusgraph.core.Cardinality.SINGLE).make()) 按照这里的建议-> github.com/JanusGraph/janusgraph/issues/1262
    • @stephenmallette 我面临着完全相同的问题,并希望避免使用方法 2。您能否详细说明第一个选项,或者提供指向示例 sn-p 的链接。
    • 您对方法 2 所做的任何事情,都可以作为脚本从驱动程序发送。我看到我在答案中的链接已损坏...我已经更新了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多