【问题标题】:Making my titan db graph with cassandra and elasticsearch backend使用 cassandra 和 elasticsearch 后端制作我的 Titan 数据库图
【发布时间】:2016-08-04 09:12:17
【问题描述】:

我的问题是我想将产品、客户和卖家数据存储在以 cassandra 作为存储后端和以弹性搜索作为索引后端的 Titan 图形数据库中。然后我将查询该数据以向客户和卖家提出建议。我无法存储自己的数据。由于数据量很大,我将使用 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 作为替代品)

如果你能指出我的错误并朝正确的方向扔一些面包屑,我将不胜感激

【问题讨论】:

    标签: node.js elasticsearch cassandra titan gremlin


    【解决方案1】:

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

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

    import { createClient } from 'gremlin';
    
    const client = createClient(8182, 'localhost');
    
    client.execute('g.V()', (err, results) => {
        // handle err or results
    }
    

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

    现在就您的领域和数据建模发表评论可能为时过早,所以我将坚持您问题的环境部分,以便让您开始。

    【讨论】:

    【解决方案2】:

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

    如何存储我自己的数据以供titan db处理

    旁注

    对于图形数据库,有多种存储这些数据的方法。如果您想真正形式化您的数据结构,我建议您查看OntologiesOWLTopic 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-CentricMixed 都有各自的用途您应该阅读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)当我执行 g.traversal().V().values() 时,它给出了神图的顶点而不是产品买家卖家数据节点(我之前已经加载了 graphOfGods 数据。)。 2. 怀疑这个产品买家卖家数据存储在哪里(在 cassandra 上?) 3) 当我运行搜索查询 g.traversal().V().hasLabel("Bob").outE("purchased").has ("Day", "Friday") 它说 [Query 需要遍历所有顶点 [(~label = Bob)]。为了获得更好的性能,即使我遵循了您的管理步骤,也请使用索引]。任何提示我可能弄错了。
    • 1.如果您加载了众神图并保存了它,那么是的,您会看到该数据混合到您自己的数据中。如果需要,您可以使用 TitanCleanup 快速清除图形。 2. 是的,它存储在 cassandra 中。归根结底,Titan 是一个支持多个后端的图形库,cassandra 就是其中之一。 3. 这很自然,因为我们没有将其编入索引。正如我所说,我们必须选择我们索引的内容。在示例中,我索引了边缘。在 Bob 这样一个简单的情况下,复合索引最适合快速查找。检查有关泰坦综合指数的文档。它们非常全面。
    • 再次感谢您的解释!让我开心。
    猜你喜欢
    • 2016-09-03
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2017-01-29
    • 2016-10-05
    相关资源
    最近更新 更多