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

3
我是一个可靠的助手,会将文本翻译成中文。

我正在使用JanusGraph和Cassandra后端进行编程实践,但我有一些疑问。

我在我的机器上运行了一个Cassandra服务器(使用Docker),并且在我的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()
1个回答

7

提交您的事务

您目前正在使用JanusGraph 嵌入到您的应用程序库中,这使您可以访问JanusGraph的完整API。这意味着您必须自行管理事务,这也包括需要提交您的事务以将修改持久化到图形中。

您可以通过调用以下方式来简单完成此操作:

g.tx().commit();

在使用修改后的遍历(在您的情况下是addV()遍历)进行迭代之后,如果没有提交,则更改仅在事务中本地可用。当重新启动Docker容器时,所有数据都将丢失,因为您没有提交它。

推荐方法:通过远程连接

如果您没有将JanusGraph作为JVM应用程序中的库嵌入的充分理由,则建议将其独立部署为JanusGraph服务器,您可以将遍历发送到该服务器以进行执行。 这样做的好处是,您可以独立扩展JanusGraph,并且还可以从非JVM语言中使用它。

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

JanusGraph文档包含有关如何从Java连接到JanusGraph服务器的部分,但重要部分是此代码,用于创建连接到JanusGraph服务器的图遍历源g

Graph graph = EmptyGraph.instance();
GraphTraversalSource g = graph.traversal().withRemote("conf/remote-graph.properties");

当然,您也可以将JanusGraph服务器作为Docker容器启动:

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 Docker镜像文档中的Caveats > Where to Store Data中有解释。


是的,当然。我已经使用卷运行了Cassandra容器。但是当我重新启动我的服务器(不是Cassandra容器,而是我的API),并执行一些Gremlin查询时,数据没有返回;尽管它存在于Cassandra数据库中。 - Héctor
那么,您能否分享一下您添加数据的示例代码? - Florian Hockmann
我更新了我的回答。希望现在它能够真正解决你的问题。 - Florian Hockmann
你好,我能否以某种方式启动“事务”,并且所有相关的遍历都将计为一个“事务”,如果一个遍历在“事务”中失败,则会回滚到所有遍历。 - Serhii Zadorozhnyi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接