跳到主要内容

悬挂边

图结构课程中,我们介绍了图中边的概念,这里我们详细了解悬挂边的概念。

定义

图论中悬挂边(Dangling Edge)是指一条边的起点或终点不存在于数据库中的边。

danglingedge1

在具体系统行为上,就是在边上能查到起点或终点的 VID,但是如果直接去数据库中查找这个 VID 的时候,无法查到这个点以及 Tag、属性。

danglingedge2.png

悬挂边的产生

在 NebulaGraph 3.X.X 中,有两种情况可能会出现悬挂边。

  • 第一种情况:在起点和终点插入之前,用INSERT EDGE语句插入一条边,这时候这条边就是悬挂边。
danglingedge3.png
  • 第二种情况:使用DELETE VERTEX语句删除点的时候,没有使用WITH EDGE选项。这时候默认不删除该点关联的出边和入边,因此导致这条边变成悬挂边。
danglingedge4.png
备注

需要注意的是,Nebula Graph 2.X 中,使用DELETE VERTEX语句会默认删除点关联的出边和入边,将不会出现悬挂边。

悬挂边的查询

信息

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

Nebula Graph 3.X.X 的数据模型中,由于设计允许图中存在悬挂边。 没有 openCypher 中的 MERGE 语句,所以对于悬挂边的保证完全依赖应用层面。

这里我们用INSERT EDGE插入一条起点和终点都不存在的悬挂边。

CREATE EDGE IF NOT EXISTS e1 (name string, age int);

INSERT EDGE e1 (name, age) VALUES "11"->"13":("n1", 1);
  • GO:使用 GO 语句查询到这条边,例如GO FROM "11" OVER e1 YIELD properties(edge)查询到这条边的属性值。

    GO 的查询是从边的 Key 开始查找起点,如果仅返回边的属性,是可以查看到悬挂边的属性的,但是无法返回点的属性,因为去查询点的时候,点是不存在的,例如GO FROM "11" OVER e1 YIELD properties($$)

  • LOOKUP:在创建索引之后,也可以使用 LOOKUP 语句查询这条边,例如LOOKUP on e1 YIELD edge as r

    Lookup 的查询也是从边的 Key 开始遍历的,-[e]→,不需要起始点a和终点b

  • MATCH:但是如果使用 MATCH 语句,例如MATCH ()-[e:e1]→() RETURN e LIMIT 100将不能查到悬挂边。

    这是因为使用 MATCH 查询一条边,例如(a)-[e]->(b)中的e时,e的起点a和终点b必须是存在的。

课堂小测试

1、悬挂边的描述正确的有:


当前分数: 0 / 3