gremlin - 如何处理具有大量边的顶点?

标签 gremlin tinkerpop tinkerpop3 janusgraph gremlin-server

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

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

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

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

  • 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 上执行这样的查询?

    最佳答案

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

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

    请注意:

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

    希望有帮助。

    关于gremlin - 如何处理具有大量边的顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54195729/

    相关文章:

    java - 如何为这些类型的方法编写单元测试?

    titan - Gremlin-Giraph-GraphX ?在 TitanDb 上

    gremlin - 如何在 Tinkerpop 3 中定义自定义步骤?

    sparql - 是否可以将图形查询(Gremlin 或 SPARQL)的输出可视化为 Amazon Neptune 中的节点和边?

    azure - 将 Azure CosmosDB 移至本地环境

    Gremlin BFS 枚举,包括根

    graph-databases - 如何在一次查询中遍历回 gremlin 中的根顶点

    graph-databases - Gremlin 在遍历时查询深度信息

    groovy - 比较 Gremlin Groovy 中的顶点属性

    java - 当我在 java 的 gremlin 查询中使用 valueMap() 时,出现 NoFastSuchElementException