图数据库 Neo4j 常用语法总结与实战示例
·
Neo4j 关键语法总结
一、核心关键字
1. CREATE - 创建
// 创建节点
CREATE (n:Person {name: '张三', age: 25})
// 创建节点和关系
CREATE (a:Person {name: 'A'})-[:FRIEND {since: 2020}]->(b:Person {name: 'B'})
// 批量创建
CREATE
(n1:Person {name: 'A'}),
(n2:Person {name: 'B'}),
(n1)-[:FRIEND]->(n2)
2. MATCH - 查询
// 查询所有节点
MATCH (n) RETURN n
// 按标签查询
MATCH (p:Person) RETURN p
// 按关系查询
MATCH (a)-[r:FRIEND]->(b) RETURN a, b
// 多深度关系
MATCH (a)-[:FRIEND*1..3]-(b) RETURN a, b
3. WHERE - 条件过滤
// 基本比较
MATCH (p:Person) WHERE p.age > 25 RETURN p
// 字符串操作
MATCH (p:Person) WHERE p.name CONTAINS '三' RETURN p
MATCH (p:Person) WHERE p.name STARTS WITH '张' 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 [20, 25, 30] RETURN p
4. SET - 修改
// 修改属性
MATCH (p:Person {name: '张三'}) SET p.age = 26
// 添加/修改多个属性
MATCH (p:Person {name: '张三'}) SET p.age = 26, p.city = '上海'
// 添加标签
MATCH (p:Person {name: '张三'}) SET p:VIP
// 移除标签
MATCH (p:Person {name: '张三'}) REMOVE p:VIP
// 移除属性
MATCH (p:Person {name: '张三'}) REMOVE p.email
5. DELETE - 删除
// 删除节点(无关系)
MATCH (n {name: '张三'}) DELETE n
// 删除节点及关系
MATCH (n {name: '张三'}) DETACH DELETE n
// 删除关系
MATCH ()-[r:FRIEND]->() DELETE r
// 删除特定关系
MATCH (a {name: '张三'})-[r:FRIEND]->(b {name: '李四'}) DELETE r
6. RETURN - 返回结果
// 返回所有
MATCH (n) RETURN *
// 返回特定属性
MATCH (p:Person) RETURN p.name, p.age
// 去重
MATCH (p:Person) RETURN DISTINCT p.city
// 排序
MATCH (p:Person) RETURN p ORDER BY p.age DESC
// 分页
MATCH (p:Person) RETURN p SKIP 5 LIMIT 10
// 聚合函数
MATCH (p:Person) RETURN COUNT(p), AVG(p.age), MAX(p.age), MIN(p.age), SUM(p.age)
// 收集为列表
MATCH (p:Person) RETURN COLLECT(p.name)
二、核心符号详解
1. 圆括号 () - 节点
// 匿名节点
MATCH (n) RETURN n
// 带标签的节点
MATCH (p:Person) RETURN p
// 带属性的节点
MATCH (p:Person {name: '张三', age: 25}) RETURN p
// 带变量的节点
MATCH (person:Person) RETURN person
// 多个标签
MATCH (p:Person:VIP) RETURN p
2. 花括号 {} - 属性
// 节点属性
CREATE (n:Person {name: '张三', age: 25})
// 关系属性
CREATE (a)-[:FRIEND {since: 2020, level: 'close'}]->(b)
// MATCH 中过滤属性
MATCH (p:Person {name: '张三'}) RETURN p
// 动态属性(使用变量)
MATCH (p:Person) WHERE p.name = $nameParam RETURN p
3. 方括号 [] - 关系
// 匿名关系
MATCH (a)-(b) RETURN a, b
// 指定关系类型
MATCH (a)-[r:FRIEND]->(b) RETURN a, b
// 多种关系类型
MATCH (a)-[r:FRIEND|COLLEAGUE]->(b) RETURN a, b
// 带属性的关系
MATCH (a)-[r:FRIEND {since: 2020}]->(b) RETURN a, b
// 关系变量(用于访问属性)
MATCH (a)-[r:FRIEND]->(b) RETURN r.since, r.level
// 可变长度关系
MATCH (a)-[:FRIEND*1..5]-(b) RETURN a, b
MATCH (a)-[:FRIEND*3]-(b) RETURN a, b // 恰好 3 层
MATCH (a)-[:FRIEND*..5]-(b) RETURN a, b // 最多 5 层
4. 连字符 - - 关系连接
// 无向关系
MATCH (a)-(b) RETURN a, b
// 有向关系(从左到右)
MATCH (a)->(b) RETURN a, b
// 有向关系(从右到左)
MATCH (a)<-(b) RETURN a, b
// 结合关系类型
MATCH (a)-[:FRIEND]-(b) RETURN a, b // 无向
MATCH (a)-[:FRIEND]->(b) RETURN a, b // a 是 b 的朋友
MATCH (a)<-[:FRIEND]-(b) RETURN a, b // b 是 a 的朋友
5. 箭头 -> - 关系方向
// 出边(从 a 发出)
MATCH (a)-[:FRIEND]->() RETURN a
// 入边(指向 b)
MATCH ()-[:FRIEND]->(b) RETURN b
// 双向遍历
MATCH (a)-[:FRIEND]-(b) RETURN a, b
// 路径方向
MATCH path = (start)-[:STEP*1..10]->(end) RETURN path
三、组合语法示例
完整语句结构
MATCH (节点模式)
WHERE 条件
SET 修改内容
RETURN 返回内容
ORDER BY 排序字段
SKIP 跳过数
LIMIT 限制数
实际应用示例
示例 1:创建完整的关系网络
CREATE
// 创建人物节点
(zhangsan:Person {name: '张三', age: 25, city: '成都'}),
(lisi:Person {name: '李四', age: 28, city: '北京'}),
(wangwu:Person {name: '王五', age: 30, city: '上海'}),
// 创建朋友关系
(zhangsan)-[:FRIEND {since: 2018, level: 'best'}]->(lisi),
(zhangsan)-[:FRIEND {since: 2020, level: 'close'}]->(wangwu),
(lisi)-[:FRIEND {since: 2019}]->(wangwu)
示例 2:复杂查询
MATCH (p:Person)-[r:FRIEND]->(friend)
WHERE p.age > 25 AND r.since >= 2019
RETURN
p.name AS 姓名,
p.city AS 城市,
friend.name AS 朋友姓名,
r.since AS 认识年份,
r.level AS 关系等级
ORDER BY r.since DESC
LIMIT 5
示例 3:更新操作
MATCH (p:Person {name: '张三'})
SET
p.age = 26,
p.city = '深圳',
p.updated_at = datetime()
RETURN p
示例 4:删除操作
// 删除张三的所有朋友关系
MATCH (:Person {name: '张三'})-[r:FRIEND]-()
DELETE r
// 删除年龄小于 18 岁的人及其关系
MATCH (p:Person)
WHERE p.age < 18
DETACH DELETE p
四、高级语法
1. MERGE - 存在则匹配,不存在则创建
// 存在则返回,不存在则创建
MERGE (p:Person {name: '张三'}) RETURN p
// 创建时设置默认值
MERGE (p:Person {name: '张三'})
ON CREATE SET p.age = 25, p.created = timestamp()
RETURN p
// 匹配时更新
MERGE (p:Person {name: '张三'})
ON MATCH SET p.visited = true
RETURN p
2. WITH - 子查询管道
// 分组聚合
MATCH (p:Person)
WITH p.city, COUNT(*) AS cityCount
WHERE cityCount > 5
RETURN p.city, cityCount
// 链式查询
MATCH (p:Person)-[:FRIEND]->(f)
WITH p, COLLECT(f.name) AS friends
WHERE SIZE(friends) > 2
RETURN p.name, friends
3. UNION - 合并查询结果
// UNION(去重)
MATCH (p:Person) RETURN p.name
UNION
MATCH (c:Company) RETURN c.name
// UNION ALL(不去重)
MATCH (p:Person) RETURN p.name
UNION ALL
MATCH (c:Company) RETURN c.name
4. 路径表达式
// 查询最短路径
MATCH p = shortestPath((a:Person)-[*]-(b:Person))
RETURN p
// 查询所有路径
MATCH p = (a:Person)-[*1..5]-(b:Person)
RETURN p
// 固定长度路径
MATCH p = (a)-[:FRIEND*3]-(b)
RETURN p
五、常用系统命令
// 查看所有标签
CALL db.labels()
// 查看关系类型
CALL db.relationshipTypes()
// 查看统计信息
CALL db.stats()
// 清空数据库
MATCH (n) DETACH DELETE n
// 创建索引
CREATE INDEX FOR (p:Person) ON (p.name)
// 创建唯一约束
CREATE CONSTRAINT person_name_unique FOR (p:Person) REQUIRE p.name IS UNIQUE
// 查看所有索引和约束
SHOW INDEXES
SHOW CONSTRAINTS
六、语法规则速记表
| 符号/关键字 | 用途 | 示例 |
|---|---|---|
(n) |
节点 | (n), (p:Person), (p:Person {name:'张三'}) |
{} |
属性 | {name:'张三', age:25} |
[r:TYPE] |
关系 | [r:FRIEND], [:FRIEND], [r] |
- |
关系连接线 | (a)-(b), (a)-[]-(b) |
-> |
关系方向 | (a)->(b), (a)-[:FRIEND]->(b) |
CREATE |
创建 | CREATE (n:Person {name:'张三'}) |
MATCH |
查询 | MATCH (n) RETURN n |
WHERE |
条件 | WHERE n.age > 25 |
SET |
修改 | SET n.age = 26 |
DELETE |
删除 | DELETE n, DETACH DELETE n |
RETURN |
返回 | RETURN n.name, n.age |
MERGE |
匹配或创建 | MERGE (n:Person {name:'张三'}) |
WITH |
管道传递 | WITH n, COUNT(*) AS cnt |
CONTAINS |
包含 | WHERE n.name CONTAINS '三' |
IN |
属于 | WHERE n.age IN [20, 25, 30] |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)