如何以最小的代价控制点的出入度

如题,目的是为了防止超级节点的出现。因为一旦出现超级节点,对查询的影响太大。另外就是对于我遇到的场景来说,任何一个点都有成为超级节点的可能性。

目前可以想到的办法是在写入之前先查询两个点的出度和入度,但是这样做的代价比较大。因为nebula对出入度的查询耗时比较严重。会非常影响写入的效率。

有没有相关的配置可以在存储层面进行限制,超过阈值就删除最早的边?

存储层自动删边, 目前可用的方案是配置TTL, 用时间做阈值;
还有查询可以尝试配置max_edge_returned_per_vertex, 减少返回的数据量;该配置项表示每个起点可拓展的最大边数量。

1 个赞

谢谢。
不过两者都是治标不治本的。
TTL是根据时间过期,而不是根据数量过期

max_edge_returned_per_vertex可能会影响结果的准确性。例如A和B
之间有15条边,A和C之间有1条边。这样在查询路径的时候很容易把A->C这条路径忽略。

另外就是另一个帖子中提到的,为什么点的出入度统计不准并且性能非常差呢

这种操作需要用户自己做,可以加个定时任务。内核不太可能做这种事情,所有存下来的数据,除非用户自己删,否则内核都是不会动的。TTL 属于按照时间去过期,这个是高频需求,所以有这个功能 ,即便是 TTL,也需要用户主动配置。

1 个赞

加定时任务的话需要分页遍历所有的点,但是nebula现在也不支持这种操作吧。

我感觉,可以把rank用时间倒序进行排序+limit方式来解决你的诉求

分页是支持的啊,可以看文档或者论坛搜搜。想删除最早的边是肯定可以删的。

目前看应该也不行,没有很好的处理办法