Titan With Cassandra as Backend : creating , storing and traversing the graph in java
我对 Titan 完全陌生,当我开始研究它时,我感到很困惑,因为它有很多新东西,比如 Gremlin、tinkerpop 和 rexter 等。
我想要的是 java 中的一个示例,它使用以 Cassandra 作为后端的 Titan。我想创建一个图,存储在 cassandra 中,取回并遍历它。一个非常简单的方法也会很有帮助。
我在 java 中运行了一个基本示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 的键空间和以下表格:
- Titan_ids
- 边缘存储
- 图索引
- 系统属性
- 系统日志
- 发送日志
- edgestore_lock_
- graphindex_lock_
- system_properties_lock_
我不知道这些表的用途以及它们如何存储数据。
运行程序后,它会创建一个由 2 个顶点和它们之间的边组成的图形。我查询了这些表,并在每个表中发现了一些十六进制值。
我有以下问题:
图形是如何存储在 cassandra 中的?
现在我有这张图表说 \\'x\\' 存储在 cassandra 中。假设我创建了另一个图表 \\'y\\' 并存储它。如何能够检索和遍历任何特定的图?因为在普通的 cql 查询中,您知道要查询的表和列。我将如何分别识别 \\'x\\' 和 \\'y\\'。
任何人都可以帮助在 java 中发布示例代码以使用一些示例 csv 数据创建图形。存储在 Cassandra 和一些遍历示例中的同一张图。将很有帮助,因为没有这样可以理解的示例。
你有几个问题,所以我会尽量回答。
问题1:
如果您对如何将数据持久化到数据库中感兴趣,那么您应该看看这里,它详细描述了 Titan 数据模型。我不确定它对提交日志和表的转换效果如何,但这是一个开始。
问题2:
所以你最终得到一个名为
1 2 3 4 5 6 7 8 9 10 11 | 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); |
当然,您可以在此处概述的相同键控中创建多个断开连接的图形
问题3:
这是一个要求样本 CSV 迁移的问题。我想说退后一步,问问自己,你想塑造什么。
假设您要存储产品列表和购买这些产品的人员列表。您可以通过多种方式对此进行建模,但现在我们只说人和产品是顶点,然后之间的边代表购买:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | //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 与 Titan 交互。
希望对你有所帮助