关于 YMatrix
部署数据库
使用数据库
管理集群
最佳实践
高级功能
高级查询
联邦查询
Grafana 监控
备份恢复
灾难恢复
图数据库
管理手册
性能调优
故障诊断
工具指南
系统配置参数
SQL 参考
MATCH 子句允许你指定查询将在数据库中搜索的模式。这是检索数据以在查询中使用的主要方式。
WHERE 子句通常跟在 MATCH 子句之后,用于向匹配的模式添加用户定义的限制条件,以操控返回的数据集。谓词是模式描述的一部分,不应被视为仅在匹配完成后才应用的过滤器。这意味着 WHERE 应始终与其所属的 MATCH 子句放在一起。
MATCH 可以出现在查询的开头或稍后的位置(可能在 WITH 之后)。如果它是第一个子句,则尚未绑定任何内容,Cypher 将设计搜索来查找与该子句及任何关联的 WHERE 子句中指定的谓词匹配的结果。通过此搜索找到的顶点和边可作为绑定的模式元素使用,并可用于子图的模式匹配。它们也可以在后续子句中使用,Cypher 将使用已知元素,并从中查找更多未知元素。
Cypher 是一种声明式语言,因此查询本身通常不指定执行搜索的算法。WHERE 部分中的谓词可以在模式匹配之前、期间或匹配找到之后进行评估。
通过指定包含单个顶点且无标签的模式,将返回图中的所有顶点。
查询
SELECT * FROM cypher('graph_name', $$
MATCH (v)
RETURN v
$$) as (v agtype);
返回数据库中的所有顶点。
| v |
|---|
| {id: 0; label: 'Person'; properties: {name: 'Charlie Sheen'}}::vertex |
| {id: 1; label: 'Person'; properties: {name: 'Martin Sheen'}}::vertex |
| {id: 2; label: 'Person'; properties: {name: 'Michael Douglas'}}::vertex |
| {id: 3; label: 'Person'; properties: {name: 'Oliver Stone'}}::vertex |
| {id: 4; label: 'Person'; properties: {name: 'Rob Reiner'}}::vertex |
| {id: 5; label: 'Movie'; properties: {name: 'Wall Street'}}::vertex |
| {id: 6; label: 'Movie'; properties: {title: 'The American President'}}::vertex |
| 返回 7 行 |
通过在顶点模式中指定标签来获取带有特定标签的所有顶点:
查询
SELECT * FROM cypher('graph_name', $$
MATCH (movie:Movie)
RETURN movie.title
$$) as (title agtype);
返回数据库中的所有电影。
| title |
|---|
| 'Wall Street' |
| 'The American President' |
| 返回 2 行 |
符号 -[]- 指定一条边,不指定边的类型或方向。
查询
SELECT * FROM cypher('graph_name', $$
MATCH (director {name: 'Oliver Stone'})-[]-(movie)
RETURN movie.title
$$) as (title agtype);
返回 'Oliver Stone' 导演的所有电影。
| title |
|---|
| 'Wall Street' |
| 返回 1 行 |
要在模式中对顶点添加标签约束,使用标签语法将其添加到模式中的顶点上。
查询
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Oliver Stone'})-[]-(movie:Movie)
RETURN movie.title
$$) as (title agtype);
返回与 Person 'Oliver' 连接的、标签为 Movie 的所有顶点。
| title |
|---|
| 'Wall Street' |
| 返回 1 行 |
要返回无向边,可以使用 -来指定无向边。
查询
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Oliver Stone'})-[]-(movie)
RETURN movie
$$) as (title agtype);
返回与Person 'Oliver' 连接的所有顶点。
| title |
|---|
| 'Wall Street' |
| 返回 1 行 |
要返回有向边,可以使用 -> 或 <- 来指定边的方向。
查询
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Oliver Stone'})-[]->(movie)
RETURN movie.title
$$) as (title agtype);
返回通过出边与 Person 'Oliver' 连接的所有顶点。
| title |
|---|
| 'Wall Street' |
| 返回 1 行 |
如果需要变量(用于过滤边的属性或返回边),请在要使用的边或顶点中指定变量。
查询
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Oliver Stone'})-[r]->(movie)
RETURN type(r)
$$) as (title agtype);
返回 'Oliver' 的每条出边的类型。
| title |
|---|
| 'DIRECTED' |
| 返回 1 行 |
当你知道要匹配的边标签时,可以使用冒号加边标签来指定。
查询
SELECT * FROM cypher('graph_name', $$
MATCH (:Movie {title: 'Wall Street'})<-[:ACTED_IN]-(actor)
RETURN actor.name
$$) as (actors_name agtype);
返回所有在 'Wall Street' 中 ACTED_IN(出演)的演员。
| actors_name |
|---|
| 'Charlie Sheen' |
| 'Martin Sheen' |
| 'Michael Douglas' |
| 返回 3 行 |
如果你想使用变量来保存边,并指定所需的边标签,可以同时指定两者。
查询
SELECT * FROM cypher('graph_name', $$
MATCH ({title: 'Wall Street'})<-[r:ACTED_IN]-(actor)
RETURN r.role
$$) as (role agtype);
返回 'Wall Street' 的 ACTED_IN 角色。
| role |
|---|
| 'Gordon Gekko' |
| 'Carl Fox' |
| 'Bud Fox' |
| 返回 3 行 |
边可以串联在一起以匹配无限数量的边。只要遵循基本模式 ()-[]-() ,用户就可以将边和顶点链接在一起以匹配特定模式。
查询
SELECT * FROM cypher('graph_name', $$
MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)
RETURN movie.title, director.name
$$) as (title agtype, name agtype);
返回 'Charlie Sheen' 出演的电影及其导演。
| title | name |
|---|---|
| 'Wall Street' | 'Oliver Stone' |
| 返回 1 行 |
当两个顶点之间的连接长度可变时,可以使用以下方式返回构成连接的边列表。
注意! 在 YMatrix AGE 中,只支持
(u)-[*]-(v)的类型。其它则不支持,例如
(u)-[*]-(v)-[]-()、(u)-[*]->(v)-[*]-()若使用,则报错:ERROR: variable-length relationships in paths are only supported for paths of length 3。- YMatrix AGE 同样不支持可变长度匹配引用变量,例如
MATCH(u) MATCH(u)-[*]-(v)若使用,则报错:ERROR: VLE paths cannot reference existing variables 此外,SQL 层面的age_vle()函数在 YMatrix AGE 中不可用,只能通过 Cypher VLE 语法(如(u)-[*1..3]->(v))进行可变长度路径匹配。
可以通过在模式的边描述中指定长度来描述多条边(及中间顶点),而不是使用一系列顶点和边描述来描述长路径。
(u)-[*2]->(v)
描述了一条包含三个顶点和两条边的右向路径,可以改写为:
(u)-[]->()-[]->(v)
也可以指定范围长度:
(u)-[*3..5]->(v)
等价于:
(u)-[]->()-[]->()-[]->(v) 和
(u)-[]->()-[]->()-[]->()-[]->(v) 和
(u)-[]->()-[]->()-[]->()-[]->()-[]->(v)
上面的示例为 u 和 v 之间的边(和顶点)数量提供了下限和上限。可以省略其中一个或两个边界值。
(u)-[*3..]->(v)
返回 u 和 v 之间包含三条或更多边的所有路径。
(u)-[*..5]->(v)
返回 u 和 v 之间包含 5 条或更少边的所有路径。
(u)-[*]->(v)
返回 u 和 v 之间的所有路径。
查询
SELECT * FROM cypher('graph_name', $$
MATCH p = (actor {name: 'Willam Dafoe'})-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)
$$) as (r agtype);
返回边的列表,包括 Willam Dafoe 出演的边以及与他合作的两位蜘蛛侠演员。
| r |
|---|
| [{id: 0; label:"ACTED_IN"; properties: {role: "Green Goblin"}}::edge, {id: 1; label: "ACTED_IN; properties: {role: "Spiderman", actor: "Toby Maguire}}::edge] |
| [{id: 0; label:"ACTED_IN"; properties: {role: "Green Goblin"}}::edge, {id: 2; label: "ACTED_IN; properties: {role: "Spiderman", actor: "Andrew Garfield"}}::edge] |
| 返回 2 行 |