insert edge时随机丢数据,但是入库接口不返回错误

我们使用insert edge values的语句入库100000个关系,其中数据关系会有重复,当使用单线程时入库结果是正确的,但是使用8个线程并列入库,入完数据后会随机少数据,我们猜测理由是 并发写入同一条边会报edge conflict 错误,可稍后重试 但是使用insert edge 不论是否成功后台返回的入库结果都是success,请问如果要加快入edge的速度应该怎么处理这种情况?即可能多线程入到同一个关系,入库失败,但是入库方法不报错

cc @MuYi 感觉是个事务相关的需求。

你是哪个版本?
感觉不应该啊。importer 用那么久也没出现过问题。
入库失败不应该入库方法不报错吧

用的graphd版本是nebula-graphd version 3.6.0, 入库方法使用的是resp = client.execute_json(f"USE {task_name};{query}") ,入库时使用多个edge放在一个insert语句中进行发送,不论是否成功resp中status都是成功

插入语句:

"update vertex on `人` \"人_G120026561\" set `姓名` = \"['游清淞', '游清淞003']\"; update vertex on `人` \"123\" set `姓名` = \"['张三', 'zhangsan']\"; insert edge `拥有身份证` () values \"人_G000002\" -> \"身份证_G000002\" : ();"

原始语句:

cmd 中的数据 是 把如下数据: 
insert edge `拥有身份证` () "人_G000002" -> "身份证_G000002" : ()
insert edge `拥有身份证` () "人_G000001" -> "身份证_G000001" : ()
insert vertex `人` (`出生日期`,`教育程度`,`性别`,`婚姻状态`,`军事代码`,`姓名`) "人_G000002" :("19640412","國中畢業","男","有偶","後備除役","游清淞"), "人_G000001" :("19880808","大学畢業","女","无偶","後備除役","012")

合并为:
insert vertex `人` (`出生日期`,`教育程度`,`性别`,`婚姻状态`,`军事代码`,`姓名`) values "人_G000002" :("19640412","國中畢業","男","有偶","後備除役","游清淞"), "人_G000001" :("19880808","大学畢業","女","无偶","後備除役","012");
insert edge `拥有身份证` () values "人_G000002" -> "身份证_G000002" : (), "人_G000001" -> "身份证_G000001" : ();

没太看懂你的插入语句和原始语句,为什么不太一样?

你可以把你的原始数据做一下去重统计,边要根据srcId,dstId,rank来去重。 然后跟nebula库中 show
stats的结果对比下,看是否真的是少数据。

1 个赞

只是给了个例子,真实场景下我们只insert了edge,没有insert任何vertex
真实场景下我们使用多线程入库,数据会随机丢失,比如入库100万关系,随机入完95万,或者98万
同样的数据单线程入库,show stats之后显示入库100万条,因此判断数据有缺失,多线程入库每次入同样的数据show stats不完全一样,单线程入库则每次入库都是100万条关系。

嗯,我们主要是多线程,每个线程都调用client.execute_json,如果只有一个线程show 结果是对的,如果是多个线程会随机出现关系丢失

nebula 插入数据的返回结果是 当前请求中所有数据写入成功则返回成功,你可以看下是否因多线程写入存在edge conflict导致某些批次写入失败,这种写入报错你要通过 ResultSet.isSucceed来判断,而不是单纯的捕获exception。