关于稠密点的处理

  • nebula 版本:3.6.0
  • 部署方式:单机
  • 安装方式:Docker
  • 是否上生产环境:N
  • 硬件信息
    • SSD
    • X99,64GB

为了处理稠密点,看起来nebulaGraph没有做特殊优化,我目前的做法是,当一个关于某个结点的查询超时,根据边中存储的时间排序,删除早期边,只保留最近的1000条记录。
看了下文档,目前只能用客户端程序先查询一个结点的出入边总数,然后第二步查询时根据时间排序,再LIMIT lastResult.Count - 1000,将查询到的结果一条一条的删除。
但是这一系列操作十分占用时间和网络吞吐,请问能不能通过复合查询,根据第一次的Count,计算出要限制输出的结果,然后再用管道符DELETE EDGE?

我期望的语句是:
$lastResult = GO FROM ‘xxxx’ OVER Transfer BIDIRECT YIELD properties(edge) AS Transactions | YIELD count(*);
GO FROM ‘xxxx’ OVER Transfer BIDIRECT YIELD src(edge) AS src, dst(edge) AS dst, rank(edge) AS rank, properties(edge).TradeTime AS TradeTime | ORDER BY $-.TradeTime ASC | LIMIT lastResult.Count - 1000 | DELETE EDGE follow $-.src → $-.dst @ $-.rank;
但是目前遇到的问题是:
1.上一个查询的自定义变量只能作为下一个查询语句的输入
2.LIMIT 限制输出后无法再用管道获取前面的查询结果
可能是我的理解还不正确,请问一下有没有更好的解决方案?

是否可以用TTL。不过TTL不能保证一定有1000条边。但你可以加个汇总类型的边或者关系类型的边。
会比你当前的实现更轻量一点。效率也会更高

max_edge_returned_per_vertex这个参数不行?

谢谢各位回复,TTL和max_edge_returned_per_vertex我都看过了,TTL是按时间compact的不符合我的需求,我希望每个节点只保留最近的1000个交易记录,而max_edge_returned_per_vertex是粗暴截断,walk随机游走时不能保证查询的完整性。
我觉得似乎只能通过自定义查询结果来进行删除,但是我希望将查询语句都放在一个复合查询中,一次性统计出交易总数,再减去1000,得到要删除的交易记录数量,然后把这个数值用ORDER BY $-.TradeTime ASC排序后通过LIMIT限制输出结果,再用DELETE EDGE去删除。目的只是省去网络吞吐的开销,不知道是否可以实现?当然我也希望有更好的解决方案

关于汇总类型和关系类型的边,能详细说说吗?我能想到的是实时增加一个点的出入边总数,写到节点属性里,但是我在INSERT VERTEX时是多线程批量插入的,实时增加出入边计数的成本有点高。

就是你在insert一条明细边的时候,同时去更新那条汇总边。汇总边是在你第一次对两个点新增明细边的时候,同步增加的,后续只做更新,会一直存在,相当于表明历史的连接关系。

查询以后delete,不是不行,但是我觉得系统复杂度有点高了。而且效率也不是很高。

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。