nebula-contrib / ngbatis

NGBATIS is a database ORM framework base NebulaGraph + spring-boot, which takes advantage of the mybatis’ fashion development, including some de-factor operations in single table and vertex-edge, like mybatis-plus. NGBATIS 是一款针对 NebulaGraph + Springboot 的数据库 ORM 框架。借鉴于 MyBatis 的使用习惯进行开发。https://graph-cn.github.io/ngbatis-docs/
https://nebula-contrib.github.io/ngbatis/
Apache License 2.0
132 stars 42 forks source link

How to perform DML in bulk/batch fashion #181

Open zhangxk-ocean opened 1 year ago

zhangxk-ocean commented 1 year ago

现在只能指定id,进行修改:update vertex on t1 1 set age = age + 2 我想实现这种效果:match(n:com:player) set n.com.sys_name = n.player.name 一个点关联了com、player标签,把com标签上的sys_name的值全部修改为player的name上的值 怎么实现呢

CorvusYe commented 1 year ago

这个目前还不支持,如果实现的话应该会跟分页的做法一样,开发时用一个dao方法,实际分成两次来执行。 不过如果不通过 id,有可能会触发下推的限制,导致在第一步就卡住了。 不懂 nGQL 本身能不能支持一次执行完成批量修改

zhangxk-ocean commented 1 year ago

难搞啊这个

zhangxk-ocean commented 1 year ago

如果实现的话应该会跟分页的做法一样,开发时用一个dao方法,实际分成两次来执行。 这个怎么分成两次dao方法来实现呢

CorvusYe commented 1 year ago

如果实现的话应该会跟分页的做法一样,开发时用一个dao方法,实际分成两次来执行。 这个怎么分成两次dao方法来实现呢

这个说的是能不能在ngbatis中封装一下,满足多标签的节点可以根据另一个标签的属性来更新,得再看一下具不具备可行性

zhangxk-ocean commented 1 year ago

zhangxk-ocean commented 1 year ago

不知道咋去封装,没思路啊

CorvusYe commented 1 year ago

初步的想法是先读数据,再改值。但这种成本很高,如果数据量大的话。

我现在比较纠结的是出于什么场景需要做这种重复数据存储,

如果在不改值的情况下,在实体中建立两个属性的等价关系, 然后对结果进行处理,近而达到类似改值后的效果。

这样的做法能不能满足需要改值的场景,还可以节省一些存储空间

zhangxk-ocean commented 1 year ago

我们目前是有个公共标签com,存公共属性,每个点都会关联本身的标签和这个com标签,然后每个标签都会有一个默认显示字段,这个字段可以选择,然后com标签中的name字段值就会和这个默认显示字段值相同。 如果标签的默认显示字段修改了的话,com中的name字段值就需要同步修改成新修改的这个默认显示字段的值。 所以不知道怎么做合适些。 企业微信截图_16877787763878

zhangxk-ocean commented 1 year ago

后期数据量应该会很大,所以读数据改值的话,成本会很高

CorvusYe commented 1 year ago

这个场景不麻烦,可以试试建一个与这个公共标签相对应的实体类 然后其他实体类继承这个公共实体类 这个时候个性的实体不需要额外追加属性也能访问到公共的属性值。 公众属性值改变,读取到的属性值也随着改变。

CorvusYe commented 1 year ago

上面说的功能最早发布在 1.1.2 https://github.com/nebula-contrib/ngbatis/pull/124/files#diff-0c60e5f34cf00bc56d6cb10f1536ee5c278e689c1728e196367761aaa785a80f 这里有对应的用例,就是不懂能不能满足上述的业务场景

zhangxk-ocean commented 1 year ago

我看下

zhangxk-ocean commented 1 year ago

不能满足,我们只有com标签建实体类了,其他标签都是动态的没办法建实体类

zhangxk-ocean commented 1 year ago

所以比较难搞

CorvusYe commented 1 year ago

所有的动态标签都有 com 吗

zhangxk-ocean commented 1 year ago

CorvusYe commented 1 year ago

这边的做法最后选择使用哪个?#149 如果是查询成 Map,本身就是支持多标签的,需要自己实现的就是保存的标签 可以把 com 的保存再加一条语句,昨晚合并的 PR 多标签的更新也是一个 <update> 两条语句 或许可以试试这种做法。 这样读取跟写入就都是多标签的逻辑。

我没理解错的话,批量更新这个场景本身是为了同节点在不同标签的数据, 但这个同步本身可以使用多标签的读写来完成,也可以减少一些冗余