悬挂边
在图结构课程中,我们介绍了图中边的概念,这里我们详细了解悬挂边的概念。
定义
图论中悬挂边(Dangling Edge)是指一条边的起点或终点不存在于数据库中的边。
在具体系统行为上,就是在边上能查到起点或终点的 VID,但是如果直接去数据库中查找这个 VID 的时候,无法查到这个点以及 Tag、属性。
悬挂边的产生
在 NebulaGraph 3.X.X 中,有两种情况可能会出现悬挂边。
- 第一种情况:在起点和终点插入之前,用
INSERT EDGE
语句插入一条边,这时候这条边就是悬挂边。
- 第二种情况:使用
DELETE VERTEX
语句删除点的时候,没有使用WITH EDGE
选项。这时候默认不删除该点关联的出边和入边,因此导致这条边变成悬挂边。
需要注意的是,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、悬挂边的描述正确的有: