gremlin - 如何处理具有大量边的顶点?
问题描述
在我们的图中,有很多顶点的出边数超过 100k。我想知道处理由此产生的所有情况的方法是什么。
假设我们group_1
在图表中有一个定义。group_1
有 100k members
。我们有一些从member_x
顶点开始并计算一些东西的遍历。这些遍历速度非常快,每次都在约 2 秒内结束。
但是时代变了,现在我们需要将单个小遍历的所有结果聚合到一个数字中。遍历必须包含来自group_1
的成员的所有结果。
起初,我们的方法是创建遍历,members_x
通过使用发出一束skip
,limit
然后在应用程序级别使用并行处理,计算我们的东西的总和。但是,这种方法几乎没有问题:
g.V().has('group',y).out('member_of').skip(0).limit(10)
- 根据文档,这种遍历每次都可以返回不同的结果。所以以这种方式创建捆绑包是不正确的g.V().has('group',y).out('member_of').skip(100_000).limit(10)
耗时太长,因为我们发现,数据库仍然需要访问 100k 个顶点
因此,我们的下一个方法是存储一个遍历,该遍历发出捆绑包,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 上执行这样的查询?
解决方案
您的用例似乎是@Filipe 提到的OLAP 案例。
有多种方法可以做到这一点,一种方法是使用 Tinkerpop 的图形库。但这是通过消耗存储系统(JanusGraph 后端)中托管的数据来实现的,这最终可能会减慢其他实时图查询的速度。
对于规模约为 20B 成员的类似用例,我们将其从 JanusGraph 存储后端中取出,并使用 Spark 使用 MapReduce 方法。
Spark GraphX 是另一个可以通过 spark 加载数据的工具。经过多次测试和失败的迭代,最终,我们在 MR 和 Beyond 中使用Conencted Component解决了我们的用例。这是谷歌的一篇研究论文。
推荐阅读
- node.js - 推荐node中最好的pdf生成包
- python - Python - Spark - RDD 日期转换
- angular - 角度改变 scss 对象变量
- python - 将 2 个列表的字符串表示形式转换为列表
- graph - 将鼠标悬停在数据点上但在其下方某处时未显示 Google 图表工具提示。为什么?
- java - 在java中恢复线程
- sass - 如何在 SaSS/CSS 中为单行禁用更漂亮
- c# - 如果我在 xamarin 表单后面的代码中编写代码,为什么我的视图不可见?
- css - 如何在 Magento 2.2.6 中实现我用 Bootsrap 3.3.7 制作的自定义菜单?
- r - 改变传说的顺序以获得多种美学