【问题标题】:How to run graph algorithms on distributed graph database using Titan+Cassandra?如何使用 Titan+Cassandra 在分布式图数据库上运行图算法?
【发布时间】:2015-03-17 11:35:57
【问题描述】:

我有一个使用 Titan+Cassandra(titan-server-0.4.4) 部署在 4 台机器上的分布式图。该图是关于呼叫详细记录的。

我有两种类型的节点——用户节点和呼叫节点。用户节点仅包含一个属性“用户 ID”。呼叫节点包含 2 个属性——呼叫的时间戳(日期和时间),以及呼叫的持续时间。对于每个呼叫,从呼叫节点到呼叫中涉及的相应用户对有两条边。边包含相应用户的纬度和经度作为属性。所有属性均已编入索引。

我现在有两个问题:

  1. 给定一个特定的用户ID,比如“A”,如何找到“A”在特定时间段内调用的用户?

  2. 对于运行社区检测等图形算法,我应该研究哪些工具?我收到了使用 Furnace 的建议,但找不到有关 Furnace 的任何文档。

【问题讨论】:

    标签: cassandra titan


    【解决方案1】:

    您可能会考虑通过将日期/时间放在边缘来调整架构以非规范化“调用”顶点。通过这种方式,您可以利用以顶点为中心的索引并查看更快的查询时间。

    http://thinkaurelius.github.io/titan/wikidoc/0.4.4/Vertex-Centric-Indices.html

    要获得第一个查询的答案(我会假设您已非规范化并且日期/时间在边缘存储为 long),您可以这样做:

    g.V('user','A').as('callerA').outE.interval('time',startTime,endTime)
        .inV.out.except('callerA')
    

    至于算法,TinkerPop 不支持 TinkerPop2 中的此类内容 - Furnace 从未正式发布过。我们期待在接近 GA 的 TinkerPop3 中出现这种情况 - http://www.tinkerpop.com/docs/3.0.0.M7/

    现在,您必须自己编写。 Furnace 中有一个聚类算法,你应该能够适应你的工作 - 你可以找到它here。如果你看一下测试,你就会知道它是如何工作的。

    【讨论】:

    • 我不得不使用“调用”顶点,因为我的数据文件中的每个条目(我从中生成图表)都只包含一个调用的结束,并且这些条目没有排序尊重时间。数据文件包含超过 9E8 个条目。无论如何,我认为您的查询适用于 gremlin。它可以与 java blueprint api 一起使用吗?如果没有,你能给我等效的蓝图查询吗?
    • 我并不是建议您摆脱“呼叫”顶点。我只是想让您将“时间”存储在“调用”顶点和边缘中。我不建议尝试使用 Blueprints API 来编写它——这就是 Gremlin 的重点。它将可能长达数十/数百行的查询简化为一个易于阅读且易于维护的简洁语句。虽然可以在蓝图级别编写此遍历(即 Gremlin 使用蓝图,因此您可以使用 Gremlin 执行的任何操作都可以使用蓝图完成),但这样做会适得其反。
    • 知道了,以后会用gremlin了。
    猜你喜欢
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多