关于入库同一vid的点数据的数据覆盖的疑问

你好,我在web页面测试数据入库,新建的schema如下:
CREATE TAG process ( pid int, pguid string, pname string default “”)
其中,pname字段设置了默认值为“”。

首先,入库一条数据:
INSERT VERTEX process(pid,pguid,pname) VALUES hash(“24bf7159-e0bc-49a8-bd06-0dbfabe61fea”): (3658436,“24bf7159-e0bc-49a8-bd06-0dbfabe61fea”,“hello world”);

然后,再入库数据:
NSERT VERTEX process(pid,pguid) VALUES hash(“24bf7159-e0bc-49a8-bd06-0dbfabe61fea”): (12345,“24bf7159-e0bc-49a8-bd06-0dbfabe61fea”);

第二次入库的目的是只想更新pid字段的值,而保留pname字段的值。但是在第二次入库后,发现pname的值也被默认值“”给覆盖了,这违反了我的本意。

我的问题是:
1、请问nebula就是这样设计的吗,即使存在默认值的字段没有填值也会覆盖之前入库的数据中的值?
2、如果就是这样设计的,那有办法按照我得需求,保留之前的pname字段的值吗?

mark

第二次用update

https://docs.nebula-graph.com.cn/manual-CN/2.query-language/4.statement-syntax/2.data-query-and-manipulation-statements/update-vertex-syntax/

1 个赞

你好,我再问下nebula自身有没有这样的一种机制:
insert数据,如果之前数据在数据库中已存在,那么该条插入则不作处理。
即存不存在insert vertex if not exist这种语法。

如果没有这种机制,那是否用户必须先使用查询语句查看是否已经存在该条数据,然后再自己丢弃这次insert。

目前IF NOT EXISTS语法仅支持在创建schema时和用户管理时使用。在插入数据时还不能用。比如:

CREATE SPACE IF NOT EXISTS default_space

+1

假如你一定要保存最开始插入的数据,那你可以先用fetch读下有没有这条数据,没有再做插入。

奥奥,好的,明白了,看来我需要自己用insert和fetch封装成一条符合需求的语句。
再问下如果在插入数据前先fetch判断这条数据是否存在,这个fetch的耗时对比insert操作的耗时比例大概是多少呢,如果耗时太多的话对入库性能也会有影响。

如果所有字段都没有默认值 可以直接用upsert,本质上就是fetch+insert

暂时没测试数据, 理论上 fetch也不需要有锁, 且可以用批量的方式去跑, 应该跟 insert 在一个数量级上.

upsert的锁库和只支持单条插入太影响性能了,目前insert的性能还是符合我们的业务要求的

好的,明白了,后期我测试一下,多谢啦 :+1: :+1:

fetch是个随机读,insert是一个顺序写,估计SSD上也应该会有些差距的