nebula-1.2.0 边新增属性并设置默认值

为了更快地定位、解决问题,麻烦参考下面模版提问(不符合提问规范的问题,会被隐藏待补充相关信息之后再发布

提问参考模版:

  • nebula 版本:nebula-1.2.0

  • 部署方式(分布式 / 单机 / Docker / DBaaS):分布式

  • 是否为线上版本:Y

  • 硬件信息

    • 磁盘( 推荐使用 SSD):SSD
    • CPU、内存信息 : 4C, 8G。
  • 问题的具体描述
    您好,请教一个关于边属性设置默认值的问题。
    我这边有一条边,称为 beManaged, 原本没有属性。后来业务需求,新增了属性,并设置了索引。语句如下:
    alter edge beManaged add (managerRank int default -1);
    create edge index beManaged_managerRank on beManaged(managerRank);

通过nebula-studio 也确认了生效,截图如下:

但是我在使用nebula-studio随意进行查询时,发现了两个问题。
1.查询到的默认值为 0。

2.此边已经创建了索引,但是根据默认值确无法进行查询。


辛苦了,期待您的回答。

Studio 的版本呢。

谢谢您的回复。
nebula-studio的版本是:V-1.2.7-beta。
不过我在 nebula的console端,使用命令行测试了下,也是直接返回 0。
应该与 studio的版本无关。

那你创建索引之后 rebuild 过吗,如果没有重新 rebuild 的话,是找不到数据的。

我没有进行rebuild。因为这个属性是我新增的,不是原有的。新增属性之后,立刻创建的索引。按照文档上的提示,应该不需要rebuild。
目前可以根据这个属性索引查询到数据。【其中managerRank == 1, 是业务重新写入的边。】

@echozheng 您好,关于默认值的我再看看哈,关于索引数据无法被查出:

这里有一些误解哈,如果您只是新修改了边的属性,而不是在创建 index 之后才插入的边本身,这个索引里还是没有现存的边的数据的哈,还是需要重建。

索引数据的建立是两种情况,一个是数据写入(同步阻塞地更新索引数据),一个是通过 job manager 执行 job 去重建(创建索引时候现存的点边数据)。您这些能查到的就是index创建之后写入的数据,有了 index,但是现存数据还是需要 rebuild job 的哈。

这里有一个我录的短视频介绍了索引写入过程 新手玩转 Nebula vol.05:原生索引_哔哩哔哩_bilibili ,更详细的信息可以去官方博客搜文章了解哈。

谢谢。的确,我执行rebuild命令之后,使用预设的默认值可以查询到相关值了。

辛苦确认了 默认值的问题之后,请同步我一下。

1 个赞

@wey 另外还有一个问题,rebuild 操作之后,如何判断rebuild完成执行完成了呢?
我使用go语句,在使用边属性过滤时,发现无法正常过滤。

rebuild 是一个 job 哈,可以看 job 的状态,参考 REBUILD INDEX - NebulaGraph Database 手册

关于 schema 修改,我去和开发同学 @liuyu85cn 学习了一下哈。
这个修改只会在 metaD 中为相应的 tag/edge type 增加一个更新版本的 schema,仅此而已,之后相应schema 新增数据会根据 schema 应用新的数据(修改的字段、默认值),而旧有的存留数据并不会做任何修改,除非对它们做 update 哈,所以获取旧有数据的时候,新的字段能够返回,但是默认值并不会应用 schema 里增加的默认值。 我们有做工作使得值会尝试返回为新schema默认值,稍等,我确认一下新版本的行为。

在 2.x 的 master 上,这个问题已经修复了哈

(root@nebula) [basketballplayer]> alter edge follow add (managerRank int default -1);
Execution succeeded (time spent 3909/46652 us)

Tue, 20 Jul 2021 10:01:00 CST

(root@nebula) [basketballplayer]> fetch prop on follow "player100"->"player101"
+---------------------------------------------------------------------+
| edges_                                                              |
+---------------------------------------------------------------------+
| [:follow "player100"->"player101" @0 {degree: 95, managerRank: -1}] |
+---------------------------------------------------------------------+
Got 1 rows (time spent 2802/41453 us)
1 个赞

谢谢您的回复。我看了好几遍,还是不大明白,所以再来请教下。
我的问题一共是两个。
第一个是我设置默认值为-1,但查询到的值是 0。从你下面的回复中,是确认了这个问题是 nebula-1.2.0的bug,并且在nebula-2.x上修复完成,这个理解没错吧。

第二个问题,是rebuild 索引之后,单独使用lookup语句进行过滤筛选没有问题。但是用在 go语句中,作为where的条件却过滤失败。您上面的这段回复,着实没看懂。 :grinning:

第一个是我设置默认值为-1,但查询到的值是 0。从你下面的回复中,是确认了这个问题是 nebula-1.2.0的bug,并且在nebula-2.x上修复完成,这个理解没错吧。

是的 :slight_smile:

第二个问题,是rebuild 索引之后,单独使用lookup语句进行过滤筛选没有问题。但是用在 go语句中,作为where的条件却过滤失败。您上面的这段回复,着实没看懂。 :grinning:

抱歉这个问题我之前忽略掉了,请问 181->2046 是 edge alt(增加 mamagerRank) 之前 就有的数据对么?这个应该和你查询到是 0 的问题都是 bug,我在2.x master 上看也是修复了的。

(root@nebula) [basketballplayer]> go from "player100" over follow where follow.managerRank == -1;
+-------------+
| follow._dst |
+-------------+
| "player101" |
+-------------+
| "player125" |
+-------------+
Got 2 rows (time spent 5142/45611 us)
1 个赞

该话题在最后一个回复创建后7天后自动关闭。不再允许新的回复。