本文介绍图数据的基本构成,以及如何使用UQL描述和表达图数据,这些概念是学习和掌握嬴图产品的前提。
图数据
点
图一中用圆圈表示的Areith和Waiter是点(Node)。点表示真实世界中的实体。
边
图一中带箭头的workAs是一条边(Edge),由Areith指向Waiter。边表示实体之间的关系。
Schema
图一中代码里出现的Person、Job和workAs是Schema(模式)。Schema表示点、边的不同类型。
属性
图一中代码里出现的name和title是属性(Property)。属性是Schema的组成部分,用来具体描述Schema的特征。
路径
图二中由Areith、workAs、Waiter所形成的连续且点、边交替出现的序列是一条路径(Path)。同理,由Waiter、workAs、Areith、studyAt、Oxford构成的序列也是一条路径。
路径以点开始、以点结束,包含至少一条边。路径表达了实体之间的多步关联关系,也是图计算中经常出现的查询目标。
描述点
很多UQL参数都可以描述点,以n()
为例:
n() // 任何点
n({@Student}) // Schema为Student的点
n({name == "Jason"}) // 属性name为Jason的点
n({@Student.name == "Jason"}) // Schema为Student且属性name为Jason的点
n(as a) // 任何点,并命名为a
n({@Student} as a) // ...
...
以上描述的语法特征:
n()
内不含花括号{}
或{}
内为空时,表示对点没有过滤条件- 过滤点的Schema时使用
@
符号 - 点的Schema和属性可以分开描述,也可以联合描述,联合描述时使用
.
符号连接 - 给满足要求的点定义别名时使用关键词
as
,且位于{}
(如有)之后
UQL中可以用来描述点的参数有:
nodes()
:用于点的查找、更新和删除n()
:用于模板路径查询,表示路径中的某个点nf()
:用于模板路径查询,表示路径中多个连续的点src()
:用于一般的路径查询,表示路径起点dest()
:用于一般的路径查询,表示路径终点node_filter()
:用于一般的路径查询,表示除src()
和dest()
外的所有点
描述边
以e()
为例说明如何对边进行描述:
e() // 任何边
e({@workAs}) // Schema为workAs的边
e({since == 2012}) // 属性since为2012的边
e({@workAs.since == 2012}) // Schema为workAs且属性since为2012的边
e(as b) // 任何一条边,并命名为b
e({@workAs} as b) // ...
...
与n()
类似,使用参数e()
对边进行描述时有以下特征:
e()
内不含花括号{}
或{}
内为空时,表示对边没有过滤条件- 过滤边的Schema时使用
@
符号 - 边的Schema和属性可以分开描述,也可以联合描述,联合描述时使用
.
符号连接 - 给满足要求的边定义别名时使用关键词
as
,且位于{}
(如有)之后
UQL中可以用来描述边的参数有:
edges()
:用于边的查找、更新和删除e()
:用于模板路径查询,表示路径中的某条或多条连续的边le()
:用于模板路径查询,类似于e()
但规定方向为左re()
:用于模板路径查询,类似于e()
但规定方向为右edge_filter()
:用于一般的路径查询,表示所有边
描述路径(模板)
使用n()
和e()
组合描述的路径称为模板:
// 任意一步路径
n().e().n()
// 任意两步路径
n().e().n().e().n()
n().e()[2].n()
// 由@Person-@workAs-@waiter点边组成的一步路径
// 为其中的@Person点定义别名individual,为这些路径定义别名career
n({@Person} as individual).e({@workAs}).n({@Job.title == "Waiter"}) as career
// 由Areith-@workAs-@Job-@workAs-@Person点边组成的两步路径
// 为其中的@Job点定义别名job,将末尾的@Person点定义别名other
n({@Person.name == "Areith"}).e({@workAs}).n({@Job} as job).e({@workAs}).n({@Person} as other)
...
路径模板的特征:
- 这是一种非常直观、形象的路径描述方式
- 路径中的某个点、某个边或整条路径都可以定义别名
图六中两个模板所描述的路径是否相同?嬴图中的路径是从左向右书写并解析的,这两个路径模板的点、边顺序不一致,因此不相同。但它们描述的是相同的图数据。