在我们的图中,有很多顶点的输出边超过 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')
来获取 id 就需要很多时间。 .有没有办法解决这个问题?或者我们应该尝试在 GraphComputer 上执行这样的查询?
最佳答案
听起来您的用例几乎需要(如果不需要)全图扫描。这是图形的一个非常常见的用例,您可以看到它的一些用例 here .度中心性是更流行的用例之一。
如果您将聚合逻辑推送到应用程序层,那么您将错过 Tinkerpop 图形库的最大好处。 OLAP 遍历非常快。
请注意:
实际上,如果您确实使用图形计算机/olap 遍历,则应该在图形相对静态的环境中使用。这是因为 OLAP traversals in tinkerpop 将图形序列化为内存结构。因此,必须重新序列化对图形的更改。在快速变化的环境中,这会大大减慢速度。
希望有帮助。
关于gremlin - 如何处理具有大量边的顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54195729/