关于java api的返回值:session.execute返回:error:-1005:Storage Error: Vertex or edge not found.

代码逻辑是这样:
1、先查询某个边是否存在:FETCH PROP ON e_order ‘vid_from’->‘vid_to’ 。。。
2、如果边存在就:UPDATE EDGE 。。。更新属性
3、如果边不存在就:INSERT EDGE 。。。插入边

但是解析ResultSet,发现偶尔返回:error:-1005:Storage Error: Vertex or edge not found.

实际复查数据发现应该插入/更新成功了的,相关的点和边都存在的

是插入之后立马查询吗?数据插入之后可以等 1-2 个心跳,大概 10-20 秒,你可以再试试。

我是先用 FETCH PROP ON e_order ‘vid_from’->‘vid_to’ 。。。
确认查到有存在边,才会update

既然如此,为啥不直接使用 upsert 呢 UPSERT VERTEX - Nebula Graph Database 手册

官方提示性能底,另外看了很多遍文档也没看明白:
文档里分了:插入不存在的边,修改存在的边两种情况,我怎么判断存,做一次查询?
那不是和直接用insert 和 update一样吗

我的边有三个属性:min_val, max_val, cnt

数据更新的时候有一个属性:val

如果边不存在,三个属性分别为:val,val,1
如果边存在,三个属性变成:
min_val = min(min_val, val)
max_val = max(max_val, val)
cnt = cnt + 1

实在没研究出怎么写

因为 upsert 多了一个读操作,来判断数据是插入还是更新。Nebula 的插入数据是覆盖式的,所以如果单出用 insert 的话就是写操作。

所以,大佬,我的问题还没解决:
1、现状的error为啥产生,我分明是fetch的
2、我上面的更新要求,upsert好像无法满足吧

这个错误是 FETCH PROP ON e_order ‘vid_from’->‘vid_to’ 。。。 报错的吧?

如果报错 说明‘vid_from’->‘vid_to’ 边不存在,执行insert edge

并不是的,是第2/3步执行 session.execute的返回结果,
fetch边如果不存在,也是返回执行成功,通过返回记录行数判断是否存在边

1)update和insert时,src+dst+ranking 是一条边,需要确定这条边是否存在;如果报错你手动检查一下是否存在。
2)确保系统中没有删边的情况。
3)你可以试试 upsert

您看下我上面发的:
我第一步执行查询:FETCH PROP ON e_order ‘vid_from’->‘vid_to’ 。。。
根据结果决定是insert 还是 update,而上面错误显然是update报错吧?和查询结果冲突;

另外我的更新要求,upsert似乎无法满足:

========================================

我的边有三个属性:min_val, max_val, cnt

数据更新的时候有一个属性:val

如果边不存在,三个属性分别为:val,val,1
如果边存在,三个属性变成:
min_val = min(min_val, val)
max_val = max(max_val, val)
cnt = cnt + 1

实在没研究出怎么写

报错原因很多种,比如

  1. 你update的那条边不存在
  2. 或者update的边不满足update里面的where条件
    等等

现在代码里的insert是等同于SQL里的insert or update,不论之前边是否存在,insert都会写入。另外update/upsert时候,最好把所有字段都指定了。

感谢回复:
1、你update的那条边不存在,
应该不存在,FETCH PROP ON e_order ‘vid_from’->‘vid_to’ 查到了才update,否则insert.
2、或者update的边不满足update里面的where条件,
应该也不存在UPDATE EDGE on %s ‘%s’->’%s’ SET ,不带where条件;

不是必现的,偶发的,所以很困惑,难道会是storage读写对应的节点,数据不一致吗?

能保证不会并发update/delete同一条边吗?
其实你可以直接用upsert然后把所有字段都set,应该是没问题的

并发更新同一条边,报的的是个错误:error:-1005:Storage Error: More than one request trying to add/update/delete one edge/vertex at the same time.

upsert不支持我上面语义的更新,有个times=times+1的操作;

你要确保不是并发的操作同一个点/边

您看看我楼上说的,并发操作报的是:error:-1005:Storage Error: More than one request trying to add/update/delete one edge/vertex at the same time.

我收到的错误不是

恕我直言。。这两个横看竖看都是一个报错信息啊

大佬,我上面的意思是如果并发更新一条边,报的是这种错误:error:-1005:Storage Error: More than one request trying to add/update/delete one edge/vertex at the same time.
这个错误我也遇到过,能够自己解决;因为好几个人反复问,我就回答了多次,,,

而我本次碰到的是帖子1楼的问题:
通过FETCH PROP ON e_order ‘vid_from’->‘vid_to’ 。。。确认查到有边存在才去update边,但是报了这个错:error:-1005:Storage Error: Vertex or edge not found.

而我的边有个属性是set times = times + 1,似乎无法通过upsert一条语句来更新掉;