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

Héc*_*tor 3 cassandra janusgraph

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

我的机器上运行着一个 Cassandra 服务器(使用 Docker),在我的 API 中我有以下代码:

 GraphTraversalSource g = JanusGraphFactory.build()
        .set("storage.backend", "cql")
        .set("storage.hostname", "localhost")
        .open()
        .traversal();
Run Code Online (Sandbox Code Playgroud)

然后,通过我的 API,我使用 Gremlin 保存和获取数据。它工作正常,我看到数据保存在 Cassandra 数据库中。

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

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

编辑

这就是我添加项目的方式:

 Vertex vertex = g.addV("User")
          .property("username", username)
          .property("email", email)
          .next();
Run Code Online (Sandbox Code Playgroud)

并获取所有:

List<Vertex> all = g.V().toList()
Run Code Online (Sandbox Code Playgroud)

Flo*_*ann 7

提交您的交易

您现在正在使用 JanusGraph作为库嵌入到您的应用程序中,这使您可以访问 JanusGraph 的完整 API。这意味着您必须自己管理事务,其中还包括必须提交事务才能持久保存对图的修改。

您只需调用以下命令即可做到这一点:

g.tx().commit();
Run Code Online (Sandbox Code Playgroud)

在您通过修改迭代遍历之后(addV()您的情况下的遍历)。

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

推荐方法:通过远程连接

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

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

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

Graph graph = EmptyGraph.instance();
GraphTraversalSource g = graph.traversal().withRemote("conf/remote-graph.properties");
Run Code Online (Sandbox Code Playgroud)

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

docker run --rm janusgraph/janusgraph:latest
Run Code Online (Sandbox Code Playgroud)

有关 JanusGraph Docker 映像以及如何配置它以连接到 Cassandra 后端的更多信息,请参阅此处


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

使用 Docker 容器进行持久存储

JanusGraph 将数据存储在您的存储后端中,在您的情况下是 Cassandra。这意味着您必须确保 Cassandra 保留数据。如果在 Docker 容器中启动 Cassandra,则必须安装 Cassandra 存储数据的卷,以在容器重新启动后保留数据。否则,一旦停止 Cassandra 容器,数据就会丢失。

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

docker run -v /my/own/datadir:/var/lib/cassandra -d cassandra
Run Code Online (Sandbox Code Playgroud)

where/my/own/datadir是您希望存储 Cassandra 数据的主机系统目录。官方 Cassandra Docker 映像的文档中对此进行了解释,位于“注意事项” > “存储数据位置”下。