【发布时间】:2023-03-11 05:03:01
【问题描述】:
在我们的图中,有很多顶点的出边数超过 100k。我想知道处理由此产生的所有情况的方法是什么。
假设我们在图表中定义了一个group_1。 group_1 有 100k members。我们有一些从member_xvertex 开始的遍历并计算一些东西。这些遍历速度非常快,每次都在约 2 秒内结束。
但是时代变了,现在我们需要将单个小遍历的所有结果汇总到一个数字中。遍历必须包含来自group_1 成员的所有结果。
起初,我们的方法是创建遍历,通过使用skip 和limit 发出一束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