自环
之前的课程中,我们已经学习了 Tag、Edge Type、VID、Rank 等概念,但是有一个概念我们还没有讲到,那就是自环。
定义
今天的课程介绍图论中的另一个概念——自环。如果一条边所关联的两个点重合,则称此边为自环。
在 NebulaGraph 中,你可以插入一条起点和终点都相同的边。NebulaGraph 对于自环的操作没有封装任何的语法糖,操作方式与普通的边没有差别。
作用
那么自环可以用来做什么呢?
以下内容中涉及到的 NebulaGraph 的图查询语言 nGQL 部分不是本课程的重点。如果您对 nGQL 不熟悉,可以先跳过相关内容,后续课程会有详细介绍。
作用一: 在某些场景下,图需要同时带有时序信息,可以用自环描述整个图的结构随着时间变化的情况。
NebulaGraph 的边可以使用 Rank 字段存放时间信息 (int64),但是点上的字段不适合存放时间信息,因为存放的属性会被新写入的覆盖。有关 Rank 课程介绍,参见VID 和 Rank。
例如,我们先查找一次 VID 为player100
, 点上的 Tag 为player
的属性。
可以看到返回的名字是 Foesa。
在插入两次点后,再查询一次。
从返回结果中可以发现查出的名字是最后一次插入的名字n3
。这是因为一个点可以多次插入属性值,以最后一次为准,所以我们不能用点的属性存放时间。
我们为 VID 为player100
的点创建自环边。这里需要注意的是,如果起点、终点、边类型相同时,是无法区分多个边的,因此我们需要用 Rank 来做区分。假设插入三条边的 Rank 值分别是 1
、2
、3
。我们使用 VID 查询,返回结果中可以看到 3 条起点和终点都相同的边。
在可视化工具(NebulaGraph Explorer)中,我们清晰地看到了自环边的存在。
因此,当用户需要为点添加时间属性时,可以先创建包含所需属性的边类型,然后为点插入一条或多条指向自身的边,将时间信息放置在自环的 Rank 上。查询时只需要查询指向自己的边属性。对于我们上面插入的自环,可以用以下语句查询:
GO FROM "player100" OVER temp YIELD properties(edge).tmp, rank(edge);
作用二:自环的第二个作用是处理临时属性或 List 类型的属性。
在 NebulaGraph 中,复合数据 List 类型不能存储为点或边的属性,但是我们可以使用自环来实现动态添加属性。
当然如果你需要返回结果为 List,也可以通过函数实现,例如运行以下语句:
nebula> MATCH (v1:player)-[e:temp]->() RETURN collect(e.tmp);
之前课程介绍过悬挂边,一些用户可能用悬挂边来存放带时间或者 List 类型的数据,但是这样很容易触发问题。我们建议用自环来替代悬挂边。
课堂小测试
1、以下关于自环说法正确的是