Cypher高级查询

Cypher 支持多种高级查询功能,用于增强数据筛选、排序、分页、统计、合并等能力,帮助我们更灵活地从图中提取和处理数据。本章将介绍 MATCH 语句常用的组合方式与增强用法。

一、数据准备

为了更好地理解 Cypher 的高级查询功能,我们需要在图数据库中预先构建一套示例数据集。该数据集围绕“人物-电影”构建图模型,模拟了导演、演员、电影之间的真实关系,并引入社交网络中的“关注”关系。数据模型如下图所示:

// =======================
// 清空旧数据
// =======================
MATCH (n) DETACH DELETE n;

// =======================
// 创建人物节点(9人)
// =======================
CREATE 
  (:Person {name:'张艺谋', birth:'1951-11-14'}),
  (:Person {name:'陈凯歌', birth:'1952-08-12'}),
  (:Person {name:'巩俐', birth:'1965-12-31'}),
  (:Person {name:'葛优', birth:'1957-04-19'}),
  (:Person {name:'章子怡', birth:'1979-02-09'}),
  (:Person {name:'刘德华', birth:'1961-09-27'}),
  (:Person {name:'吴京', birth:'1974-04-03'}),
  (:Person {name:'贾玲', birth:'1982-04-29'}),
  (:Person {name:'郭帆', birth:'1980-12-15'});

// =======================
// 创建电影节点(10部)
// =======================
CREATE
  (:Movie {title:'红高粱', year:1987, rating:8.4, genre:['文艺','历史']}),
  (:Movie {title:'活着', year:1994, rating:9.2, genre:['剧情','历史']}),
  (:Movie {title:'霸王别姬', year:1993, rating:9.6, genre:['剧情','爱情']}),
  (:Movie {title:'英雄', year:2002, rating:7.5, genre:['动作','武侠']}),
  (:Movie {title:'无间道', year:2002, rating:9.1, genre:['犯罪','悬疑']}),
  (:Movie {title:'一代宗师', year:2013, rating:8.0, genre:['动作','传记']}),
  (:Movie {title:'流浪地球', year:2019, rating:8.5, genre:['科幻','灾难']}),
  (:Movie {title:'战狼2', year:2017, rating:7.1, genre:['动作','军事']}),
  (:Movie {title:'你好,李焕英', year:2021, rating:7.7, genre:['喜剧','家庭']}),
  (:Movie {title:'满江红', year:2023, rating:7.2, genre:['悬疑','历史']});

// =======================
// 创建导演关系(9条)
// =======================
MATCH 
  (zhang:Person {name:'张艺谋'}),
  (chen:Person {name:'陈凯歌'}),
  (liu:Person {name:'刘德华'}),
  (wu:Person {name:'吴京'}),
  (jia:Person {name:'贾玲'}),
  (guo:Person {name:'郭帆'}),
  (m1:Movie {title:'红高粱'}),
  (m2:Movie {title:'活着'}),
  (m3:Movie {title:'霸王别姬'}),
  (m4:Movie {title:'英雄'}),
  (m5:Movie {title:'无间道'}),
  (m6:Movie {title:'战狼2'}),
  (m7:Movie {title:'你好,李焕英'}),
  (m8:Movie {title:'流浪地球'}),
  (m9:Movie {title:'满江红'})
CREATE 
  (zhang)-[:DIRECTED {award:true}]->(m1),
  (zhang)-[:DIRECTED {award:true}]->(m2),
  (zhang)-[:DIRECTED {award:false}]->(m4),
  (zhang)-[:DIRECTED {award:false}]->(m9),
  (chen)-[:DIRECTED {award:true}]->(m3),
  (liu)-[:DIRECTED {award:false}]->(m5),
  (wu)-[:DIRECTED {award:false}]->(m6),
  (jia)-[:DIRECTED {award:true}]->(m7),
  (guo)-[:DIRECTED {award:true}]->(m8);

// =======================
// 创建参演关系(11条)
// =======================
MATCH 
  (gong:Person {name:'巩俐'}), (ge:Person {name:'葛优'}),
  (zhangyi:Person {name:'章子怡'}), (liu:Person {name:'刘德华'}),
  (wu:Person {name:'吴京'}), (zhang:Person {name:'张艺谋'}),
  (jia:Person {name:'贾玲'}),
  (m1:Movie {title:'红高粱'}), (m2:Movie {title:'活着'}),
  (m3:Movie {title:'霸王别姬'}), (m4:Movie {title:'英雄'}),
  (m5:Movie {title:'无间道'}), (m6:Movie {title:'流浪地球'}),
  (m7:Movie {title:'满江红'}), (m8:Movie {title:'战狼2'}),
  (m9:Movie {title:'你好,李焕英'})
CREATE
  (gong)-[:ACTED_IN {role:'九儿', award:true}]->(m1),
  (gong)-[:ACTED_IN {role:'家珍', award:false}]->(m2),
  (ge)-[:ACTED_IN {role:'福贵', award:true}]->(m2),
  (ge)-[:ACTED_IN {role:'袁四爷', award:false}]->(m3),
  (zhangyi)-[:ACTED_IN {role:'如月', award:false}]->(m4),
  (zhangyi)-[:ACTED_IN {role:'宫二', award:true}]->(m7),
  (liu)-[:ACTED_IN {role:'刘建明', award:false}]->(m5),
  (wu)-[:ACTED_IN {role:'刘培强', award:true}]->(m6),
  (zhang)-[:ACTED_IN {role:'秦桧', award:false}]->(m7),
  (wu)-[:ACTED_IN {role:'冷锋', award:true}]->(m8),
  (jia)-[:ACTED_IN {role:'贾晓玲', award:true}]->(m9);

// =======================
// 创建关注关系(11条)
// =======================
MATCH 
  (gong:Person {name:'巩俐'}), (zhang:Person {name:'张艺谋'}),
  (zhangyi:Person {name:'章子怡'}), (chen:Person {name:'陈凯歌'}),
  (ge:Person {name:'葛优'}), (liu:Person {name:'刘德华'}),
  (wu:Person {name:'吴京'}), (jia:Person {name:'贾玲'}),
  (guo:Person {name:'郭帆'})
CREATE
  (gong)-[:FOLLOWS]->(zhang),
  (zhangyi)-[:FOLLOWS]->(zhang),
  (zhang)-[:FOLLOWS]->(chen),
  (ge)-[:FOLLOWS]->(chen),
  (liu)-[:FOLLOWS]->(zhang),
  (gong)-[:FOLLOWS]->(zhangyi),
  (wu)-[:FOLLOWS]->(zhang),
  (jia)-[:FOLLOWS]->(zhang),
  (guo)-[:FOLLOWS]->(zhang),
  (liu)-[:FOLLOWS]->(wu),
  (zhang)-[:FOLLOWS]->(guo);

二、过滤

在图查询中,我们不仅要匹配(MATCH)图结构(节点和关系),还需要筛选符合特定条件的数据。Cypher 使用 WHERE 子句来实现数据过滤功能,它可以应用于节点、关系的属性,支持函数、布尔逻辑、列表判断等多种表达式。

2.1.基本比较运算符

WHERE 子句支持多种比较运算符,如 =, <>, <, >, <=, >=。

示例:查询出生在 1970 年之后的演员

MATCH (p:Person)
WHERE p.birth > '1970-01-01'
RETURN p.name, p.birth

2.2.多条件组合

可以通过 AND 和 OR 组合多个判断条件,构建复杂的过滤逻辑。

示例:查询评分高于 8 且年份早于 2000 年的电影

MATCH (m:Movie)
WHERE m.rating > 8.0 AND m.year < 2000
RETURN m.title, m.year, m.rating

2.3.集合包含

IN 操作用于判断某个值是否包含在一个列表中。

示例:查找类型包含“历史”的电影

MATCH (m:Movie)
WHERE '历史' IN m.genre
RETURN m.title, m.genre

2.4.字符串匹配

可使用CONTAINS、STARTS WITH、END_WITH操作进行字符串匹配,适用于文本类型的属性,支持模糊或前缀匹配。

示例:查询名字中包含“张”的人物

MATCH (p:Person)
WHERE p.name CONTAINS ''
RETURN p.name

2.5.空值判断

可使用IS NULL / IS NOT NULL 进行空值判断,用于判断属性是否存在或为空,特别适用于数据完整性筛选。

MATCH (p:Person)
WHERE p.birth IS NULL
RETURN p.name

三、排序

在图查询中,当我们需要对结果集按某种规则进行升序或降序排列时,可以使用 Cypher 的 ORDER BY 子句。它类似于 SQL 中的排序功能,常与 RETURN 一起使用,适用于数值、字符串、日期等属性字段。

ORDER BY字句默认使用升序(ASC),也可以显式指定为 DESC(降序)。

示例:按电影评分从高到低排序

MATCH (m:Movie)
RETURN m.title, m.rating
ORDER BY m.rating DESC

四、分页

在实际应用中,返回的数据量往往较大,不适合一次性展示或处理。为此,Cypher 提供了 SKIP 和 LIMIT 子句,用于对查询结果进行分页控制,非常适用于构建分页查询接口或分批处理数据。

4.1.使用 LIMIT 限制返回数量

LIMIT n 表示最多返回前 n 条结果,用于快速查看或测试数据。

示例:返回评分最高的前 3 部电影

MATCH (m:Movie)
RETURN m.title, m.rating
ORDER BY m.rating DESC
LIMIT 3

4.2.使用 SKIP 跳过指定数量

SKIP n 表示跳过前 n 条记录,通常与 LIMIT 搭配实现分页功能。

示例:跳过前 5 条,返回第 6~10 条电影

MATCH (m:Movie)
RETURN m.title, m.year
ORDER BY m.year DESC
SKIP 5
LIMIT 5

 

 

 

 

 

 

 

posted @ 2026-02-07 11:42  酒剑仙*  阅读(0)  评论(0)    收藏  举报