[英]Making my titan db graph with cassandra and elasticsearch backend
我的问题是我想将产品,客户和卖方数据存储在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毫无疑问。
我的问题简而言之
如果您能指出我的错误并朝正确的方向放一些面包屑,我将不胜感激
如果您不能使用Java,则只能使用Groovy。 至于
如何存储我自己的数据供泰坦数据库处理
边注
使用图形数据库,可以使用多种方式存储此数据。 如果要真正形式化数据的结构,我建议您研究一下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都有其用途,您应该阅读这篇以获得更多信息。
索引用于加速遍历和查找。 因此,您需要确定要编制索引的内容。 对于我们的示例,我们想快速了解在不同日期进行的所有购买。 这意味着我们可以在边缘放置混合索引以帮助我们(复合索引同样有用,但是您在询问Elasticsearch,因此我们将使用混合索引)。
要定义混合索引,我们首先定义一个简单的架构(更多信息在此处 ):
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")
会更快。
注意 :加载数据之前,应先创建索引和架构。 从长远来看,这只会使事情变得简单。
因为您的主要语言是JavaScript / Node.js,所以您可以使用https://www.npmjs.com/package/gremlin ,它是TinkerPop3 Gremlin Server的WebSocket客户端(免责声明:此处的库作者)。 您可以使用客户端将Gremlin-Groovy查询字符串发送到远程Gremlin Server。
与图进行交互的最基本方法是:
import { createClient } from 'gremlin';
const client = createClient(8182, 'localhost');
client.execute('g.V()', (err, results) => {
// handle err or results
}
文档中详细介绍了更多高级模式。 客户端还支持绑定参数,以提高安全性和性能。
现在就对您的域和数据建模发表评论还为时过早,因此为了让您入门,我将坚持您问题的环境部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.