Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/match/ Documentation version: v5.3.2 # MATCH `MATCH`语句通过模式匹配从图或临时图中检索数据。 Note 普通`MATCH`通常通过`RETURN`返回查询结果,在悦数图数据库开发版中既支持持久化图,也支持临时图。它不同于使用`MATCH ... PER PATH`或`MATCH ... PER NODE`执行迭代计算的[匹配计算语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/match-compute/),后者只能在临时图上运行。 Note 对非默认 Schema 或其中的对象执行操作时,用户既要通过隐式访问规则或显式`USAGE`授权获得该 Schema 的访问权,也要具备目标操作所需的权限。Schema 访问校验和目标操作所需的权限校验相互独立,满足其中一项不能替代另一项。Schema 访问控制不适用于临时图、内置 Procedure 和内置 Function。更多信息,请参见 [Schema 访问控制](https://dev-docs.yueshu.com.cn/v5.3.2/server-admin/authorization/schema-access-control/)。 ## 前提条件 - 已创建图或临时图。更多信息,请参见 [CREATE GRAPH](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph/create/) 和 [CREATE TEMPORARY GRAPH](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-projection/create/)。 - 若要检索图中的数据,须具备在当前 Schema 执行`MATCH ANY GRAPH`操作的权限,或具备在当前图中执行`MATCH`操作的权限。更多信息,请参见[角色与权限](https://dev-docs.yueshu.com.cn/v5.3.2/server-admin/authorization/)。 - 若要检索临时图中的数据,必须是具备角色`ADMIN`的用户或临时图的所有者。 ## 语法 语法图源码 match_statement graph_pattern match_mode path_pattern path_mode_prefix path_search_prefix path_term path_factor parenthesized_path_pattern element_pattern graph_pattern_yield_clause ```` match_statement ::= ( 'OPTIONAL' )? 'MATCH' graph_pattern graph_pattern_yield_clause? graph_pattern ::= match_mode? path_pattern ( ',' path_pattern )* ( 'WHERE' search_condition )? match_mode ::= 'REPEATABLE' ('ELEMENTS' | 'ELEMENT' 'BINDINGS'?) | 'DIFFERENT' ( ('EDGE' | 'RELATIONSHIP') 'BINDINGS'? | ('EDGES' | 'RELATIONSHIPS') ) path_pattern ::= ( path_variable '=' )? ( path_mode_prefix | path_search_prefix )? path_term path_mode_prefix ::= ( 'WALK' | 'TRAIL' | 'ACYCLIC' | 'SIMPLE' ) ( 'PATH' | 'PATHS' )? path_search_prefix ::= 'ALL' ( 'WALK' | 'TRAIL' | 'ACYCLIC' | 'SIMPLE' )? ( 'PATH' | 'PATHS' )? | 'ANY' ( number_of_paths )? ( 'WALK' | 'TRAIL' | 'ACYCLIC' | 'SIMPLE')? ( 'PATH' | 'PATHS' )? | 'ALL SHORTEST' ( 'WALK' | 'TRAIL' | 'ACYCLIC' | 'SIMPLE' )? ( 'PATH' | 'PATHS' )? | 'ANY SHORTEST' ( 'WALK' | 'TRAIL' | 'ACYCLIC' | 'SIMPLE')? ( 'PATH' | 'PATHS' )? | 'SHORTEST' number_of_paths ( 'WALK' | 'TRAIL' | 'ACYCLIC' | 'SIMPLE' )? ( 'PATH' | 'PATHS' )? path_term ::= path_factor path_factor* path_factor ::= element_pattern index_hint? | edge_pattern index_hint? graph_pattern_quantifier | parenthesized_path_pattern graph_pattern_quantifier parenthesized_path_pattern ::= '(' ( path_variable '=' )? path_mode_prefix? path_term ( 'WHERE' search_condition )? ')' element_pattern ::= node_pattern | edge_pattern graph_pattern_yield_clause ::= 'YIELD' ( element_variable_reference | path_variable_reference) ( ',' (element_variable_reference | path_variable_reference) )* ```` ## 参数 ### `OPTIONAL` 当使用关键字`OPTIONAL`时,即使图模式没有找到匹配项,查询仍会返回`null`作为其结果,查询会继续返回其他子句中可能匹配到的数据。否则,匹配语句将不返回任何数据。 ### `match_mode` 匹配类型,用于限制路径模式匹配到的路径中是否可以出现重复边。支持以下匹配类型: - `REPEATABLE`:如果匹配类型以关键字`REPEATABLE`开头,则路径模式匹配到的路径中可以出现重复边和重复点。这是默认的匹配类型。 - `DIFFERENT`:如果匹配类型以关键字`DIFFERENT`开头,则路径模式匹配到的路径中不可以出现重复边。 ### `path_variable` 表示路径的变量。更多信息,请参见[变量表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/binding-variable/)。 ### `WALK | TRAIL | SIMPLE | ACYCLIC` 在路径匹配期间过滤路径的路径类型。支持以下路径类型: - `WALK`:匹配任何类型的路径,无论是否有重复的边或点。这是默认的路径类型。 - `TRAIL`:匹配不包含重复边的路径。 - `ACYCLIC`:匹配不包含重复点的路径。 - `SIMPLE`:匹配除起始点外,不包含重复点的路径。 Note 如果匹配类型以关键字`DIFFERENT`开头且路径类型设置为`WALK`或未设置,则实际生效的路径类型为`TRAIL`。 ### `PATH | PATHS` 每种路径类型都有一个可选的后缀:`PATH`或`PATHS`,用于声明这是路径。 ### `ALL | ANY | ALL SHORTEST | ANY SHORTEST` 在路径匹配期间可以选择性地过滤路径的数量。支持通过以下关键字选择路径的数量: - `ALL`:默认选项,选择所有匹配模式的路径。 - `ANY`:选择任意一条或多个匹配模式的路径。您可以添加一个非负整数(`number_of_paths`)来指定返回的最大路径数。 - `ALL SHORTEST`:选择所有匹配模式的最短路径。 - `ANY SHORTEST`:选择任意一条匹配模式的最短路径。 - `SHORTEST`:选择任意一条或者多个最短路径。您可以添加一个非负整数(`number_of_paths`)来指定返回的最大的最短路径数。 ### `number_of_paths` 要返回的最大路径数。默认值为`1`。必须是非负整数。 ### `element_pattern` 要匹配的元素模式,可以是点模式或边模式。 #### `node_pattern` 要匹配的点模式。更多信息,请参见[点模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/node-patterns/)。 #### `edge_pattern` 要匹配的边模式。更多信息,请参见[边模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/edge-patterns/)。 ### `index_hint` 为查询优化器在执行查询时提供索引使用建议的索引提示。更多信息,请参见[索引提示](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/executions/hints/)。 ### `graph_pattern_quantifier` 匹配边模式次数的上下限。 支持以下格式: - `{lower_bound, upper_bound}`:上下限都是可选的量词。如果未指定`lower_bound`,默认值为`0`。如果未指定`upper_bound`,默认值为无限大。 - `{fixed_number}`:固定量词,取值必须是大于 0 的整数。表示相同的上下限。例如,`{2}`等于`{2,2}`。 - `*`:等价于`{0,}`,表示 0 次或更多次的匹配。 - `+`:等价于`{1,}`,表示 1 次或更多次的匹配。 ### `search_condition` 从上一个语句中提取子数据集的布尔值表达式。更多信息,请参见 [WHERE 子句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/clauses/where/)。 在以下场景中使用时,`search_condition`不得包含[子查询表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/subquery/): - `edge_pattern`后跟`graph_pattern_quantifier`。例如,不支持`-[e WHERE EXISTS ((b)-[:KNOWS]->())]->{1,3}`。 - `parenthesized_path_pattern`后跟`graph_pattern_quantifier`。例如,不支持`((a)-[e]->(b) WHERE EXISTS ((b)-[:KNOWS]->())){1,2}`。 ### `element_variable_reference` 表示图元素的变量名称。 ### `path_variable_reference` 表示路径的变量名称。 ## 使用元素类型查询与使用标签查询的区别 在 GQL 的`MATCH`模式中,可以使用`@类型名`按点类型或边类型匹配,也可以按标签匹配。 `@类型名`用于按图类型中的结构类型做精确匹配,标签查询用于按语义标签做跨类型筛选。 需要注意标签语法的上下文差异: - 在模式中使用标签表达式时,写法通常为`(v:Person)`、`(v IS Person)`或`[e:Act]`。 - 在`WHERE`子句中按标签过滤时,完整写法通常为`WHERE v IS LABELED Person`;也可以使用冒号简写,例如`WHERE e:Act`。 关于两者的详细区别、返回范围差异以及适用场景,请参见[图模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/#标签表达式-vs-类型指定)。 ### 在标签和元素类型中使用变量 在`MATCH`语句的模式中,标签和元素类型可以通过字面名称或字符串变量来指定。 若变量的值在查询规划阶段即可确定,优化器将其等同于字面量进行处理。仅执行时能获取变量值时,标签与元素类型检查将延迟至运行时处理。 在模式中使用的变量必须为一个有效的标签或元素类型名称的字符串。 ## 示例 以下示例基于[示例数据集](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/example-dataset/)。 Caution 当图中存储大量数据时,应尽可能详细地提供搜索条件或使用`LIMIT`限制返回结果的数量。否则,执行可能会导致内存溢出( OOM)。 ### 用点模式匹配 以下示例展示如何使用点模式进行匹配。更多信息,请参见[点模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/node-patterns/)。 #### 用点变量匹配点 ```` ''' USE movie MATCH (v) RETURN v LIMIT 5 ''' ```` 上述语句查询图中的所有点,并使用`LIMIT`子句返回最多 5 个点,以避免 OOM。 返回: ```` +---------------------------------------------------------------------------------------------+ | v | +---------------------------------------------------------------------------------------------+ | (288540739078455297@Director:Person{birthDate:1965-05-23,id:1071,name:"Tom Tykwer"}) | | (288543470677655553@Director:Person{birthDate:1968-09-10,id:956,name:"Guy Ritchie"}) | | (288544205117063169@Director:Person{birthDate:1925-05-25,id:1961,name:"Claude Pinoteau"}) | | (288544797822550018@Director:Person{birthDate:1941-03-14,id:5231,name:"Wolfgang Petersen"}) | | (288544845067190274@Director:Person{birthDate:1944-05-14,id:1,name:"George Lucas"}) | +---------------------------------------------------------------------------------------------+ ```` #### 用单个标签匹配点 ```` ''' USE movie MATCH (v:Person) RETURN v LIMIT 5 ''' ```` 上述语句查询图中带标签`Person`的点。 返回: ```` +------------------------------------------+ | v | +------------------------------------------+ | (288907520695599107@User:Person{id:267}) | | (288908057566511106@User:Person{id:262}) | | (288911003914076161@User:Person{id:392}) | | (288911467770544130@User:Person{id:557}) | | (288912447023087619@User:Person{id:100}) | +------------------------------------------+ ```` #### 用多个标签匹配点 可以使用标签表达式中的“或者”运算符(`|`)或“并且”运算符(`&`)来匹配具有多个标签之一或同时具有多个标签的点。更多信息,请参见[标签表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/label/)。 以下示例匹配标签为`Person`或`Movie`的点: ```` ''' USE movie MATCH (v:Person|Movie) RETURN v.name AS name ORDER BY name LIMIT 5 ''' ```` 返回: ```` +-----------------------+ | name | +-----------------------+ | Bridget Jones' Diary | | 001 | | 12 Monkeys | | 7 (seven) Virgins | | 8 1⁄2 | +-----------------------+ ```` 以下示例匹配同时具有标签`Person`和`Movie`的点: ```` ''' USE movie MATCH (v:Person&Movie) RETURN v.name AS name LIMIT 5 ''' ```` 返回: ```` Error: [NS239]: No element type matching pattern `(v:(Person) & (Movie))` was found ```` 由于该数据集中没有同时具有两个标签的点,因此没有返回结果。 也可以使用取反运算符(`!`)排除某个标签: ```` ''' USE movie MATCH (v:Person&!Movie) RETURN v.name AS name ORDER BY name LIMIT 5 ''' ```` 返回: ```` +------------------+ | name | +------------------+ | Aaron Eckhart | | Ada Lonati | | Adam Alexi-Malle | | Adam Baldwin | | Adam Bousdoukos | +------------------+ ```` #### 用变量标签匹配点 ```` ''' USE movie { VALUE s = "Person" MATCH (v:s) WHERE v.id = 1 RETURN v.id, type(v) } ''' ```` 返回: ```` +------+----------+ | v.id | type(v) | +------+----------+ | 1 | Director | | 1 | User | +------+----------+ ```` #### 用标签和搜索条件匹配点 ```` ''' USE movie MATCH (v:Person) WHERE v.birthDate > date("1990-01-20") RETURN v LIMIT 5 ''' ```` 上述语句查询图中带标签`Person`且出生日期晚于`1990-01-20`的点。 返回: ```` +--------------------------------------------------------------------------------------------+ | v | +--------------------------------------------------------------------------------------------+ | (288306491562131457@Actor:Person{birthDate:1993-05-19,id:19593,name:"Ryunosuke Kamiki"}) | | (288271934255267841@Actor:Person{birthDate:1992-11-30,id:247365,name:"Dylan Smith"}) | | (288374798722007041@Actor:Person{birthDate:1990-04-15,id:10990,name:"Emma Watson"}) | | (288375481621807106@Actor:Person{birthDate:1991-11-13,id:91842,name:"Devon Bostick"}) | | (288381722209288193@Actor:Person{birthDate:1990-11-07,id:1608,name:"Nacho Pérez"}) | +--------------------------------------------------------------------------------------------+ ```` #### 用点属性匹配点 ```` ''' USE movie MATCH (v {id:199}) RETURN v ''' ```` 上述语句查询图中`id`为`199`的点。 返回: ```` +------------------------------------------------------------------------------------+ | v | +------------------------------------------------------------------------------------+ | (288269194066132994@Actor:Person{birthDate:1951-09-07,id:199,name:"Julie Kavner"}) | | (288832144019554307@User:Person{id:199}) | | (289113618996264961@Movie:Movie{id:199,name:"Star Trek: First Contact"}) | +------------------------------------------------------------------------------------+ ```` #### 用单个点类型匹配点 ```` ''' USE movie MATCH (v@Actor) RETURN v LIMIT 5 ''' ```` 上述语句查询图中点类型为`Actor`的点。 返回: ```` +--------------------------------------------------------------------------------------+ | v | +--------------------------------------------------------------------------------------+ | (288455711610896385@Actor:Person{birthDate:1952-07-11,id:74614,name:"Tim De Zarn"}) | | (288455758855536641@Actor:Person{birthDate:1994-02-10,id:2139,name:"Makenzie Vega"}) | | (288455810395144193@Actor:Person{birthDate:null,id:16219,name:"Cedric Scott"}) | | (288455973603901441@Actor:Person{birthDate:null,id:47547,name:"John Bennett"}) | | (288455982193836033@Actor:Person{birthDate:1956-01-16,id:1566,name:"Anders Hove"}) | +--------------------------------------------------------------------------------------+ ```` #### 用多个点类型匹配点 ```` ''' USE movie MATCH (v@[Actor,Director]) RETURN v LIMIT 5 ''' ```` 上述语句从图中查询点类型为`Actor`或`Director`的点,并随机返回 5 个点。 返回: ```` +------------------------------------------------------------------------------------------------------+ | v | +------------------------------------------------------------------------------------------------------+ | (288710325862137857@Director:Person{birthDate:1969-02-12,id:6431,name:"Darren Aronofsky"}) | | (288710433236320257@Director:Person{birthDate:1963-08-15,id:223,name:"Alejandro González Iñárritu"}) | | (288713401058721793@Director:Person{birthDate:1957-12-29,id:7832,name:"Oliver Hirschbiegel"}) | | (288715978039099394@Director:Person{birthDate:1952-05-14,id:24,name:"Robert Zemeckis"}) | | (288717240759484417@Director:Person{birthDate:1864-10-05,id:1868,name:"Louis Lumière"}) | +------------------------------------------------------------------------------------------------------+ ```` #### 用变量点类型匹配点 ```` ''' USE movie { VALUE s = "Director" MATCH (v@[s,"User"]) WHERE v.id = 1 RETURN v.id, type(v) } ''' ```` 返回: ```` +------+----------+ | v.id | type(v) | +------+----------+ | 1 | Director | | 1 | User | +------+----------+ ```` #### 使用前序查询结果作为点类型 ```` """ USE movie { MATCH (v:Person {id:1}) RETURN type(v) AS t NEXT MATCH (v@t {id:1}) RETURN type(v) } """ ```` 返回: ```` +----------+ | type(v) | +----------+ | Director | | User | +----------+ ```` ### 用边模式匹配 以下示例展示如何使用边模式进行匹配。更多信息,请参见[边模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/edge-patterns/)。 #### 用边变量匹配边 ```` ''' USE movie MATCH ()-[e]->() RETURN e LIMIT 5 ''' ```` 上述语句检索图中 5 条随机边。 返回: ```` +----------------------------------------------------------+ | e | +----------------------------------------------------------+ | (288483723387600897)-[0@Act:Act{}]->(289086826990272513) | | (288483766337273857)-[0@Act:Act{}]->(289272773304385537) | | (288483792107077633)-[0@Act:Act{}]->(289317990720077825) | | (288483860826554369)-[0@Act:Act{}]->(289285894429474817) | | (288483865121521665)-[0@Act:Act{}]->(289150834887884801) | +----------------------------------------------------------+ ```` #### 用标签匹配的边 ```` ''' USE movie MATCH ()-[e:Act]->() RETURN e LIMIT 5 ''' ```` 上述语句查询图中带标签`Act`的边。 返回: ```` +----------------------------------------------------------+ | e | +----------------------------------------------------------+ | (288483723387600897)-[0@Act:Act{}]->(289086826990272513) | | (288483766337273857)-[0@Act:Act{}]->(289272773304385537) | | (288483792107077633)-[0@Act:Act{}]->(289317990720077825) | | (288483860826554369)-[0@Act:Act{}]->(289285894429474817) | | (288483865121521665)-[0@Act:Act{}]->(289150834887884801) | +----------------------------------------------------------+ ```` #### 用多个标签匹配边 可以使用标签表达式中的“或者”运算符(`|`)来匹配具有多个标签之一的边。更多信息,请参见[标签表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/label/)。 以下示例匹配标签为`Act`或`Direct`的边: ```` ''' USE movie MATCH ()-[e:Act|Direct]->() RETURN e LIMIT 5 ''' ```` 返回: ```` +----------------------------------------------------------+ | e | +----------------------------------------------------------+ | (288483723387600897)-[0@Act:Act{}]->(289086826990272513) | | (288483766337273857)-[0@Act:Act{}]->(289272773304385537) | | (288483792107077633)-[0@Act:Act{}]->(289317990720077825) | | (288483860826554369)-[0@Act:Act{}]->(289285894429474817) | | (288483865121521665)-[0@Act:Act{}]->(289150834887884801) | +----------------------------------------------------------+ ```` 也可以使用取反运算符(`!`)排除某个标签: ```` ''' USE movie MATCH ()-[e:!Act]->() RETURN e LIMIT 5 ''' ```` 返回: ```` +----------------------------------------------------------------------+ | e | +----------------------------------------------------------------------+ | (289047300406247427)-[0@Watch:Watch{rate:4.0}]->(289108623949299713) | | (289047300406247427)-[0@Watch:Watch{rate:1.0}]->(289138379482726401) | | (288710325862137857)-[0@Direct:Direct{}]->(289222513597087745) | | (288710433236320257)-[0@Direct:Direct{}]->(289182609055940609) | | (288713401058721793)-[0@Direct:Direct{}]->(289136996503257089) | +----------------------------------------------------------------------+ ```` Note 标签表达式语法(`:Act|Direct`)和类型指定语法(`@[Act,Direct]`)都可以过滤多种类型,但工作方式不同。标签表达式按标签过滤,支持`|`、`&`和`!`运算符。类型指定按元素类型过滤。更多详情,请参见[标签表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/label/)和[边模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/edge-patterns/)。 #### 用变量标签匹配边 ```` ''' USE movie { VALUE et = "Direct" MATCH (src:Person)-[e:et]->(dst) WHERE src.id = 1 RETURN type(src), type(e), type(dst) } ''' ```` 返回: ```` +-----------+---------+-----------+ | type(src) | type(e) | type(dst) | +-----------+---------+-----------+ | Director | Direct | Movie | +-----------+---------+-----------+ ```` #### 用标签和搜索条件的匹配边 ```` ''' USE movie MATCH ()-[e:Watch]->() WHERE e.rate > 4 RETURN e, e.rate AS rate ORDER BY rate LIMIT 3 ''' ```` 上述语句查询图中带标签`Watch`且评分大于`4`的边。 返回: ```` +----------------------------------------------------------------------+------+ | e | rate | +----------------------------------------------------------------------+------+ | (288905240067964929)-[0@Watch:Watch{rate:4.5}]->(289222513597087745) | 4.5 | | (288904325239930881)-[0@Watch:Watch{rate:4.5}]->(289217037513785345) | 4.5 | | (288902753281900548)-[0@Watch:Watch{rate:4.5}]->(289219219357171713) | 4.5 | +----------------------------------------------------------------------+------+ ```` #### 用边属性匹配边 ```` ''' USE movie MATCH ()-[e {rate: 4}]->() RETURN e LIMIT 5 ''' ```` 上述语句查询图中评分为`4`的边。 返回: ```` +----------------------------------------------------------------------+ | e | +----------------------------------------------------------------------+ | (288990422154346498)-[0@Watch:Watch{rate:4.0}]->(289113618996264961) | | (288990585363103745)-[0@Watch:Watch{rate:4.0}]->(289159802779598849) | | (288990585363103745)-[0@Watch:Watch{rate:4.0}]->(289222513597087745) | | (288991908213030914)-[0@Watch:Watch{rate:4.0}]->(289217037513785345) | | (288992135846297601)-[0@Watch:Watch{rate:4.0}]->(289315302070550529) | +----------------------------------------------------------------------+ ```` #### 用单个边类型匹配边 ```` ''' USE movie MATCH ()-[e@Watch]->() RETURN e LIMIT 5 ''' ```` 上述语句查询图中边类型为`Watch`的边。 返回: ```` +----------------------------------------------------------------------+ | e | +----------------------------------------------------------------------+ | (288990422154346498)-[0@Watch:Watch{rate:4.0}]->(289113618996264961) | | (288990422154346498)-[0@Watch:Watch{rate:5.0}]->(289158106267516929) | | (288990422154346498)-[0@Watch:Watch{rate:5.0}]->(289169659729543169) | | (288990585363103745)-[0@Watch:Watch{rate:4.0}]->(289159802779598849) | | (288990585363103745)-[0@Watch:Watch{rate:4.0}]->(289222513597087745) | +----------------------------------------------------------------------+ ```` #### 用变量边类型匹配边 ```` ''' USE movie { VALUE et = "Direct" MATCH (src:Person)-[e@et]->(dst) WHERE src.id = 1 RETURN type(src), type(e), type(dst) } ''' ```` 返回: ```` +-----------+---------+-----------+ | type(src) | type(e) | type(dst) | +-----------+---------+-----------+ | Director | Direct | Movie | +-----------+---------+-----------+ ```` #### 用多个边类型匹配边 ```` ''' USE movie MATCH ()-[e@[Direct,Watch]]->() RETURN e LIMIT 5 ''' ```` 上述语句从图中查询边类型为`Direct`或`Watch`的边,并随机返回 5 条边。 返回: ```` +----------------------------------------------------------------+ | e | +----------------------------------------------------------------+ | (288710325862137857)-[0@Direct:Direct{}]->(289222513597087745) | | (288710433236320257)-[0@Direct:Direct{}]->(289182609055940609) | | (288713401058721793)-[0@Direct:Direct{}]->(289136996503257089) | | (288713401058721793)-[0@Direct:Direct{}]->(289194725158682625) | | (288715978039099394)-[0@Direct:Direct{}]->(289278923697553409) | +----------------------------------------------------------------+ ```` #### 匹配入边 模式中的边可以有方向,例如`(a:Movie)<-[e:Direct]-(b:Director)`,其中`e`是点`a`的入边,`e`是点`b`的出边。 ```` ''' USE movie MATCH (a:Genre)<-[e:WithGenre]-(b:Movie) RETURN a LIMIT 3 ''' ```` 返回: ```` +-----------------------------------------------------------------+ | a | +-----------------------------------------------------------------+ | (289405968830169091@Genre:Genre{id:127,name:"Marital Tragedy"}) | | (289405968830169091@Genre:Genre{id:127,name:"Marital Tragedy"}) | | (289405968830169091@Genre:Genre{id:127,name:"Marital Tragedy"}) | +-----------------------------------------------------------------+ ```` #### 匹配无向边 边也可以没有方向,表示对称关系。 ```` ''' USE movie MATCH (a:Person)~[e:Act]~(b:Movie) RETURN e LIMIT 3 ''' ```` 返回: ```` Error: [NS239]: No element type matching pattern `~[e:Act]~` was found ```` 由于图中没有无向边,返回报错。 #### 匹配无向边和入边 ```` ''' USE movie MATCH (a:Genre)<~[e:WithGenre]~(b:Movie) RETURN a,b LIMIT 3 ''' ```` 返回: ```` +------------------------------------------------------------------------+---------------------------------------------------------------------+ | a | b | +------------------------------------------------------------------------+---------------------------------------------------------------------+ | (289559539680804865@Genre:Genre{id:10214,name:Exciting}) | (289085370996359169@Movie:Movie{id:130,name:"Tales from Earthsea"}) | | (289566566247301122@Genre:Genre{id:34,name:"Japanese Animation Film"}) | (289085370996359169@Movie:Movie{id:130,name:"Tales from Earthsea"}) | | (289587822040449025@Genre:Genre{id:10223,name:Serious}) | (289085370996359169@Movie:Movie{id:130,name:"Tales from Earthsea"}) | +------------------------------------------------------------------------+---------------------------------------------------------------------+ ```` #### 匹配出边和入边 ```` ''' USE movie MATCH (a:Movie)<-[e]->(b) RETURN a,b,e LIMIT 3 ''' ```` 返回: ```` +-----------------------------------------------------------------+--------------------------------------------------------------------------------------------+----------------------------------------------------------------+ | a | b | e | +-----------------------------------------------------------------+--------------------------------------------------------------------------------------------+----------------------------------------------------------------+ | (289254734441742337@Movie:Movie{id:618,name:"The Clansman,"}) | (288657437634854913@Director:Person{birthDate:1875-01-22,id:8812,name:"D. W. Griffith"}) | (288657437634854913)-[0@Direct:Direct{}]->(289254734441742337) | | (289111664786145281@Movie:Movie{id:662,name:"The Pier"}) | (288675751375405057@Director:Person{birthDate:1921-07-29,id:9956,name:"Chris Marker"}) | (288675751375405057)-[0@Direct:Direct{}]->(289111664786145281) | | (289309246166663169@Movie:Movie{id:155,name:"Batman Begins 2"}) | (288655693878132737@Director:Person{birthDate:1970-07-30,id:525,name:"Christopher Nolan"}) | (288655693878132737)-[0@Direct:Direct{}]->(289309246166663169) | +-----------------------------------------------------------------+--------------------------------------------------------------------------------------------+----------------------------------------------------------------+ ```` #### 匹配任意方向的边 任意方向的边模式匹配任意方向的边,包括入边、出边和无向边。 ```` ''' USE movie MATCH (a:Movie)-[e]-(b) RETURN e,a,b LIMIT 3 ''' ```` 返回: ```` +----------------------------------------------------------------+--------------------------------------------------------------------+------------------------------------------------------------------------------------------------+ | e | a | b | +----------------------------------------------------------------+--------------------------------------------------------------------+------------------------------------------------------------------------------------------------+ | (288573432369512449)-[0@Direct:Direct{}]->(289195390878613505) | (289195390878613505@Movie:Movie{id:364,name:"Batman 2"}) | (288573432369512449@Director:Person{birthDate:1958-08-25,id:510,name:"Tim Burton"}) | | (288574192578723841)-[0@Direct:Direct{}]->(289271897131057153) | (289271897131057153@Movie:Movie{id:572,name:"Next Door"}) | (288574192578723841@Director:Person{birthDate:null,id:7736,name:"Pål Sletaune"}) | | (288573896225980417)-[0@Direct:Direct{}]->(289210736796762113) | (289210736796762113@Movie:Movie{id:139,name:"Mifune's Last Song"}) | (288573896225980417@Director:Person{birthDate:1947-03-02,id:1558,name:"Søren Kragh-Jacobsen"}) | +----------------------------------------------------------------+--------------------------------------------------------------------+------------------------------------------------------------------------------------------------+ ```` #### 用量化边模式匹配变长路径 []() 边模式可以添加图模式量词(`graph_pattern_quantifier`),从而匹配变长路径。 ```` ''' USE movie MATCH (a{id:1})-[e]->{1,2}(b:Genre) RETURN labels(a) ''' ```` 上述查询从`id`为`1`的点出发,经过 1 到 2 跳后,抵达带有标签`Genre`的点,并返回起始点的标签。 返回: ```` +-----------+ | labels(a) | +-----------+ | [Person] | | [Person] | | [Movie] | ... +-----------+ Got 126 rows (time spent 6.815ms/7.647592ms) ```` 除此之外,也可以使用[量化路径模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/match/#match_by_quantified_path_patterns)匹配变长路径。更多信息,请参见[变长路径模式表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/path-patterns/#_6)。 ### 通过路径模式匹配 点模式和边模式可以组合成路径模式,以下示例展示如何使用路径模式进行匹配。更多信息,请参见[路径模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/path-patterns/)。 #### 匹配简单路径并返回点 ```` ''' USE movie MATCH (v1)-[e:Watch]->(v2) RETURN v1,v2 LIMIT 3 ''' ```` 上述语句查询图中两个点之间包含标签`Watch`的边的路径,并返回路径中的两个点。 返回: ```` +------------------------------------------+----------------------------------------------------+ | v1 | v2 | +------------------------------------------+----------------------------------------------------+ | (288891079560790018@User:Person{id:154}) | (289212480553484289@Movie:Movie{id:601,name:E.T.}) | | (288889636451778562@User:Person{id:390}) | (289212480553484289@Movie:Movie{id:601,name:E.T.}) | | (288880982092677121@User:Person{id:41}) | (289212480553484289@Movie:Movie{id:601,name:E.T.}) | +------------------------------------------+----------------------------------------------------+ ```` #### 匹配复杂路径并返回点 ```` ''' USE movie MATCH (v1)-[e1]->(v2)-[e2]->(v3:Genre) RETURN v3 LIMIT 5 ''' ```` 上述语句查询一个复杂的路径模式,该模式由三个点和两条边组成,最后一个点带有标签`Genre`,并返回最后一个点。 返回: ```` +--------------------------------------------------------+ | v3 | +--------------------------------------------------------+ | (289457800495497219@Genre:Genre{id:16,name:Animation}) | | (289457800495497219@Genre:Genre{id:16,name:Animation}) | | (289457800495497219@Genre:Genre{id:16,name:Animation}) | | (289457800495497219@Genre:Genre{id:16,name:Animation}) | | (289457800495497219@Genre:Genre{id:16,name:Animation}) | +--------------------------------------------------------+ ```` #### 用量化路径模式匹配变长路径 []() 路径模式可以添加图模式量词(`graph_pattern_quantifier`),从而匹配变长路径。下例返回的结果与示例[用量化边模式匹配](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/match/#match_by_quantified_edge_patterns)的结果相同。 ```` ''' USE movie MATCH (a{id:1})(()-[e]->()){1,2}(b:Genre) RETURN labels(a) ''' ```` 返回: ```` +-----------+ | labels(a) | +-----------+ | [Movie] | | [Person] | | [Person] | ... +-----------+ Got 126 rows (time spent 7.973ms/8.821899ms) ```` #### 匹配变长路径并返回路径 如果需要返回路径,可以为路径模式声明一个变量并在`RETURN`语句中返回它。 Note 在下例中,`n`代表包含路径起始点`a`的点列表,`m`代表包含路径目标点`b`的点列表。 ```` ''' USE movie MATCH p = (a{id:1})((n)-[e]->(m WHERE m.id > 1000)){1,2}(b:Genre) RETURN p ''' ```` 上述语句声明了一个名为`p`的路径模式并返回它。 返回: ```` +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | p | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | (289107795020611585@Movie:Movie{id:1,name:Cowboy Bebop})-[0@WithGenre:WithGenre{}]->(289517113993854978@Genre:Genre{id:1037,name:Realism}) | | (289107795020611585@Movie:Movie{id:1,name:Cowboy Bebop})-[0@WithGenre:WithGenre{}]->(289517672339603457@Genre:Genre{id:10215,name:Thrilling}) | | (289107795020611585@Movie:Movie{id:1,name:Cowboy Bebop})-[0@WithGenre:WithGenre{}]->(289361829451268098@Genre:Genre{id:1505,name:Famous Score}) | | (289107795020611585@Movie:Movie{id:1,name:Cowboy Bebop})-[0@WithGenre:WithGenre{}]->(289374843202174977@Genre:Genre{id:1110,name:Classic}) | | (289107795020611585@Movie:Movie{id:1,name:Cowboy Bebop})-[0@WithGenre:WithGenre{}]->(289383519036112897@Genre:Genre{id:1119,name:Episode Film}) | | (288826320043900931@User:Person{id:1})-[0@Watch:Watch{rate:5.0}]->(289211982337277953@Movie:Movie{id:10004,name:movie2})-[0@WithGenre:WithGenre{}]->(289449824741228545@Genre:Genre{id:11003,name:genre3}) | | (289107795020611585@Movie:Movie{id:1,name:Cowboy Bebop})-[0@WithGenre:WithGenre{}]->(289465634515845121@Genre:Genre{id:1033,name:Traumsequenz}) | | (289107795020611585@Movie:Movie{id:1,name:Cowboy Bebop})-[0@WithGenre:WithGenre{}]->(289468834266480642@Genre:Genre{id:10224,name:Sad}) | | (289107795020611585@Movie:Movie{id:1,name:Cowboy Bebop})-[0@WithGenre:WithGenre{}]->(289528487067254785@Genre:Genre{id:10216,name:Funny}) | | (289107795020611585@Movie:Movie{id:1,name:Cowboy Bebop})-[0@WithGenre:WithGenre{}]->(289529470614765570@Genre:Genre{id:3167,name:TV Film}) | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ```` #### 指定路径类型 TRAIL 匹配不含重复边的路径 当指定路径类型为`TRAIL`时,返回的路径中不包含重复边。 ```` ''' USE movie MATCH p = TRAIL (a@Actor)-[e:Act]->{1,3}(b:Movie) RETURN p LIMIT 3 ''' ```` 上述语句匹配一个可变长度的路径模式,并过滤掉重复的边。 返回: ```` +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | p | +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | (288242801492099073@Actor:Person{birthDate:1971-09-02,id:5860,name:Stephan Grossmann})-[0@Act:Act{}]->(289254790276317185@Movie:Movie{id:434,name:Tough Enough}) | | (288234568039792641@Actor:Person{birthDate:null,id:48481,name:Fabian Krüger})-[0@Act:Act{}]->(289254790276317185@Movie:Movie{id:434,name:Tough Enough}) | | (288257142387900417@Actor:Person{birthDate:null,id:5857,name:Peter Bucksch})-[0@Act:Act{}]->(289254790276317185@Movie:Movie{id:434,name:Tough Enough}) | +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ```` #### 指定路径类型 ACYCLIC 匹配不含重复点的路径 当指定路径类型为`ACYCLIC`时,返回的路径中不包含重复点。 ```` ''' USE movie MATCH p = ACYCLIC (a@Actor)-[e:Act]->{1,3}(b:Movie) RETURN p LIMIT 3 ''' ```` 返回: ```` +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | p | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | (288500052853260289@Actor:Person{birthDate:null,id:271947,name:Dino Zamboni})-[0@Act:Act{}]->(289154137717735425@Movie:Movie{id:335,name:Once Upon A Time In The West}) | | (288496835922755585@Actor:Person{birthDate:null,id:271934,name:Marilù Carteny})-[0@Act:Act{}]->(289154137717735425@Movie:Movie{id:335,name:Once Upon A Time In The West}) | | (288492558135328770@Actor:Person{birthDate:null,id:108398,name:Al Mulock})-[0@Act:Act{}]->(289154137717735425@Movie:Movie{id:335,name:Once Upon A Time In The West}) | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ```` #### 指定匹配类型 DIFFERENT 匹配不含重复边的路径 当匹配类型以关键字`DIFFERENT`开头时,返回的路径中不包含重复边。 ```` ''' USE movie MATCH DIFFERENT EDGES p= (a:Movie)-[e]-{0,2}(b) RETURN p, length(p) AS l LIMIT 5 ''' ```` 返回: ```` +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---+ | p | l | +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---+ | (289259673654132737@Movie:Movie{id:614,name:Wild Strawberries})<-[0@Act:Act{}]-(288256055761174529@Actor:Person{birthDate:1916-05-06,id:180694,name:Sif Ruud}) | 1 | | (289319098821640193@Movie:Movie{id:302,name:Swimming Pool})<-[0@Act:Act{}]-(288236526544879617@Actor:Person{birthDate:null,id:4398,name:Erarde Forestali}) | 1 | | (289298959719989249@Movie:Movie{id:18,name:The 5th Element})<-[0@Act:Act{}]-(288231381174059009@Actor:Person{birthDate:null,id:169371,name:George Khan}) | 1 | | (289123411521699841@Movie:Movie{id:258,name:Bed and Board})<-[0@Act:Act{}]-(288251692074401793@Actor:Person{birthDate:null,id:3579,name:Danièle Girard}) | 1 | | (289286641753784321@Movie:Movie{id:221,name:Rebel without a Cause})<-[0@Act:Act{}]-(288250841670877185@Actor:Person{birthDate:1883-06-11,id:2780,name:Virginia Brissac}) | 1 | +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---+ ```` #### 匹配所有满足条件的两个点之间的所有路径 ```` ''' USE movie MATCH p = ALL (a@Actor{id:134060})-[e:Act]-{1,3}(b:Movie) RETURN p ''' ```` 上述语句匹配所有满足条件的两个点之间的所有路径。 返回: ```` +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | p | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen})<-[0@Act:Act{}]-(288291721169600513@Actor:Person{birthDate:1970-10-08,id:1892,name:Matt Damon})-[0@Act:Act{}]->(289200227011788801@Movie:Movie{id:489,name:mente indomable}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen})<-[0@Act:Act{}]-(288299211592564737@Actor:Person{birthDate:1975-08-12,id:1893,name:Casey Affleck})-[0@Act:Act{}]->(289200227011788801@Movie:Movie{id:489,name:mente indomable}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen})<-[0@Act:Act{}]-(288343033143885825@Actor:Person{birthDate:1940-04-25,id:1158,name:Al Pacino})-[0@Act:Act{}]->(289197740225724417@Movie:Movie{id:240,name:The Godfather II}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen})<-[0@Act:Act{}]-(288248818741280769@Actor:Person{birthDate:1959-03-16,id:1906,name:Scott L. Schwartz})-[0@Act:Act{}]->(289192942747254785@Movie:Movie{id:557,name:Spiderman}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen})<-[0@Act:Act{}]-(288507972772954113@Actor:Person{birthDate:1963-12-18,id:287,name:Brad Pitt})-[0@Act:Act{}]->(289148695994171393@Movie:Movie{id:63,name:12 Monkeys}) | ... +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Got 171 rows (time spent 25.504ms/27.461934ms) ```` #### 匹配所有满足条件的两个点之间的任意两条路径 ```` ''' USE movie MATCH p= ANY 2 (a@Actor{id:134060})-[e:Act]-{1,3}(b:Movie) RETURN p ''' ```` 上述语句匹配所有满足条件的两个点之间的任意两条路径。 返回: ```` +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | p | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288242427829944321@Actor:Person{birthDate:1949-02-02,id:2389,name:Brent Spiner})-[0@Act:Act{}]->(289283845730074625@Movie:Movie{id:200,name:Star Trek: Insurrection}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288279575002087425@Actor:Person{birthDate:1940-07-13,id:2387,name:Patrick Stewart})-[0@Act:Act{}]->(289283845730074625@Movie:Movie{id:200,name:Star Trek: Insurrection}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen})<-[0@Act:Act{}]-(288507972772954113@Actor:Person{birthDate:1963-12-18,id:287,name:Brad Pitt})-[0@Act:Act{}]->(289148695994171393@Movie:Movie{id:63,name:12 Monkeys}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen})<-[0@Act:Act{}]-(288343033143885825@Actor:Person{birthDate:1940-04-25,id:1158,name:Al Pacino})-[0@Act:Act{}]->(289182480206921729@Movie:Movie{id:242,name:The Godfather Coda: The Death of Michael Corleone}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen})<-[0@Act:Act{}]-(288467131928936449@Actor:Person{birthDate:1956-04-12,id:1271,name:Andy Garcia})-[0@Act:Act{}]->(289182480206921729@Movie:Movie{id:242,name:The Godfather Coda: The Death of Michael Corleone}) | ... +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Got 39 rows (time spent 22.282ms/22.971691ms) ```` #### 匹配所有满足条件的两个点之间的所有最短路径 ```` ''' USE movie MATCH p = ALL SHORTEST (a@Actor{id:134060})-[e:Act]-{1,3}(b:Movie) RETURN p ''' ```` 上述语句匹配所有满足条件的两个点之间的所有最短路径。 返回: ```` +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | p | +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288475601604444161@Actor:Person{birthDate:1955-11-13,id:2395,name:Whoopi Goldberg})-[0@Act:Act{}]->(289114817292140545@Movie:Movie{id:201,name:Star Trek: Nemesis}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288415549371711489@Actor:Person{birthDate:1949-03-02,id:2392,name:Gates McFadden})-[0@Act:Act{}]->(289114817292140545@Movie:Movie{id:201,name:Star Trek: Nemesis}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288404275082559489@Actor:Person{birthDate:1957-02-16,id:2390,name:LeVar Burton})-[0@Act:Act{}]->(289114817292140545@Movie:Movie{id:201,name:Star Trek: Nemesis}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288317830275792897@Actor:Person{birthDate:1952-12-09,id:2391,name:Michael Dorn})-[0@Act:Act{}]->(289114817292140545@Movie:Movie{id:201,name:Star Trek: Nemesis}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288448809598451713@Actor:Person{birthDate:1955-03-29,id:2393,name:Marina Sirtis})-[0@Act:Act{}]->(289114817292140545@Movie:Movie{id:201,name:Star Trek: Nemesis}) | ... +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Got 77 rows (time spent 200.31ms/201.743343ms) ```` #### 指定 ANY SHORTEST 匹配所有满足条件的两个点之间的任意一条最短路径 ```` ''' USE movie MATCH p= ANY SHORTEST (a@Actor{id:134060})-[e:Act]-{1,3}(b:Movie) RETURN p ''' ```` 上述语句匹配所有满足条件的两个点之间的任意一条最短路径。 返回: ```` +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | p | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288242427829944321@Actor:Person{birthDate:1949-02-02,id:2389,name:Brent Spiner})-[0@Act:Act{}]->(289114817292140545@Movie:Movie{id:201,name:Star Trek: Nemesis}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288245734954762241@Actor:Person{birthDate:1920-03-03,id:1751,name:James Doohan})-[0@Act:Act{}]->(289110225972101121@Movie:Movie{id:174,name:Star Trek VI: The Undiscovered Country}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288245734954762241@Actor:Person{birthDate:1920-03-03,id:1751,name:James Doohan})-[0@Act:Act{}]->(289172554537500673@Movie:Movie{id:154,name:Star Trek: The Wrath of Khan}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen})<-[0@Act:Act{}]-(288507972772954113@Actor:Person{birthDate:1963-12-18,id:287,name:Brad Pitt})-[0@Act:Act{}]->(289078181221105665@Movie:Movie{id:628,name:Interview with the Vampire}) | ... +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Got 25 rows (time spent 204.379ms/205.327694ms) ```` #### 指定 SHORTEST 1 匹配所有满足条件的两个点之间的任意一条最短路径 ```` ''' USE movie MATCH p= SHORTEST 1 (a@Actor{id:134060})-[e:Act]-{1,3}(b:Movie) RETURN p ''' ```` 上述语句匹配所有满足条件的两个点之间的任意一条最短路径。 返回: ```` +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | p | +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288475601604444161@Actor:Person{birthDate:1955-11-13,id:2395,name:Whoopi Goldberg})-[0@Act:Act{}]->(289114817292140545@Movie:Movie{id:201,name:Star Trek: Nemesis}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288439811641966593@Actor:Person{birthDate:null,id:133761,name:Judy Levitt})-[0@Act:Act{}]->(289110225972101121@Movie:Movie{id:174,name:Star Trek VI: The Undiscovered Country}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen})<-[0@Act:Act{}]-(288427532330467329@Actor:Person{birthDate:1964-11-29,id:1896,name:Don Cheadle})-[0@Act:Act{}]->(289086826990272513@Movie:Movie{id:205,name:Ashley Palacios}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen})<-[0@Act:Act{}]-(288299211592564737@Actor:Person{birthDate:1975-08-12,id:1893,name:Casey Affleck})-[0@Act:Act{}]->(289200227011788801@Movie:Movie{id:489,name:mente indomable}) | ... +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Got 25 rows (time spent 178.729ms/179.511682ms) ```` #### 匹配所有满足条件的两个点之间的任意两条最短路径 ```` ''' USE movie MATCH p= SHORTEST 2 (a@Actor{id:134060})-[e:Act]-{1,3}(b:Movie) RETURN p ''' ```` 上述语句匹配所有满足条件的两个点之间的任意两条最短路径。 返回: ```` +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | p | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289240870287310849@Movie:Movie{id:298,name:Ocean's Thirteen}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288388491077746689@Actor:Person{birthDate:1936-09-14,id:1754,name:Walter Koenig})-[0@Act:Act{}]->(289078829761167361@Movie:Movie{id:157,name:Star Trek III: The Search for Spock}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288372067122806785@Actor:Person{birthDate:1931-03-22,id:1748,name:William Shatner})-[0@Act:Act{}]->(289078829761167361@Movie:Movie{id:157,name:Star Trek III: The Search for Spock}) | | (288348049665687553@Actor:Person{birthDate:1960-05-31,id:134060,name:Tommy Hinkley})-[0@Act:Act{}]->(289100304597647361@Movie:Movie{id:193,name:Star Trek: Generations})<-[0@Act:Act{}]-(288475601604444161@Actor:Person{birthDate:1955-11-13,id:2395,name:Whoopi Goldberg})-[0@Act:Act{}]->(289114817292140545@Movie:Movie{id:201,name:Star Trek: Nemesis}) | ... +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Got 37 rows (time spent 155.32ms/156.292194ms) ```` ### 匹配多种模式 #### 匹配多种点模式 ```` ''' USE movie MATCH (a@Actor),(b@Movie) WHERE EXISTS {(a)-[:Act]->(b)} RETURN a.name, b.name LIMIT 3 ''' ```` 上述语句匹配两个点模式对应的点。 返回: ```` +--------------------+------------------------+ | a.name | b.name | +--------------------+------------------------+ | Sieghardt Rupp | A Fistful of Dollars | | Sammi Davis | Four Rooms and a Hotel | | Martin Spang Olsen | In China They Eat Dogs | +--------------------+------------------------+ ```` #### 匹配多种边模式 ```` ''' USE movie MATCH ()-[e1:Watch]->(b), (c)-[e2:WithGenre]->() WHERE b.id = c.id AND e1.rate >= 4 RETURN DISTINCT b.name, e1.rate LIMIT 5 ''' ```` 上述语句匹配两个边模式对应的边。 返回: ```` +------------------------+---------+ | b.name | e1.rate | +------------------------+---------+ | Wild Strawberries | 4.5 | | Saw III | 4.5 | | Saw III | 5.0 | | In China They Eat Dogs | 4.0 | | Rashomon | 4.0 | +------------------------+---------+ ```` #### 匹配多种路径模式 ```` ''' USE movie MATCH p1 = (a:Person{id:5498})-[e1:Act]->(b), p2= (b)-[e2:WithGenre]->(d) RETURN p1, p2 ''' ```` 上述语句匹配两个路径模式对应的路径。 返回: ```` +---------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ | p1 | p2 | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ | (288372217446662145@Actor:Person{birthDate:1974-01-25,id:5498,name:Adam Bousdoukos})-[0@Act:Act{}]->(289212884280410113@Movie:Movie{id:407,name:Short Sharp Shock}) | (289212884280410113@Movie:Movie{id:407,name:Short Sharp Shock})-[0@WithGenre:WithGenre{}]->(289476741301272578@Genre:Genre{id:87,name:Low Budget Film}) | | (288372217446662145@Actor:Person{birthDate:1974-01-25,id:5498,name:Adam Bousdoukos})-[0@Act:Act{}]->(289212884280410113@Movie:Movie{id:407,name:Short Sharp Shock}) | (289212884280410113@Movie:Movie{id:407,name:Short Sharp Shock})-[0@WithGenre:WithGenre{}]->(289576822629203970@Genre:Genre{id:53,name:Thriller}) | | (288372217446662145@Actor:Person{birthDate:1974-01-25,id:5498,name:Adam Bousdoukos})-[0@Act:Act{}]->(289212884280410113@Movie:Movie{id:407,name:Short Sharp Shock}) | (289212884280410113@Movie:Movie{id:407,name:Short Sharp Shock})-[0@WithGenre:WithGenre{}]->(289596025427984386@Genre:Genre{id:707,name:Tragedy}) | | (288372217446662145@Actor:Person{birthDate:1974-01-25,id:5498,name:Adam Bousdoukos})-[0@Act:Act{}]->(289212884280410113@Movie:Movie{id:407,name:Short Sharp Shock}) | (289212884280410113@Movie:Movie{id:407,name:Short Sharp Shock})-[0@WithGenre:WithGenre{}]->(289611968346587137@Genre:Genre{id:866,name:Teen Film}) | | (288372217446662145@Actor:Person{birthDate:1974-01-25,id:5498,name:Adam Bousdoukos})-[0@Act:Act{}]->(289212884280410113@Movie:Movie{id:407,name:Short Sharp Shock}) | (289212884280410113@Movie:Movie{id:407,name:Short Sharp Shock})-[0@WithGenre:WithGenre{}]->(289631476088045571@Genre:Genre{id:33,name:Romance Film}) | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ ```` ### 用 OPTIONAL 进行可选匹配 以下示例展示通过指定关键字 OPTIONAL 进行可选匹配的相关用法。 #### 可选匹配不存在的点 ```` ''' USE movie OPTIONAL MATCH (v:NotExistLabel) RETURN v ''' ```` 上述语句匹配不到带有标签`NotExistLabel`的点,因此返回报错。 返回: ```` Error: [NS228]: node label `NotExistLabel` not found in graph type `movie_type` ```` #### 普通匹配不存在的点 ```` ''' USE movie MATCH (v:NotExistLabel) RETURN v ''' ```` 上述语句匹配不到带有标签`NotExistLabel`的点,因此返回报错。 返回: ```` Error: [NS228]: node label `NotExistLabel` not found in graph type `movie_type` ```` #### 同时使用普通匹配和可选匹配 ```` ''' USE movie MATCH (b:Genre{id:87}) OPTIONAL MATCH p = (a:Movie{id:2000})-[e]->(b) RETURN b, p ''' ```` 上述语句首先普通匹配一个点,然后可选匹配一条路径。由于不存在满足条件的路径,因此返回`null`。 返回: ```` +----------------------------------------------------------------+------+ | b | p | +----------------------------------------------------------------+------+ | (289476741301272578@Genre:Genre{id:87,name:"Low Budget Film"}) | null | +----------------------------------------------------------------+------+ ````