跳到主要内容

自环

之前的课程中,我们已经学习了 Tag、Edge Type、VID、Rank 等概念,但是有一个概念我们还没有讲到,那就是自环。

定义

今天的课程介绍图论中的另一个概念——自环。如果一条边所关联的两个点重合,则称此边为自环。

在 NebulaGraph 中,你可以插入一条起点和终点都相同的边。NebulaGraph 对于自环的操作没有封装任何的语法糖,操作方式与普通的边没有差别。

作用

那么自环可以用来做什么呢?

信息

以下内容中涉及到的 NebulaGraph 的图查询语言 nGQL 部分不是本课程的重点。如果您对 nGQL 不熟悉,可以先跳过相关内容,后续课程会有详细介绍。

作用一: 在某些场景下,图需要同时带有时序信息,可以用自环描述整个图的结构随着时间变化的情况。

NebulaGraph 的边可以使用 Rank 字段存放时间信息 (int64),但是点上的字段不适合存放时间信息,因为存放的属性会被新写入的覆盖。有关 Rank 课程介绍,参见VID 和 Rank

例如,我们先查找一次 VID 为player100, 点上的 Tag 为player的属性。

property_graph_1.png

可以看到返回的名字是 Foesa。

在插入两次点后,再查询一次。

property_graph_1.png

从返回结果中可以发现查出的名字是最后一次插入的名字n3。这是因为一个点可以多次插入属性值,以最后一次为准,所以我们不能用点的属性存放时间。

我们为 VID 为player100的点创建自环边。这里需要注意的是,如果起点、终点、边类型相同时,是无法区分多个边的,因此我们需要用 Rank 来做区分。假设插入三条边的 Rank 值分别是 123。我们使用 VID 查询,返回结果中可以看到 3 条起点和终点都相同的边。

property_graph_1.png

在可视化工具(NebulaGraph Explorer)中,我们清晰地看到了自环边的存在。

property_graph_1.png

因此,当用户需要为点添加时间属性时,可以先创建包含所需属性的边类型,然后为点插入一条或多条指向自身的边,将时间信息放置在自环的 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、以下关于自环说法正确的是


当前分数: 0 / 1