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

Persistent storage in JanusGraph using Cassandra

我正在使用 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 查询 returns 为空。为什么?

我是否需要将后端存储数据加载到内存或类似的东西中?我想了解它是如何工作的。

编辑

这是我添加项目的方式:

 Vertex vertex = g.addV("User")
          .property("username", username)
          .property("email", email)
          .next();

并获取全部:

List<Vertex> all = g.V().toList()

提交您的交易

您现在正在 embedded as a library in your application which gives you access to the full API of JanusGraph. This means that you have to manage transactions 自己使用 JanusGraph,这还包括必须提交您的交易以持久保存对图表的修改。

您只需调用即可完成此操作:

g.tx().commit();

在你用修改迭代你的遍历之后(在你的例子中是 addV() 遍历)。

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

推荐方法:通过远程连接

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

JanusGraph Server 还通过在其自己的事务中执行每个遍历来透明地为您管理事务。如果遍历成功,则提交结果,如果出现异常,也会自动回滚。

JanusGraph 文档包含有关 how to connect to JanusGraph Server from Java 的部分,但重要的部分是此代码用于创建连接到您的 JanusGraph 服务器的图形遍历源 g

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

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

docker run --rm janusgraph/janusgraph:latest

有关 JanusGraph Docker 图像以及如何配置它以连接到您的 Cassandra 后端的更多信息,请参见 here


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

具有 Docker 个容器的持久存储

JanusGraph 将数据存储在您的存储后端中,在您的情况下是 Cassandra。这意味着您必须确保 Cassandra 持久保存数据。如果您在 Docker 容器中启动 Cassandra,那么您必须在 Cassandra 存储数据的位置挂载一个卷,以在容器重启后持久保存数据。 否则,一旦停止 Cassandra 容器,数据就会丢失。

为此,您可以像这样启动 Cassandra 容器:

docker run -v /my/own/datadir:/var/lib/cassandra -d cassandra

其中 /my/own/datadir 是您希望存储 Cassandra 数据的主机系统目录。 这在 注意事项 > 数据存储位置.

下的 the docs of the official Cassandra Docker image 中进行了解释