node.js - 使用 cassandra 和 elasticsearch 后端制作我的 titan 数据库图

标签 node.js elasticsearch cassandra titan gremlin

我的问题是我想将产品、客户和卖家数据存储在 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是不可能的。

我的简短问题

  1. 如何存储我自己的数据以供 titan db 处理
  2. 一旦数据可供处理。我将公开一些用于提出建议的 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 有不同类型的索引,CompositeVertex-CentricMixed 都达到了它们的目的你应该阅读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/

相关文章:

javascript - 如何将路由器/中间件添加到Features应用程序?

node.js - Sequelize 使用引用创建belongTo 实例

mysql - 序列化数据库 :migrate failing with sequelize deprecated string error

node.js - NodeJS 的 Web Sockets 服务器端实现

elasticsearch 必须重启 master 才能让新节点加入 zen discovery

elasticsearch - Kafka Elasticsearch 连接器 - 'Flush timeout expired with unflushed records:'

elasticsearch - 多字段搜索查询字符串中的同义词

java - Cassandra部署集群失败

java - Cassandra 数据库 : Parsing an Instant from Cassandra's Timestamp in Json fails

database-design - Cassandra 中的用户信息存储