我的问题是我想将产品,客户和卖家数据存储在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是不可能的。
我的问题简短
如果你能指出我的错误并将一些面包屑放在正确的方向,我将不胜感激
答案 0 :(得分:4)
如果你不能使用Java那么你只能使用Groovy。至于
如何将自己的数据存储到titan db进行处理
旁注
使用图表DB,有多种方法可以存储这些数据。如果您想真正形式化数据结构,我建议您查看Ontologies,OWL和Topic 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
}
文档中详细介绍了更多高级模式。客户端还支持绑定参数,以提高安全性和性能。
评论您的域名和数据建模可能为时尚早,因此我会坚持使用您的问题的环境部分,以便让您入门。