使用Cassandra在JanusGraph中进行持久存储

使用Cassandra在JanusGraph中进行持久存储,cassandra,janusgraph,Cassandra,Janusgraph,我正在使用JanusGraph和Cassandra后端,但我有一些疑问 我的机器上使用Docker运行Cassandra服务器,API中有以下代码: GraphTraversalSource g = JanusGraphFactory.build() .set("storage.backend", "cql") .set("storage.hostname", "localhost") .open() .traversal();

我正在使用JanusGraph和Cassandra后端,但我有一些疑问

我的机器上使用Docker运行Cassandra服务器,API中有以下代码:

 GraphTraversalSource g = JanusGraphFactory.build()
        .set("storage.backend", "cql")
        .set("storage.hostname", "localhost")
        .open()
        .traversal();
然后,通过我的API,我使用Gremlin保存和获取数据。它工作正常,我看到数据保存在Cassandra数据库中

当我重新启动API并尝试获取数据时,问题就出现了。数据仍存储在Cassandra中,但JanusGraph查询返回空。为什么?

我是否需要将后端存储数据加载到内存或类似的东西中?我正在努力理解它是如何工作的

编辑

以下是我添加项目的方式:

 Vertex vertex = g.addV("User")
          .property("username", username)
          .property("email", email)
          .next();
要获取所有:

List<Vertex> all = g.V().toList()
提交您的事务 您现在正在使用JanusGraph,这使您能够访问JanusGraph的完整API。这意味着您必须自己管理,这还包括提交事务的必要性,以便将修改持久化到图形中

您只需拨打以下电话即可:

g.tx().commit();
在使用修改迭代遍历之后,在您的案例中使用addV遍历

如果没有提交,更改仅在事务中本地可用。当您重新启动Docker容器时,所有数据都将丢失,因为您尚未提交这些数据

推荐的方法:通过远程连接 如果您没有充分的理由将JanusGraph作为库嵌入到JVM应用程序中,那么建议将其独立部署为JanusGraph服务器,您可以将遍历发送到该服务器执行。 这样做的好处是,您可以独立于应用程序扩展JanusGraph,也可以从非JVM语言使用它

然后,JanusGraph服务器还通过在自己的事务中执行每个遍历,为您透明地管理事务。如果遍历成功,则提交结果,并且在发生异常时自动回滚结果

JanusGraph文档包含一节关于但重要的部分是创建连接到JanusGraph服务器的图形遍历源g的代码:

Graph graph = EmptyGraph.instance();
GraphTraversalSource g = graph.traversal().withRemote("conf/remote-graph.properties");
当然,您也可以作为Docker容器启动JanusGraph服务器:

docker run --rm janusgraph/janusgraph:latest
有关JanusGraph Docker映像以及如何将其配置为连接到Cassandra后端的更多信息,请参见

鉴于我对第一版答案的评论,下面的部分与这个问题不再直接相关。我仍然把它留在这里,以防其他人有类似的问题,而这可能是真正的原因

使用Docker容器的持久存储 JanusGraph将数据存储在您的存储后端,在您的案例中是Cassandra。这意味着您必须确保Cassandra保存数据。如果在Docker容器中启动Cassandra,则必须装入一个卷,Cassandra在其中存储数据,以便在容器重新启动后将其持久化。 否则,一旦停止Cassandra容器,数据将丢失

为此,您可以启动Cassandra容器,例如如下所示:

docker run -v /my/own/datadir:/var/lib/cassandra -d cassandra
其中/my/own/datadir是您希望存储Cassandra数据的主机系统的目录。 这在“注意事项>数据存储位置”下进行了解释。

提交事务 您现在正在使用JanusGraph,这使您能够访问JanusGraph的完整API。这意味着您必须自己管理,这还包括提交事务的必要性,以便将修改持久化到图形中

您只需拨打以下电话即可:

g.tx().commit();
在使用修改迭代遍历之后,在您的案例中使用addV遍历

如果没有提交,更改仅在事务中本地可用。当您重新启动Docker容器时,所有数据都将丢失,因为您尚未提交这些数据

推荐的方法:通过远程连接 如果您没有充分的理由将JanusGraph作为库嵌入到JVM应用程序中,那么建议将其独立部署为JanusGraph服务器,您可以将遍历发送到该服务器执行。 这样做的好处是,您可以独立于应用程序扩展JanusGraph,也可以从非JVM语言使用它

然后,JanusGraph服务器还通过在自己的事务中执行每个遍历,为您透明地管理事务。如果遍历成功,则提交结果,并且在发生异常时自动回滚结果

JanusGraph文档包含一节关于但重要的部分是创建连接到JanusGraph服务器的图形遍历源g的代码:

Graph graph = EmptyGraph.instance();
GraphTraversalSource g = graph.traversal().withRemote("conf/remote-graph.properties");
当然,您也可以作为Docker容器启动JanusGraph服务器:

docker run --rm janusgraph/janusgraph:latest
有关JanusGraph Docker映像以及如何将其配置为连接到Cassandra后端的更多信息,请参见

鉴于以下情况,以下部分与该问题不再直接相关 对我的答案的第一个版本的评论。我仍然把它留在这里,以防其他人有类似的问题,而这可能是真正的原因

使用Docker容器的持久存储 JanusGraph将数据存储在您的存储后端,在您的案例中是Cassandra。这意味着您必须确保Cassandra保存数据。如果在Docker容器中启动Cassandra,则必须装入一个卷,Cassandra在其中存储数据,以便在容器重新启动后将其持久化。 否则,一旦停止Cassandra容器,数据将丢失

为此,您可以启动Cassandra容器,例如如下所示:

docker run -v /my/own/datadir:/var/lib/cassandra -d cassandra
其中/my/own/datadir是您希望存储Cassandra数据的主机系统的目录。
这在“注意事项>数据存储位置”下进行了解释。

是,当然可以。我已经用一个卷运行了Cassandra容器。但当我重新启动服务器时,不是Cassandra容器,而是API,并且我执行一些Gremlin查询,数据不会返回;但是它存在于Cassandra数据库中。然后你能分享你如何添加数据的示例代码吗?我更新了我的答案。希望它现在真的解决了您的问题。嗨,我能以某种方式启动事务吗?所有相关的遍历都将计为一个事务,如果一个遍历失败,所有遍历都会发生事务回滚是的,当然。我已经用一个卷运行了Cassandra容器。但当我重新启动服务器时,不是Cassandra容器,而是API,并且我执行一些Gremlin查询,数据不会返回;但是它存在于Cassandra数据库中。然后你能分享你如何添加数据的示例代码吗?我更新了我的答案。希望它现在真的解决了您的问题。嗨,我能以某种方式启动事务吗?所有相关的遍历都将计为一个事务,如果一个遍历在事务回滚中失败,则所有遍历都将发生回滚