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

Mic*_*hał 5 gremlin tinkerpop tinkerpop3 gremlin-server janusgraph

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

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

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

最初,我们的方法是创建其发射一束遍历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
}
Run Code Online (Sandbox Code Playgroud)

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

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

Fil*_*ira 0

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

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

请注意:

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

希望有帮助。