首页 > 解决方案 > 如何处理具有大量边的顶点?

问题描述

在我们的图中,有很多顶点的出边数超过 100k。我想知道处理由此产生的所有情况的方法是什么。

假设我们group_1在图表中有一个定义。group_1有 100k members。我们有一些从member_x顶点开始并计算一些东西的遍历。这些遍历速度非常快,每次都在约 2 秒内结束。

但是时代变了,现在我们需要将单个小遍历的所有结果聚合到一个数字中。遍历必须包含来自group_1的成员的所有结果。

起初,我们的方法是创建遍历,members_x通过使用发出一束skiplimit然后在应用程序级别使用并行处理,计算我们的东西的总和。但是,这种方法几乎没有问题:

因此,我们的下一个方法是存储一个遍历,该遍历发出捆绑包,members然后在单独的线程中执行并行遍历,计算先前获取的成员的总和:

while(is_not_the_end) {
   List<Members> members = g.V().has('group',y).out('member_of').next(100)`
   addMembersToExecutorThread(members) // done in async way
}

那么,当您遇到此类情况时,有哪些方法?基本上,如果可以找到一种方法来快速获取某个顶点的所有祖先,我们就可以解决这个问题。在我们的例子中,这将是一个group_1. 但是仅仅通过使用g.V().has('group',y).out('member_of').properties('members_id').

有没有办法解决这个问题?或者也许我们应该尝试在 GraphComputer 上执行这样的查询?

标签: gremlintinkerpoptinkerpop3janusgraphgremlin-server

解决方案


您的用例似乎是@Filipe 提到的OLAP 案例。

有多种方法可以做到这一点,一种方法是使用 Tinkerpop 的图形库。但这是通过消耗存储系统(JanusGraph 后端)中托管的数据来实现的,这最终可能会减慢其他实时图查询的速度。

对于规模约为 20B 成员的类似用例,我们将其从 JanusGraph 存储后端中取出,并使用 Spark 使用 MapReduce 方法。

Spark GraphX 是另一个可以通过 spark 加载数据的工具。经过多次测试和失败的迭代,最终,我们在 MR 和 Beyond 中使用Conencted Component解决了我们的用例。这是谷歌的一篇研究论文。


推荐阅读