MATCH
子句允许指定查询在数据库中搜索的模式,是检索数据以供查询使用的主要方式。
WHERE
子句通常跟在MATCH
子句之后,用于对匹配的模式添加用户自定义的限制条件,以操纵返回的数据集。这些谓词是模式描述的一部分,不应被视作仅在匹配完成后才应用的过滤器。这意味着WHERE
子句总是与其所属的MATCH
子句一起使用。
MATCH
可以出现在查询的开头,也可以出现在WITH
之后。如果它是第一个子句,则此时还没有任何绑定,Cypher将设计一个搜索来查找符合该子句及其关联的WHERE
子句中指定的谓词的结果。通过此搜索找到的顶点和边作为已绑定的模式元素可用,并可用于子图的模式匹配。它们也可以在后续子句中使用,Cypher将使用已知的元素,进一步查找其他未知元素。
Cypher是一种声明式语言,因此查询本身通常不会指定执行搜索所使用的算法。WHERE
部分中的谓词可以在模式匹配之前、期间或之后进行评估。
基本顶点查找
获取所有顶点
通过指定一个没有标签的单个顶点模式,可以返回图中的所有顶点。
示例
SELECT * FROM cypher('graph_name', $$
MATCH (v)
RETURN v
$$) as (v agtype);
返回结果如下:
v
----------------------------------------------------------------------------------------
{id: 0, "label": "Person", "properties": {"name": "Charlie Sheen"}}::vertex
{id: 1, "label": "Person", "properties": {"name": "Martin Sheen"}}::vertex
{id: 2, "label": "Person", "properties": {"name": "Michael Douglas"}}::vertex
{id: 3, "label": "Person", "properties": {"name": "Oliver Stone"}}::vertex
{id: 4, "label": "Person", "properties": {"name": "Rob Reiner"}}::vertex
{id: 5, "label": "Movie", "properties": {"title": "Wall Street"}}::vertex
{id: 6, "label": "Movie", "properties": {"title": "The American President"}}::vertex
(7 rows)
获取具有标签的所有顶点
获取具有特定标签的所有顶点,可以通过一个简单的节点模式来实现,其中顶点具有指定的标签。
示例
SELECT * FROM cypher('graph_name', $$
MATCH (movie:Movie)
RETURN movie.title
$$) as (title agtype);
返回结果如下:
title
--------------------------
"Wall Street"
"The American President"
(2 rows)
关联顶点
符号-[]-
指定一条边,但不指定边的类型或方向。
示例
SELECT * FROM cypher('graph_name', $$
MATCH (director {name: 'Oliver Stone'})-[]-(movie)
RETURN movie.title
$$) as (title agtype);
返回结果如下:
title
---------------
"Wall Street"
(1 row)
使用标签匹配
为了通过顶点上的标签来限制你的模式,在模式中的顶点上添加标签语法。
示例
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Oliver Stone'})-[]-(movie:Movie)
RETURN movie.title
$$) as (title agtype);
返回结果如下:
title
---------------
"Wall Street"
(1 row)
Edge基础知识
外向边
如需返回有向边,可使用->
或<-
指定边的方向。
示例
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Oliver Stone'})-[]->(movie)
RETURN movie.title
$$) as (title agtype);
返回结果如下:
title
---------------
"Wall Street"
(1 row)
有向边和变量
如果需要变量,无论是用于根据边的属性进行过滤,还是返回边,都应在所需使用的边或顶点中明确指定该变量。
示例
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Oliver Stone'})-[r]->(movie)
RETURN type(r)
$$) as (title agtype);
返回从Oliver
出发的每条出边的类型。
title
------------
"DIRECTED"
(1 row)
基于边标签匹配
当已知需要匹配的边标签时,可以使用冒号加上边标签来指定。
示例
SELECT * FROM cypher('graph_name', $$
MATCH (:Movie {title: 'Wall Street'})<-[:ACTED_IN]-(actor)
RETURN actor.name
$$) as (actors_name agtype);
返回所有在《华尔街》中参演的演员。
actors_name
-------------------
"Charlie Sheen"
"Martin Sheen"
"Michael Douglas"
(3 rows)
使用变量匹配边标签
如果需要使用一个变量来保存边,并指定您想要的边标签,可以通过同时指定它们来实现。
示例
SELECT * FROM cypher('graph_name', $$
MATCH ({title: 'Wall Street'})<-[r:ACTED_IN]-(actor)
RETURN r.role
$$) as (role agtype);
查询《华尔街》中的“ACTED_IN”角色。
role
-------------------
"Gordon Gekko"
"Carl Fox"
"Bud Fox"
(3 rows)
多条边
边可以串联起来匹配无限数量的边。只要遵循基本模式 ()-[]-()
,就可以将边和顶点连接起来,以匹配特定的模式。
示例
SELECT * FROM cypher('graph_name', $$
MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)
RETURN movie.title, director.name
$$) as (title agtype, name agtype);
返回Charlie Sheen参演的电影及其导演。
title | name
---------------+----------------
"Wall Street" | "Oliver Stone"
(1 row)
可变长度边
当两个顶点之间的连接长度是可变时,可以使用以下连接返回形成该连接的边列表。
简介
与其使用许多顶点和边的描述来描述一条长路径,可以通过在模式的边描述中指定长度来描述许多边(以及中间顶点)。
(u)-[*2]->(v)
以上描述三个顶点和两条边的右向路径可以改写为:
(u)-[]->()-[]->(v)
也可以给出一个范围长度:
(u)-[*3..5]->(v)
这相当于:
(u)-[]->()-[]->()-[]->(v) and
(u)-[]->()-[]->()-[]->()-[]->(v) and
(u)-[]->()-[]->()-[]->()-[]->()-[]->(v)
以上示例给出了从顶点u到v之间的边(和顶点)数量的上下限。其中一个或两个这样的边界值可以被排除。
返回所有包含三条或更多边的
u
和v
之间的路径。(u)-[*3..]->(v)
返回所有包含五条或更少边的
u
和v
之间的路径。(u)-[*..5]->(v)
返回
u
和v
之间的所有路径。(u)-[*]->(v)
示例
SELECT * FROM cypher('graph_name', $$
MATCH p = (actor {name: 'Willam Dafoe'})-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)
$$) as (r agtype);
返回与Willam Dafoe合作的两位蜘蛛侠演员之间的边,包括Willam Dafoe参演的那部电影。
r
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
[{id: 0; label:"ACTED_IN"; properties: {role: "Green Goblin"}}::edge, {id: 1; label: "ACTED_IN; properties: {role: "Spiderman", actor: "Toby Maguire}}::edge]
[{id: 0; label:"ACTED_IN"; properties: {role: "Green Goblin"}}::edge, {id: 2; label: "ACTED_IN; properties: {role: "Spiderman", actor: "Andrew Garfield"}}::edge]
(2 rows)
- 本页导读 (1)
- 基本顶点查找
- 获取所有顶点
- 获取具有标签的所有顶点
- 关联顶点
- 使用标签匹配
- Edge基础知识
- 外向边
- 有向边和变量
- 基于边标签匹配
- 使用变量匹配边标签
- 多条边
- 可变长度边
- 简介
- 示例