以 Cassandra 作为后端的 Titan:在 java 中创建、存储和遍历图形

Titan With Cassandra as Backend : creating , storing and traversing the graph in java

我是 Titan 的新手,当我开始研究它时,我感到很困惑,因为它有很多新东西,比如 Gremlin、tinkerpop 和 rexter 等。

我想要的是 java 中的一个示例,它使用带有 Cassandra 的 titan 作为后端。我想创建一个图形,存储在 cassandra 中,检索它并遍历它。一个非常简单的也会有很大帮助。

我在 java 中得到了一个基本示例,我 运行。

    BaseConfiguration baseConfiguration = new BaseConfiguration();
    baseConfiguration.setProperty("storage.backend", "cassandra");
    baseConfiguration.setProperty("storage.hostname", "192.168.3.82");

    TitanGraph titanGraph = TitanFactory.open(baseConfiguration);

     Vertex rash = titanGraph.addVertex(null);
        rash.setProperty("userId", 1);
        rash.setProperty("username", "rash");
        rash.setProperty("firstName", "Rahul");
        rash.setProperty("lastName", "Chaudhary");
        rash.setProperty("birthday", 101);

        Vertex honey = titanGraph.addVertex(null);
        honey.setProperty("userId", 2);
        honey.setProperty("username", "honey");
        honey.setProperty("firstName", "Honey");
        honey.setProperty("lastName", "Anant");
        honey.setProperty("birthday", 201);

        Edge frnd = titanGraph.addEdge(null, rash, honey, "FRIEND");
        frnd.setProperty("since", 2011);

        titanGraph.shutdown();

所以当我 运行 这个时,我观察了 cassandra 日志,它创建了一个名为 titan 的键空间和以下 tables :

我不知道这些 table 的用途以及它们如何存储数据。

在 运行 程序之后,它创建了一个由 2 个顶点和它们之间的一条边组成的图形。我查询了 tables 并在每个 table.

中找到了一些十六进制值

我有以下问题:

  1. 图是如何存储在 cassandra 中的?

  2. 现在我有这张图说 'x' 存储在 cassandra 中。假设我创建了另一个图表 'y' 并存储了它。如何能够检索和遍历任何特定的图?因为在普通的 cql 查询中,您知道 table 和要查询的列。我将如何分别识别 'x' 和 'y'。

  3. 任何人都可以帮助在 java 中发布示例代码以使用一些示例 csv 数据创建图表。存储在Cassandra和一些同图的遍历例子。将有很大帮助,因为没有这样的示例可以理解。

你有几个问题,所以我会尽量回答。

问题 1:

如果您对数据如何保存到数据库中感兴趣,那么您应该看一看 here 它详细描述了 titan 数据模型。我不确定它转换为提交日志和表的效果如何,但这是一个开始。

问题二:

所以你最终得到一个名为 titan 的 keysoace 的原因是你没有提供自己的。通常在创建彼此无关的不同图形时,您会将这些图形存储在不同的键空间中。这是按如下方式完成的:

BaseConfiguration baseConfiguration = new BaseConfiguration();
baseConfiguration.setProperty("storage.backend", "cassandra");
baseConfiguration.setProperty("storage.hostname", "192.168.3.82");

//First Graph
baseConfiguration.setProperty("storage.cassandra.keyspace", "keyspace1");
TitanGraph titanGraph1 = TitanFactory.open(baseConfiguration);

//Second Graph
baseConfiguration.setProperty("storage.cassandra.keyspace", "keyspace2");
TitanGraph titanGraph2 = TitanFactory.open(baseConfiguration);

当然,您可以按照概述在同一个 keysoace 中创建多个断开连接的图

问题 3:

要求示例 CSV 迁移的问题有点复杂。我会说退后一步问问自己,你想模仿什么。

假设您要存储产品列表和购买这些产品的人员列表。您可以通过多种方式对此进行建模,但现在我们只说人和产品是顶点,然后它们之间的边代表购买:

//Initliase graph
BaseConfiguration baseConfiguration = new BaseConfiguration();
baseConfiguration.setProperty("storage.backend", "cassandra");
baseConfiguration.setProperty("storage.hostname", "192.168.3.82");
baseConfiguration.setProperty("storage.cassandra.keyspace", "mycustomerdata");
TitanGraph graph = TitanFactory.open(baseConfiguration);

//---------------- Adding Data -------------------
//Create some customers
Vertex alice = graph.addVertex("customer");
alice.property("name", "Alice Mc Alice");
alice.property("birthdat", "100000 BC");

Vertex bob = graph.addVertex("customer");
bob.property("name", "Bob Mc Bob");
bob.property("birthdat", "1000 BC");

//Create Some Products
Vertex meat = graph.addVertex("product");
meat.property("name", "Meat");
meat.property("description", "Delicious Meat");

Vertex lettuce = graph.addVertex("product");
lettuce.property("name", "Lettuce");
lettuce.property("description", "Delicious Lettuce which is green");

//Alice Bought some meat:
alice.addEdge("bought", meat);
//Bob Bought some meat and lettuce:
bob.addEdge("bought", meat, lettuce);

//---------------- Querying (aka traversing whcih is what you do in graph dbs) Data -------------------
//Now who has bought meat?
graph.traversal().V().has("name", "meat").in("bought").forEachRemaining(v -> System.out.println(v.value("name")));

//Who are all our customers
graph.traversal().V().hasLabel("customer").forEachRemaining(v -> System.out.println(v.value("name")));

//What products do we have
graph.traversal().V().hasLabel("customer").forEachRemaining(v -> System.out.println(v.value("name")));

上面的例子是Titan的简单使用。我会推荐 运行 通过 [tinkerpop] 文档,以便您可以熟悉使用它。在一天结束时,您可以通过 Tinkerpop API.

与泰坦互动

希望对你有所帮助