使用 cassandra 和 elasticsearch 后端制作我的泰坦数据库图

Making my titan db graph with cassandra and elasticsearch backend

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

到目前为止,我所做的是设置了 cassandra 和 elasticsearch。 现在我可以 运行 bin/titan.sh start 启动 cassandra,es 和 gremlin server 我也可以通过

来玩转众神数据图
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, and Topic Maps 这些内容可以为如何在图形数据库中形式化和构建数据提供很大的启发。只有当您正在寻找以图表形式非常正式地构建数据的方法时,这些阅读才有用。

结构示例

现在假设您只想跟踪客户 和他们购买的产品。一个简单的结构是 customersproducts 都是从客户到产品的边作为客户已经购买的事实的顶点产品。我们甚至可以在该边缘放置额外的数据,例如 购买时间 数量 。下面是如何在 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]

以上基本上是说 Bob 在星期五买了一些肉和鱼,而 Alice 在星期一买了一些肉。如果我们想知道 Bob 周五买了什么,我们可以进行如下遍历

gremlin> g.traversal().V().hasLabel("Bob").outE("purchased").has("Day", "Friday").otherV().label();
==>Meat
==>Fish

索引

在真正深入研究索引之前先了解结构。以下是关于使用 Elasticsearch 和 Titan 建立索引的非常粗略的解释:

关于索引,知道 titan 有不同类型的索引,CompositeVertex-Centric混合 都达到了目的,您应该阅读 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")

会快很多。

注意:您应该在加载数据之前创建索引和架构。它只是让事情变得更简单 运行.

因为您的主要语言是 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
}

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

现在评论您的领域和数据建模可能还为时过早,因此我将只关注您问题的环境部分,以便让您入门。