MATCH¶
MATCH语句通过模式匹配从图或临时图中检索数据。
Note
普通MATCH通常通过RETURN返回查询结果,在悦数图数据库开发版中既支持持久化图,也支持临时图。它不同于使用MATCH ... PER PATH或MATCH ... PER NODE执行迭代计算的匹配计算语句,后者只能在临时图上运行。
Note
对非默认 Schema 或其中的对象执行操作时,用户既要通过隐式访问规则或显式USAGE授权获得该 Schema 的访问权,也要具备目标操作所需的权限。Schema 访问校验和目标操作所需的权限校验相互独立,满足其中一项不能替代另一项。Schema 访问控制不适用于临时图、内置 Procedure 和内置 Function。更多信息,请参见 Schema 访问控制。
前提条件¶
- 已创建图或临时图。更多信息,请参见 CREATE GRAPH 和 CREATE TEMPORARY GRAPH。
- 若要检索图中的数据,须具备在当前 Schema 执行
MATCH ANY GRAPH操作的权限,或具备在当前图中执行MATCH操作的权限。更多信息,请参见角色与权限。 - 若要检索临时图中的数据,必须是具备角色
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¶
表示路径的变量。更多信息,请参见变量表达式。
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¶
要匹配的点模式。更多信息,请参见点模式。
edge_pattern¶
要匹配的边模式。更多信息,请参见边模式。
index_hint¶
为查询优化器在执行查询时提供索引使用建议的索引提示。更多信息,请参见索引提示。
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 子句。
在以下场景中使用时,search_condition不得包含子查询表达式:
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。
关于两者的详细区别、返回范围差异以及适用场景,请参见图模式。
在标签和元素类型中使用变量¶
在MATCH语句的模式中,标签和元素类型可以通过字面名称或字符串变量来指定。
若变量的值在查询规划阶段即可确定,优化器将其等同于字面量进行处理。仅执行时能获取变量值时,标签与元素类型检查将延迟至运行时处理。
在模式中使用的变量必须为一个有效的标签或元素类型名称的字符串。
示例¶
以下示例基于示例数据集。
Caution
当图中存储大量数据时,应尽可能详细地提供搜索条件或使用LIMIT限制返回结果的数量。否则,执行可能会导致内存溢出( OOM)。
用点模式匹配¶
以下示例展示如何使用点模式进行匹配。更多信息,请参见点模式。
用点变量匹配点¶
'''
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}) |
+------------------------------------------+
用多个标签匹配点¶
可以使用标签表达式中的“或者”运算符(|)或“并且”运算符(&)来匹配具有多个标签之一或同时具有多个标签的点。更多信息,请参见标签表达式。
以下示例匹配标签为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 |
+----------+
用边模式匹配¶
以下示例展示如何使用边模式进行匹配。更多信息,请参见边模式。
用边变量匹配边¶
'''
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) |
+----------------------------------------------------------+
用多个标签匹配边¶
可以使用标签表达式中的“或者”运算符(|)来匹配具有多个标签之一的边。更多信息,请参见标签表达式。
以下示例匹配标签为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])都可以过滤多种类型,但工作方式不同。标签表达式按标签过滤,支持|、&和!运算符。类型指定按元素类型过滤。更多详情,请参见标签表达式和边模式。
用变量标签匹配边¶
'''
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)
除此之外,也可以使用量化路径模式匹配变长路径。更多信息,请参见变长路径模式表达式。
通过路径模式匹配¶
点模式和边模式可以组合成路径模式,以下示例展示如何使用路径模式进行匹配。更多信息,请参见路径模式。
匹配简单路径并返回点¶
'''
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),从而匹配变长路径。下例返回的结果与示例用量化边模式匹配的结果相同。
'''
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 |
+----------------------------------------------------------------+------+