【问题标题】:How to handle vertices with a large number of edges?如何处理具有大量边的顶点?
【发布时间】:2023-03-11 05:03:01
【问题描述】:

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

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

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

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

  • 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')来获取id就需要很多时间。

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

【问题讨论】:

    标签: gremlin tinkerpop tinkerpop3 janusgraph gremlin-server


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      听起来您的用例几乎需要(如果不是)全图扫描。这是一个非常常见的图表用例,您可以在here 看到一些案例。度中心性是更流行的用例之一。

      如果您将聚合逻辑推送到应用程序层,那么您将错过 Tinkerpop 图形库的最大好处。 OLAP 遍历速度非常快。

      请注意:

      实际上,如果您确实使用图形计算机/olap 遍历,则应该在图形相对静态的环境中使用。这是因为 tinkerpop 中的 OLAP traversals 将图形序列化为内存结构。因此,必须重新序列化对图表的更改。在快速变化的环境中,这会大大减慢速度。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 2019-11-25
        相关资源
        最近更新 更多