我的问题是我想将产品、客户和卖家数据存储在 titan 图形数据库中,该数据库以 cassandra 作为存储后端,以 elasticsearch 作为索引后端。然后我将查询该数据,向客户和卖家提出建议。我无法达到可以存储自己的数据的程度。由于数据将会很大,我将使用 cassandra 和 elasticsearch 。
到目前为止我所做的是设置了 cassandra 和 elasticsearch 。 现在我可以运行 bin/titan.sh start 来启动 cassandra,es 和 gremlin 服务器 我还可以通过以下方式玩众神数据图
gremlin> graph = TitanFactory.open('conf/titan-cassandra-es.properties')
==>standardtitangraph[cassandrathrift:[127.0.0.1]]
gremlin> GraphOfTheGodsFactory.load(graph)
==>null
现在我正在尝试找到一种方法来存储我的产品、客户和卖家图表数据。这样它就存储在 cassandra 上,索引存储在 elasticsearch 上。
我应该采取什么步骤来做到这一点。我的项目主要语言是nodejs,由于项目限制,java是不可能的。
我的简短问题
- 如何存储我自己的数据以供 titan db 处理
- 一旦数据可供处理。我将公开一些用于提出建议的 http api。用java写是没有问题的 由于一些限制。我应该如何继续它。(我想我只有 gremlin 作为替代)
如果您能指出我的错误并向正确的方向撒一些面包屑,我将不胜感激
最佳答案
如果您不能使用 Java,那么您只能使用 Groovy。至于
how to store my own data for titan db to process
旁注
图形数据库有多种存储数据的方法。如果您想真正形式化数据结构,我建议您查看 Ontologies , OWL ,和Topic Maps这些可以为如何形式化和构建图数据库中的数据提供很大的启发。仅当您寻找在图表中非常正式地构建数据的方法时,这些阅读才有用。
结构示例
现在假设您只想跟踪客户以及他们购买的产品。一种简单的结构是,客户和产品都是具有从客户到产品的边的顶点,作为客户购买了该产品的事实。我们甚至可以在该边缘添加额外的数据,例如购买时间和数量。以下是如何在 Groovy 中执行此操作的示例:
g = TitanFactory.open("titan-cassandra-es.properties")
gremlin> customerBob = g.addVertex("Bob");
==>v[12]
gremlin> customerAlice = g.addVertex("Alice");
==>v[13]
gremlin> productFish = g.addVertex("Fish");
==>v[14]
gremlin> productMeat = g.addVertex("Meat");
==>v[15]
gremlin> edge = customerBob.addEdge("purchased", productMeat, "Day", "Friday", "Qauntity", 2);
==>e[16][12-purchased->15]
gremlin> edge = customerBob.addEdge("purchased", productFish, "Day", "Friday", "Qauntity", 1);
==>e[17][12-purchased->14]
gremlin> edge = customerAlice.addEdge("purchased", productMeat, "Day", "Monday", "Qauntity", 3);
==>e[18][13-purchased->15]
上面基本上是说鲍勃在周五买了一些肉和鱼,而爱丽丝在周一买了一些肉。如果我们想找出鲍勃周五买了什么,我们可以进行以下遍历
gremlin> g.traversal().V().hasLabel("Bob").outE("purchased").has("Day", "Friday").otherV().label();
==>Meat
==>Fish
索引
在真正深入研究索引之前,请先了解一下结构。以下是关于 Elasticsearch 和 Titan 索引的非常骨架的解释:
关于索引,知道 titan 有不同类型的索引,Composite、Vertex-Centric 和 Mixed 都达到了它们的目的你应该阅读this了解更多信息。
索引用于加速遍历和查找。因此,您需要决定对哪些内容建立索引。对于我们的示例,我们希望快速了解不同日期的所有购买情况。这意味着我们可以在边缘上放置一个混合索引来帮助我们(复合索引也可以,但您询问的是elasticsearch,所以我们将使用混合索引)。
要定义混合索引,我们首先定义一个简单的架构(更多信息 here ):
mgmt = graph.openManagement();
purchased = mgmt.makeEdgeLabel("purchased").multiplicity(MULTI).make();
day = mgmt.makePropertyKey("Day").dataType(String.class).make();
您不需要为所有内容显式定义架构,但它对于您想要索引的任何内容都是必不可少的。现在您可以创建索引:
mgmt.buildIndex("productsPurchased", Edge.class).addKey(day).buildMixedIndex("search")
mgmt.commit() //"search" is defined in your titan-conf.properties file
使用此索引查询例如:
g.traversal().E().has("Day", "Friday")
会快得多。
注意:您应该在加载数据之前创建索引和架构。从长远来看,它只会让事情变得更简单。
关于node.js - 使用 cassandra 和 elasticsearch 后端制作我的 titan 数据库图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36595594/