关系(Relationships) #
一、关系概述 #
1.1 什么是关系 #
关系是连接两个节点的有向边,用于表示节点之间的关联。每个关系具有:
- 类型(Type):关系的名称,如KNOWS、FRIEND_OF
- 方向(Direction):有向,从起始节点到结束节点
- 属性(Property):可选的键值对
text
┌─────────┐ ┌─────────┐
│ Tom │ │ Jerry │
│ │───KNOWS(since:2020)──▶│ │
└─────────┘ └─────────┘
起始节点 关系类型/属性 结束节点
1.2 关系特点 #
text
关系特点:
├── 必须有类型
├── 必须有方向(查询时可忽略)
├── 必须连接两个节点
├── 可有多个属性
├── 同类型关系可重复
└── 不能自引用(不能连接同一节点)
二、创建关系 #
2.1 创建节点同时创建关系 #
cypher
CREATE (a:Person {name: 'Tom'})-[:KNOWS]->(b:Person {name: 'Jerry'})
2.2 基于已有节点创建关系 #
cypher
MATCH (a:Person {name: 'Tom'})
MATCH (b:Person {name: 'Jerry'})
CREATE (a)-[:KNOWS]->(b)
2.3 创建带属性的关系 #
cypher
MATCH (a:Person {name: 'Tom'})
MATCH (b:Person {name: 'Jerry'})
CREATE (a)-[:KNOWS {since: 2020, level: 'close'}]->(b)
2.4 创建双向关系 #
cypher
MATCH (a:Person {name: 'Tom'})
MATCH (b:Person {name: 'Jerry'})
CREATE (a)-[:KNOWS]->(b)
CREATE (b)-[:KNOWS]->(a)
2.5 创建多个关系 #
cypher
MATCH (a:Person {name: 'Tom'})
MATCH (b:Person {name: 'Jerry'})
CREATE (a)-[:KNOWS]->(b),
(a)-[:WORKS_WITH]->(b)
2.6 创建关系变量 #
cypher
MATCH (a:Person {name: 'Tom'})
MATCH (b:Person {name: 'Jerry'})
CREATE (a)-[r:KNOWS {since: 2020}]->(b)
RETURN r
三、查询关系 #
3.1 查询有关系的节点 #
cypher
MATCH (a)-[r]->(b)
RETURN a, r, b
3.2 按关系类型查询 #
cypher
MATCH (a)-[:KNOWS]->(b)
RETURN a, b
3.3 查询特定方向 #
cypher
MATCH (a:Person {name: 'Tom'})-[:KNOWS]->(b)
RETURN b
MATCH (a:Person {name: 'Tom'})<-[:KNOWS]-(b)
RETURN b
3.4 忽略方向查询 #
cypher
MATCH (a:Person {name: 'Tom'})-[:KNOWS]-(b)
RETURN b
3.5 查询关系属性 #
cypher
MATCH (a)-[r:KNOWS]->(b)
RETURN r.since, r.level
3.6 按关系属性过滤 #
cypher
MATCH (a)-[r:KNOWS]->(b)
WHERE r.since > 2019
RETURN a, b
3.7 查询多种关系类型 #
cypher
MATCH (a)-[r:KNOWS|WORKS_WITH]->(b)
RETURN a, type(r) AS rel_type, b
四、关系类型 #
4.1 查看关系类型 #
cypher
MATCH ()-[r]->()
RETURN DISTINCT type(r) AS rel_type
4.2 查询所有关系类型 #
cypher
CALL db.relationshipTypes()
4.3 统计各类型关系数量 #
cypher
MATCH ()-[r]->()
RETURN type(r) AS rel_type, count(r) AS count
ORDER BY count DESC
4.4 命名规范 #
text
关系类型命名规范:
├── 使用大写字母
├── 使用下划线分隔:WORKS_AT, FRIEND_OF
├── 使用动词或动词短语
├── 表达明确的语义
└── 避免过长的名称
4.5 常见关系类型示例 #
| 关系类型 | 说明 | 示例 |
|---|---|---|
| KNOWS | 认识 | Person-KNOWS->Person |
| FRIEND_OF | 朋友 | Person-FRIEND_OF->Person |
| WORKS_AT | 工作于 | Person-WORKS_AT->Company |
| LIVES_IN | 居住于 | Person-LIVES_IN->City |
| ACTED_IN | 出演 | Actor-ACTED_IN->Movie |
| DIRECTED | 导演 | Director-DIRECTED->Movie |
| PURCHASED | 购买 | User-PURCHASED->Product |
| BELONGS_TO | 属于 | Item-BELONGS_TO->Category |
五、关系属性 #
5.1 添加关系属性 #
cypher
MATCH (a)-[r:KNOWS]->(b)
SET r.since = 2020
5.2 更新关系属性 #
cypher
MATCH (a)-[r:KNOWS]->(b)
SET r.level = 'best_friend'
5.3 批量更新属性 #
cypher
MATCH (a)-[r:KNOWS]->(b)
SET r += {since: 2020, level: 'close'}
5.4 删除关系属性 #
cypher
MATCH (a)-[r:KNOWS]->(b)
SET r.level = NULL
MATCH (a)-[r:KNOWS]->(b)
REMOVE r.level
5.5 查看关系属性 #
cypher
MATCH ()-[r:KNOWS]->()
RETURN properties(r) AS props
5.6 常见关系属性 #
| 属性 | 类型 | 说明 |
|---|---|---|
| since | Integer | 关系建立时间 |
| weight | Float | 关系权重 |
| count | Integer | 交互次数 |
| status | String | 关系状态 |
| created_at | DateTime | 创建时间 |
六、关系函数 #
6.1 type函数 #
cypher
MATCH ()-[r]->()
RETURN type(r) AS rel_type
6.2 startNode和endNode #
cypher
MATCH ()-[r]->()
RETURN startNode(r) AS start, endNode(r) AS end
6.3 properties函数 #
cypher
MATCH ()-[r]->()
RETURN properties(r) AS props
6.4 关系ID #
cypher
MATCH ()-[r]->()
RETURN id(r) AS rel_id
七、删除关系 #
7.1 删除单个关系 #
cypher
MATCH (a)-[r:KNOWS]->(b)
WHERE a.name = 'Tom' AND b.name = 'Jerry'
DELETE r
7.2 删除特定类型的所有关系 #
cypher
MATCH ()-[r:KNOWS]->()
DELETE r
7.3 删除节点的所有关系 #
cypher
MATCH (a:Person {name: 'Tom'})-[r]-()
DELETE r
7.4 删除节点及其关系 #
cypher
MATCH (a:Person {name: 'Tom'})
DETACH DELETE a
八、MERGE关系 #
8.1 MERGE基本用法 #
cypher
MATCH (a:Person {name: 'Tom'})
MATCH (b:Person {name: 'Jerry'})
MERGE (a)-[:KNOWS]->(b)
8.2 MERGE带属性 #
cypher
MATCH (a:Person {name: 'Tom'})
MATCH (b:Person {name: 'Jerry'})
MERGE (a)-[r:KNOWS]->(b)
ON CREATE SET r.since = 2020
ON MATCH SET r.updated = timestamp()
8.3 MERGE完整示例 #
cypher
MATCH (a:Person {name: 'Tom'})
MATCH (b:Person {name: 'Jerry'})
MERGE (a)-[r:KNOWS {since: 2020}]->(b)
ON CREATE SET r.created = timestamp(), r.level = 'new'
ON MATCH SET r.lastSeen = timestamp()
RETURN r
九、关系基数 #
9.1 查询出度 #
cypher
MATCH (n:Person)-[r]->()
RETURN n.name, count(r) AS out_degree
ORDER BY out_degree DESC
9.2 查询入度 #
cypher
MATCH (n:Person)<-[r]-()
RETURN n.name, count(r) AS in_degree
ORDER BY in_degree DESC
9.3 查询总度数 #
cypher
MATCH (n:Person)-[r]-()
RETURN n.name, count(r) AS total_degree
ORDER BY total_degree DESC
9.4 查询特定关系类型的度数 #
cypher
MATCH (n:Person)-[r:KNOWS]->()
RETURN n.name, count(r) AS knows_count
ORDER BY knows_count DESC
十、关系模式 #
10.1 链式关系 #
cypher
MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->(c)
RETURN a, b, c
10.2 分支关系 #
cypher
MATCH (a)-[:KNOWS]->(b)
MATCH (a)-[:WORKS_AT]->(c)
RETURN a, b, c
10.3 汇聚关系 #
cypher
MATCH (a)-[:KNOWS]->(c)<-[:KNOWS]-(b)
RETURN a, b, c
10.4 循环关系 #
cypher
MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->(c)-[:KNOWS]->(a)
RETURN a, b, c
十一、关系设计最佳实践 #
11.1 关系类型设计 #
text
建议:
├── 使用动词命名:KNOWS, PURCHASED
├── 表达明确的方向语义
├── 保持命名一致性
├── 避免过于泛化的类型
└── 考虑查询模式设计关系
11.2 方向设计 #
text
方向选择:
├── 有明确方向语义:PARENT_OF, MANAGES
├── 可忽略方向:FRIEND_OF, KNOWS
└── 查询时根据需要指定方向
11.3 属性设计 #
text
建议:
├── 存储关系特有的属性
├── 时间戳:since, created_at
├── 权重:weight, score
├── 避免存储大量属性
└── 避免存储节点属性
11.4 避免反模式 #
text
避免:
├── 关系属性过多
├── 使用关系存储大量数据
├── 创建冗余关系
├── 过于复杂的关系类型
└── 忽略方向语义
十二、实际应用示例 #
12.1 社交关系 #
cypher
CREATE (tom:Person {name: 'Tom'})
CREATE (jerry:Person {name: 'Jerry'})
CREATE (tom)-[:FRIEND_OF {since: 2020, level: 'best'}]->(jerry)
CREATE (tom)-[:FOLLOWS {since: 2021}]->(jerry)
12.2 组织结构 #
cypher
CREATE (ceo:Employee {name: 'CEO'})
CREATE (manager:Employee {name: 'Manager'})
CREATE (worker:Employee {name: 'Worker'})
CREATE (ceo)-[:MANAGES]->(manager)
CREATE (manager)-[:MANAGES]->(worker)
CREATE (worker)-[:WORKS_FOR]->(ceo)
12.3 电影关系 #
cypher
CREATE (tom:Person {name: 'Tom Hanks'})
CREATE (movie:Movie {title: 'Forrest Gump'})
CREATE (director:Person {name: 'Robert Zemeckis'})
CREATE (tom)-[:ACTED_IN {role: 'Forrest Gump'}]->(movie)
CREATE (director)-[:DIRECTED]->(movie)
12.4 电商关系 #
cypher
CREATE (user:User {id: 'user_001'})
CREATE (product:Product {id: 'prod_001'})
CREATE (order:Order {id: 'order_001'})
CREATE (user)-[:PLACED]->(order)
CREATE (order)-[:CONTAINS {quantity: 2}]->(product)
CREATE (user)-[:VIEWED {count: 5}]->(product)
十三、总结 #
关系操作要点:
| 操作 | 语法 | 说明 |
|---|---|---|
| 创建 | CREATE (a)-[:TYPE]->(b) | 创建关系 |
| 查询 | MATCH (a)-[r]->(b) | 查询关系 |
| 更新 | SET r.prop = value | 更新属性 |
| 删除 | DELETE r | 删除关系 |
| 合并 | MERGE (a)-[:TYPE]->(b) | 存在则匹配,不存在则创建 |
最佳实践:
- 使用有意义的关系类型名称
- 合理设置关系方向
- 适当使用关系属性
- 避免冗余关系
- 根据查询模式设计关系
下一步,让我们学习属性!
最后更新:2026-03-27