MATCH

更新时间:2025-01-09 07:25:37

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)

以上示例给出了从顶点uv之间的边(和顶点)数量的上下限。其中一个或两个这样的边界值可以被排除。

  • 返回所有包含三条或更多边的uv之间的路径。

    (u)-[*3..]->(v)
  • 返回所有包含五条或更少边的uv之间的路径。

    (u)-[*..5]->(v)
  • 返回uv之间的所有路径。

    (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基础知识
  • 外向边
  • 有向边和变量
  • 基于边标签匹配
  • 使用变量匹配边标签
  • 多条边
  • 可变长度边
  • 简介
  • 示例

点击开启售前

在线咨询服务