关系(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) 存在则匹配,不存在则创建

最佳实践:

  1. 使用有意义的关系类型名称
  2. 合理设置关系方向
  3. 适当使用关系属性
  4. 避免冗余关系
  5. 根据查询模式设计关系

下一步,让我们学习属性!

最后更新:2026-03-27