☰
Neo4j CQL(Cypher查询语言)详细教程
2026/10/23 6:24:17 网站建设 项目流程

文章目录

        • Neo4j CQL(Cypher查询语言)详细教程
        • 一、核心语法基础
        • 二、基础 CRUD 操作
        • 三、查询修饰与结果处理
        • 四、高级特性
        • 五、命名规范与最佳实践
Neo4j CQL(Cypher查询语言)详细教程

CQL(Cypher Query Language)是 Neo4j 图数据库的声明式查询语言,采用 ASCII-art 风格的图形化语法,直观描述图模式,语法接近自然语言,是操作 Neo4j 图数据的核心工具。


一、核心语法基础

CQL 围绕图数据模型的 4 个核心元素构建,所有操作都基于这些元素展开:

元素语法表示说明
节点(Node)(变量:标签 {属性键:值})图实体,括号表示,标签用于分类,属性是键值对
关系(Relationship)[变量:类型 {属性键:值}]->有向连接,方括号+箭头表示,必须有类型
标签(Label):LabelName节点分类,一个节点可有多个标签
属性(Property){key: value}节点/关系的元数据,支持字符串、数值、布尔、列表、字典等类型

语法规则:

  • 关键字大小写不敏感,变量名大小写敏感;
  • 变量是查询内的临时引用,不会存储在数据库中;
  • 模式(Pattern)是节点+关系的组合,用于描述要匹配的图结构。

二、基础 CRUD 操作

CQL 提供完整的增删改查能力,覆盖数据全生命周期操作。

1. 创建数据(CREATE)
用于创建节点、关系或完整路径,不存在则直接新增,不做重复检查。

-- 创建单个节点 CREATE (p:Person {name: '张三', age: 30}) RETURN p; -- 创建多个节点 CREATE (a:Person {name: '李四'}), (b:Person {name: '王五'}); -- 创建节点+关系(一步到位) CREATE (a:Person {name: '张三'})-[:FRIEND {since: 2024}]->(b:Person {name: '李四'}) RETURN a, b; -- 创建带多个标签的节点 CREATE (n:Person:Developer {name: '赵六', tech: 'Java'}) RETURN n;

2. 查询数据(MATCH + RETURN)
CQL 最核心的操作,通过模式匹配检索图数据,基本结构为MATCH-WHERE-RETURN。

-- 查询所有节点 MATCH (n) RETURN n; -- 按标签查询 MATCH (p:Person) RETURN p; -- 按属性精确匹配 MATCH (p:Person {name: '张三'}) RETURN p; -- 条件过滤查询 MATCH (p:Person) WHERE p.age > 25 RETURN p.name, p.age; -- 模糊查询 MATCH (p:Person) WHERE p.name STARTS WITH '张' RETURN p; -- 以张开头 MATCH (p:Person) WHERE p.name CONTAINS '三' RETURN p; -- 包含三 MATCH (p:Person) WHERE p.name ENDS WITH '三' RETURN p; -- 以三结尾 MATCH (p:Person) WHERE p.name =~ '张.*' RETURN p; -- 正则匹配 -- 范围判断 MATCH (p:Person) WHERE p.age IN [25, 30, 35] RETURN p; -- 关系查询 MATCH (a:Person)-[r:FRIEND]->(b:Person) RETURN a.name, b.name, r.since; -- 多跳查询(朋友的朋友) MATCH (a:Person {name: '张三'})-[:FRIEND*2]->(fof:Person) RETURN fof.name; -- 可变深度路径(1-3跳) MATCH (a:Person {name: '张三'})-[:FRIEND*1..3]->(friend:Person) RETURN DISTINCT friend.name; -- 最短路径 MATCH path = shortestPath( (a:Person {name: '张三'})-[*]-(b:Person {name: '王五'}) ) RETURN path; -- 可选匹配(类似SQL外连接,匹配不到返回null) MATCH (a:Person {name: '张三'}) OPTIONAL MATCH (a)-[:FRIEND]->(f:Person) RETURN a.name, f.name;

3. 更新数据(SET)
用于添加/修改节点或关系的属性、标签。

-- 修改单个属性 MATCH (p:Person {name: '张三'}) SET p.age = 31 RETURN p; -- 批量更新属性 MATCH (p:Person {name: '张三'}) SET p += {age: 32, city: '福州'} RETURN p; -- 添加标签 MATCH (p:Person {name: '张三'}) SET p:Developer RETURN p; -- 更新关系属性 MATCH (a:Person {name: '张三'})-[r:FRIEND]->(b:Person {name: '李四'}) SET r.since = 2025 RETURN r;

4. 删除数据(DELETE / REMOVE)

  • DELETE:删除节点或关系,删除带关系的节点需先删关系,或用DETACH DELETE级联删除;
  • REMOVE:仅删除属性或标签,不删除节点/关系本身。
-- 删除关系 MATCH (a:Person {name: '张三'})-[r:FRIEND]->(b:Person {name: '李四'}) DELETE r; -- 删除无关系的节点 MATCH (p:Person {name: '王五'}) DELETE p; -- 删除节点及其所有关系(推荐) MATCH (p:Person {name: '张三'}) DETACH DELETE p; -- 清空整个数据库 MATCH (n) DETACH DELETE n; -- 删除属性 MATCH (p:Person {name: '张三'}) REMOVE p.city RETURN p; -- 删除标签 MATCH (p:Person:Developer {name: '张三'}) REMOVE p:Developer RETURN p;

5. 防重复创建(MERGE)
先匹配模式,存在则返回,不存在则创建,可配合ON CREATE/ON MATCH设置不同逻辑。

-- 基础用法:存在则匹配,不存在则创建 MERGE (p:Person {name: '张三'}) RETURN p; -- 区分创建和匹配时的操作 MERGE (p:Person {name: '张三'}) ON CREATE SET p.createdAt = timestamp(), p.age = 30 ON MATCH SET p.updatedAt = timestamp() RETURN p;

三、查询修饰与结果处理

用于对查询结果进行排序、分页、去重、聚合等操作。

1. 排序与分页

-- 按年龄降序排列,取前10条 MATCH (p:Person) RETURN p.name, p.age ORDER BY p.age DESC LIMIT 10; -- 跳过前5条,取10条 MATCH (p:Person) RETURN p.name SKIP 5 LIMIT 10;

2. 去重

-- 查询所有不重复的城市 MATCH (p:Person) RETURN DISTINCT p.city;

3. 聚合函数
支持COUNT、SUM、AVG、MAX、MIN、COLLECT(聚合成列表)。

-- 统计Person节点总数 MATCH (p:Person) RETURN count(p) AS total; -- 统计每个人的朋友数 MATCH (p:Person)-[:FRIEND]->(f:Person) RETURN p.name, count(f) AS friendCount ORDER BY friendCount DESC; -- 计算平均年龄 MATCH (p:Person) RETURN avg(p.age) AS avgAge; -- 将朋友名聚合成列表 MATCH (p:Person {name: '张三'})-[:FRIEND]->(f:Person) RETURN p.name, collect(f.name) AS friends;

4. 结果合并(UNION / UNION ALL)
合并多个查询的结果集,要求列数和列名一致,UNION去重,UNION ALL保留重复。

MATCH (p:Person) RETURN p.name AS name UNION MATCH (m:Movie) RETURN m.title AS name;

5. 中间结果传递(WITH)
类似管道,将上一步的结果传递给下一步,用于复杂链式查询。

-- 先统计朋友数,再筛选朋友数大于3的人 MATCH (p:Person)-[:FRIEND]->(f:Person) WITH p, count(f) AS friendCount WHERE friendCount > 3 RETURN p.name, friendCount;

四、高级特性

1. 列表与条件处理

-- 列表推导 RETURN [x IN range(1,5) WHERE x % 2 = 0 | x^2] AS result; -- 输出[4, 16] -- CASE条件判断 MATCH (p:Person) RETURN p.name, CASE WHEN p.age < 18 THEN '未成年' WHEN p.age < 60 THEN '成年' ELSE '老年' END AS status; -- UNWIND展开列表 UNWIND [1,2,3] AS num RETURN num * 2 AS doubled;

2. 子查询(CALL)
Neo4j 5.x 支持子查询,可嵌套执行独立查询。

CALL { MATCH (a:Actor) RETURN a.name AS name UNION ALL MATCH (m:Movie) RETURN m.title AS name } RETURN name, count(*) AS cnt;

3. 数据导入(LOAD CSV)
将 CSV 文件放入 Neo4j 的import目录,可批量导入数据。

-- 导入节点 LOAD CSV WITH HEADERS FROM 'file:///persons.csv' AS row CREATE (p:Person {id: row.id, name: row.name, age: toInteger(row.age)}); -- 导入关系 LOAD CSV WITH HEADERS FROM 'file:///friends.csv' AS row MATCH (a:Person {id: row.from_id}), (b:Person {id: row.to_id}) CREATE (a)-[:FRIEND {since: toInteger(row.since)}]->(b);

4. 索引与约束
创建索引可加速查询,约束可保证数据唯一性。

-- 创建索引 CREATE INDEX person_name_idx FOR (p:Person) ON (p.name); -- 创建唯一约束 CREATE CONSTRAINT person_id_unique FOR (p:Person) REQUIRE p.id IS UNIQUE;

5. 执行计划分析
用EXPLAIN查看预估执行计划,PROFILE执行并查看实际执行数据,用于性能调优。

EXPLAIN MATCH (p:Person {name: '张三'}) RETURN p; PROFILE MATCH (p:Person {name: '张三'})-[:FRIEND]->(f:Person) RETURN f;

五、命名规范与最佳实践

1. 命名规范

  • 标签:驼峰命名,如Person、Movie、GitHubRepo;
  • 关系类型:全大写,如FOLLOWS、ACTED_IN、MARRIED_TO;
  • 属性键:小驼峰,如firstName、createdAt、deptId。

2. 最佳实践

  • 高频查询属性务必创建索引,避免全图扫描;
  • 可变长度路径必须指定最大深度(如*1..5),防止性能爆炸;
  • 优先用MERGE替代CREATE,避免重复数据;
  • 删除节点优先用DETACH DELETE,避免手动删关系的繁琐;
  • 复杂查询用WITH拆分步骤,提升可读性和性能;
  • 数据去重:将多个节点共有的重复属性抽取为独立节点,减少冗余。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询