模式¶
模式(pattern)和图模式匹配,是图查询语言的核心功能,本文介绍NebulaGraph设计的各种模式,部分还未实现。
单点模式¶
点用一对括号来描述,通常包含一个名称。例如:
(a)
示例为一个简单的模式,描述了单个点,并使用变量a
命名该点。
多点关联模式¶
多个点通过边相连是常见的结构,模式用箭头来描述两个点之间的边。例如:
(a)-[]->(b)
示例为一个简单的数据结构:两个点和一条连接两个点的边,两个点分别为a
和b
,边是有方向的,从a
到b
。
这种描述点和边的方式可以扩展到任意数量的点和边,例如:
(a)-[]->(b)<-[]-(c)
这样的一系列点和边称为路径
(path)。
只有在涉及某个点时,才需要命名这个点。如果不涉及这个点,则可以省略名称,例如:
(a)-[]->()<-[]-(c)
Tag 模式¶
Note
nGQL 中的Tag
概念与 openCypher 中的Label
有一些不同。例如,必须创建一个Tag
之后才能使用它,而且Tag
还定义了属性的类型。
模式除了简单地描述图中的点之外,还可以描述点的 Tag。例如:
(a:User)-[]->(b)
模式也可以描述有多个 Tag 的点,例如:
(a:User:Admin)-[]->(b)
属性模式¶
点和边是图的基本结构。nGQL 在这两种结构上都可以增加属性,方便实现更丰富的模型。
在模式中,属性的表示方式为:用花括号括起一些键值对,用英文逗号分隔,并且需要指定属性所属的 Tag 或者 Edge type。
例如一个点有两个属性:
(a:player{name: "Tim Duncan", age: 42})
在这个点上可以有一条边是:
(a)-[e:follow{degree: 95}]->(b)
边模式¶
描述一条边最简单的方法是使用箭头连接两个点。
可以用以下方式描述边以及它的方向性。如果不关心边的方向,可以省略箭头,例如:
(a)-[]-(b)
和点一样,边也可以命名。一对方括号用于分隔箭头,变量放在两者之间。例如:
(a)-[r]->(b)
和点上的 Tag 一样,边也可以有类型。描述边的类型,例如:
(a)-[r:REL_TYPE]->(b)
和点上的 Tag 不同,一条边只能有一种 Edge type。但是如果我们想描述多个可选 Edge type,可以用管道符号(|)将可选值分开,例如:
(a)-[r:TYPE1|TYPE2]->(b)
和点一样,边的名称可以省略,例如:
(a)-[:REL_TYPE]->(b)
变长模式¶
在图中指定边的长度来描述多条边(以及中间的点)组成的一条长路径,不需要使用多个点和边来描述。例如:
(a)-[*2]->(b)
该模式描述了 3 点 2 边组成的图,它们都在一条路径上(长度为 2),等价于:
(a)-[]->()-[]->(b)
也可以指定长度范围,这样的边模式称为variable-length edges
,例如:
(a)-[*3..5]->(b)
*3..5
表示最小长度为 3,最大长度为 5。
该模式描述了 4 点 3 边、5 点 4 边或 6 点 5 边组成的图。
也可以忽略最小长度,只指定最大长度,例如:
(a)-[*..5]->(b)
Note
必须指定最大长度,不支持仅指定最小长度((a)-[*3..]->(b)
)或都不指定((a)-[*]->(b)
)。
路径变量¶
一系列连接的点和边称为路径
。nGQL 允许使用变量来命名路径,例如:
p = (a)-[*3..5]->(b)
可以在 MATCH 语句中使用路径变量。