使用cassandra和elasticsearch后端制作我的titan db图

时间:2016-04-13 10:26:51

标签: node.js elasticsearch cassandra titan gremlin

我的问题是我想将产品,客户和卖家数据存储在titan图数据库中,其中cassandra作为存储后端,elasticsearch作为索引后端。然后我将查询该数据以向客户和卖方提出建议。我无法达到可以存储自己数据的程度。由于数据量很大,我将使用cassandra和elasticsearch。

到目前为止我所做的是我有cassandra,elasticsearch设置。 现在我可以运行bin / titan.sh启动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 apis来提出建议。用java写作是不可能的 由于一些限制。我该怎么做呢。(我想我只有gremlin作为替代品)
  3. 如果你能指出我的错误并将一些面包屑放在正确的方向,我将不胜感激

2 个答案:

答案 0 :(得分:4)

如果你不能使用Java那么你只能使用Groovy。至于

  

如何将自己的数据存储到titan db进行处理

旁注

使用图表DB,有多种方法可以存储这些数据。如果您想真正形式化数据结构,我建议您查看OntologiesOWLTopic Maps这些可以作为如何正式化和构建数据的灵感。图DB。只有在寻找在图表中非常正式地构建数据的方法时,这些读取才是好的。

结构示例

目前我们假设您只想跟踪他们购买的客户产品。一个简单的结构是,客户产品都是顶点,具有从客户到产品的优势,作为客户购买该产品的事实。我们甚至可以在此边缘添加其他数据,例如购买时间数量。以下是如何在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有不同类型的索引,复合以顶点为中心混合都能达到目的如果您有更多信息,请阅读this

索引用于加速遍历和查找。所以你需要决定索引的内容。对于我们的示例,我们希望快速了解在不同日期进行的所有购买。这意味着我们可以在边缘上放置一个混合索引来帮助我们(复合索引同样适用,但是你要求弹性搜索,所以我们将使用混合索引)。

要定义混合索引,我们首先定义一个简单的模式(更多信息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")

会快得多。

注意:您应该在加载数据之前制作索引和架构。从长远来看,这只会使事情变得简单。

答案 1 :(得分:4)

因为您的主要语言是JavaScript / Node.js,所以您可以使用https://www.npmjs.com/package/gremlin这是TinkerPop3 Gremlin Server的WebSocket客户端(免责声明:此处为库作者)。您使用客户端将Gremlin-Groovy查询的字符串发送到远程Gremlin服务器。

与图表交互的最基本方式是:

import { createClient } from 'gremlin';

const client = createClient(8182, 'localhost');

client.execute('g.V()', (err, results) => {
    // handle err or results
}

文档中详细介绍了更多高级模式。客户端还支持绑定参数,以提高安全性和性能。

评论您的域名和数据建模可能为时尚早,因此我会坚持使用您的问题的环境部分,以便让您入门。