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

浙公网安备 33010602011771号