背景:我在基于图数据库做交易数据统计,具体方法是先从图数据库中读取全部点/边,在程序中完成聚合计算后,再把新的值写入图数据库。整个图空间的规模在6亿点、10亿边左右。
现象:在程序运行中发现某些点/边的统计数据不对,某些统计字段归零了(从代码流程判断,是因为读取图库历史数据时没有拿到这个key,所以程序认为这个key不存在),因此判断可能是当时没有查询到这个点/边。但是在测试环境没能复现这个情况。
请问这种情况是可能存在的吗,一般是因为什么原因呢,有办法可以规避吗,比如延迟读之类的
背景:我在基于图数据库做交易数据统计,具体方法是先从图数据库中读取全部点/边,在程序中完成聚合计算后,再把新的值写入图数据库。整个图空间的规模在6亿点、10亿边左右。
现象:在程序运行中发现某些点/边的统计数据不对,某些统计字段归零了(从代码流程判断,是因为读取图库历史数据时没有拿到这个key,所以程序认为这个key不存在),因此判断可能是当时没有查询到这个点/边。但是在测试环境没能复现这个情况。
请问这种情况是可能存在的吗,一般是因为什么原因呢,有办法可以规避吗,比如延迟读之类的
补充一下,我是使用的 fetch prop 语句批量查询指定vid
你如何取点和边的?
怀疑是悬挂边导致
我是使用 fetch prop 语句直接取点和边的,跟悬挂边应该没有关系呀
你 fetch 的顺序和语句能发下么?比如如果你先 fetch 的边,然后取边的起点终点去 fetch 点,那就会 fetch 不到
先 fetch 的边,然后取边的起点终点去 fetch 点,那就会 fetch 不到
这是因为悬挂边起点或终点不存在,所以才会出现能拿到边,但拿不到点嘛。
但是我的情况不是这样,我不会删点,因此应该不存在悬挂边,我是直接用 vid 拼 fetch 语句去并发获取点/边的。
在测试环境没能复现这个问题,也没有相关日志能证明,只是从数据结果来推测,应该是出现了点/边没查询到的情况
你 vid 是怎么获取的呢?
如果添加边的时候,不添加点,也是会存在悬挂边的。NebulaGraph 3.x 版本并不会在插边的时候做点是否存在点判断
我的 vid 是用业务id算出来的,两者一一对应。
悬挂边也不影响我的入库逻辑,我的点和边是独立更新的,互不依赖。写和读是顺序执行的,只有全部写完了后,才会有读请求,不会交叉进行。
入库程序有做幂等处理,只有点/边同时返回插入成功,才会保存业务进度,否则会重试。现在的问题就是数据库返回插入成功了,我的业务进度都保存了,但是程序在读出来的时候,似乎没读到