标签(Labels) #
一、标签概述 #
1.1 什么是标签 #
标签用于对节点进行分类和分组,类似于关系数据库中的表名,但更加灵活。一个节点可以有零个或多个标签。
text
┌─────────────────────────┐
│ Person:Actor:Director │ ← 多个标签
│ │
│ name: "Tom Hanks" │
│ born: 1956 │
└─────────────────────────┘
1.2 标签特点 #
text
标签特点:
├── 用于分类节点
├── 一个节点可以有多个标签
├── 标签可以动态添加和删除
├── 用于优化查询性能
└── 用于定义约束和索引
1.3 标签与表的区别 #
| 特性 | 标签 | 表 |
|---|---|---|
| 数量 | 节点可有多个 | 记录只属于一个表 |
| 灵活性 | 可动态添加删除 | 固定结构 |
| 模式 | 无固定模式 | 固定列定义 |
| 查询 | 按标签过滤 | 按表查询 |
二、创建带标签的节点 #
2.1 创建单标签节点 #
cypher
CREATE (p:Person {name: 'Tom'})
2.2 创建多标签节点 #
cypher
CREATE (p:Person:Actor {name: 'Tom'})
CREATE (p:Person:Actor:Director {name: 'Tom'})
2.3 创建无标签节点 #
cypher
CREATE ({name: 'Tom'})
三、查询标签 #
3.1 按标签查询节点 #
cypher
MATCH (p:Person)
RETURN p
3.2 按多标签查询 #
cypher
MATCH (p:Person:Actor)
RETURN p
3.3 查看节点的所有标签 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN labels(p) AS node_labels
3.4 查询所有标签 #
cypher
CALL db.labels()
3.5 统计各标签节点数量 #
cypher
MATCH (n)
RETURN labels(n) AS label, count(n) AS count
ORDER BY count DESC
3.6 检查节点是否有特定标签 #
cypher
MATCH (p:Person)
WHERE 'Actor' IN labels(p)
RETURN p
四、添加标签 #
4.1 添加单个标签 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p:Actor
4.2 添加多个标签 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p:Actor:Director
4.3 条件添加标签 #
cypher
MATCH (p:Person)
WHERE p.age > 60
SET p:Senior
4.4 批量添加标签 #
cypher
MATCH (p:Person)
WHERE p.occupation = 'Actor'
SET p:Actor
五、删除标签 #
5.1 删除单个标签 #
cypher
MATCH (p:Person {name: 'Tom'})
REMOVE p:Actor
5.2 删除多个标签 #
cypher
MATCH (p:Person {name: 'Tom'})
REMOVE p:Actor:Director
5.3 条件删除标签 #
cypher
MATCH (p:Senior)
WHERE p.age < 60
REMOVE p:Senior
六、标签函数 #
6.1 labels函数 #
cypher
MATCH (n)
RETURN labels(n) AS node_labels
6.2 检查标签存在 #
cypher
MATCH (n)
WHERE 'Person' IN labels(n)
RETURN n
6.3 获取标签数量 #
cypher
MATCH (n)
RETURN size(labels(n)) AS label_count
七、标签与索引 #
7.1 为标签创建索引 #
cypher
CREATE INDEX FOR (p:Person) ON (p.name)
CREATE INDEX FOR (p:Person) ON (p.name, p.age)
7.2 查看索引 #
cypher
SHOW INDEXES
7.3 标签索引的作用 #
text
索引作用:
├── 加速按标签查询
├── 加速按属性过滤
├── 支持唯一性约束
└── 提高查询性能
八、标签与约束 #
8.1 唯一约束 #
cypher
CREATE CONSTRAINT FOR (p:Person) REQUIRE p.id IS UNIQUE
CREATE CONSTRAINT FOR (p:Person) REQUIRE p.email IS UNIQUE
8.2 存在约束 #
cypher
CREATE CONSTRAINT FOR (p:Person) REQUIRE p.name IS NOT NULL
8.3 键约束 #
cypher
CREATE CONSTRAINT FOR (p:Person) REQUIRE (p.id, p.name) IS NODE KEY
8.4 查看约束 #
cypher
SHOW CONSTRAINTS
九、标签命名规范 #
9.1 命名风格 #
text
推荐命名风格:
├── 大驼峰命名:Person, Product, OrderItem
├── 使用名词:User, Company, Article
├── 单数形式:Person 而非 People
├── 表达实体类型
└── 避免使用动词
9.2 命名建议 #
text
建议:
├── 使用有意义的名称
├── 保持命名一致性
├── 避免过长的名称
├── 避免使用保留字
└── 考虑业务语义
9.3 常见标签命名 #
| 领域 | 标签示例 |
|---|---|
| 人员 | Person, User, Employee, Customer |
| 组织 | Company, Department, Team |
| 内容 | Article, Post, Comment, Document |
| 产品 | Product, Item, Category |
| 交易 | Order, Transaction, Payment |
| 地理 | City, Country, Location |
十、多标签设计 #
10.1 多标签使用场景 #
text
使用场景:
├── 角色分类:Person:Admin:Editor
├── 状态标记:Order:Pending:Processing
├── 类型继承:Animal:Mammal:Dog
├── 功能分类:User:Verified:Premium
└── 时间分类:Document:Draft:Archived
10.2 多标签示例 #
cypher
CREATE (p:Person:Actor:Director:Producer {
name: 'Tom Hanks',
born: 1956
})
10.3 多标签查询 #
cypher
MATCH (p:Person:Actor)
RETURN p
MATCH (p)
WHERE ALL(label IN ['Person', 'Actor'] WHERE label IN labels(p))
RETURN p
10.4 多标签设计原则 #
text
原则:
├── 标签数量不宜过多(建议不超过5个)
├── 标签应表达不同的维度
├── 避免冗余标签
├── 考虑查询模式
└── 保持语义清晰
十一、标签继承设计 #
11.1 模拟继承 #
cypher
CREATE (d:Dog:Animal {name: 'Buddy'})
CREATE (c:Cat:Animal {name: 'Whiskers'})
CREATE (b:Bird:Animal {name: 'Tweety'})
11.2 查询父类 #
cypher
MATCH (a:Animal)
RETURN a
11.3 查询子类 #
cypher
MATCH (d:Dog)
RETURN d
11.4 查询特定子类 #
cypher
MATCH (a:Animal)
WHERE 'Dog' IN labels(a)
RETURN a
十二、标签统计 #
12.1 统计标签使用情况 #
cypher
CALL db.labels() YIELD label
CALL {
WITH label
MATCH (n)
WHERE label IN labels(n)
RETURN count(n) AS count
}
RETURN label, count
ORDER BY count DESC
12.2 查找无标签节点 #
cypher
MATCH (n)
WHERE size(labels(n)) = 0
RETURN n
12.3 查找多标签节点 #
cypher
MATCH (n)
WHERE size(labels(n)) > 2
RETURN n, labels(n)
十三、标签设计最佳实践 #
13.1 标签选择原则 #
text
原则:
├── 标签应代表实体的类型
├── 标签应支持常见查询
├── 标签应便于创建约束和索引
├── 标签应具有业务意义
└── 标签应保持稳定性
13.2 标签数量建议 #
text
建议:
├── 每个节点至少有一个标签
├── 标签数量建议不超过5个
├── 避免过于细分的标签
└── 考虑查询性能
13.3 避免反模式 #
text
避免:
├── 使用标签存储数据
├── 过多的标签
├── 无意义的标签
├── 频繁变化的标签
└── 与属性混淆
13.4 标签与属性的选择 #
text
选择标签:
├── 用于分类和分组
├── 用于查询过滤
├── 用于定义约束
选择属性:
├── 存储具体数据
├── 值会变化
├── 需要范围查询
十四、实际应用示例 #
14.1 用户标签设计 #
cypher
CREATE (u:User:Person:Active {
id: 'user_001',
username: 'tom_hanks',
email: 'tom@example.com'
})
CREATE (u:User:Person:Inactive {
id: 'user_002',
username: 'jerry_mouse',
email: 'jerry@example.com'
})
14.2 内容标签设计 #
cypher
CREATE (a:Article:Published {
id: 'article_001',
title: 'Neo4j Guide',
content: '...',
publishedAt: datetime()
})
CREATE (a:Article:Draft {
id: 'article_002',
title: 'Draft Article',
content: '...',
createdAt: datetime()
})
14.3 产品标签设计 #
cypher
CREATE (p:Product:Electronics:Phone {
id: 'prod_001',
name: 'iPhone 15',
price: 999.99
})
CREATE (p:Product:Electronics:Laptop {
id: 'prod_002',
name: 'MacBook Pro',
price: 1999.99
})
14.4 订单标签设计 #
cypher
CREATE (o:Order:Pending {
id: 'order_001',
total: 1999.99,
createdAt: datetime()
})
MATCH (o:Order:Pending)
WHERE o.createdAt < datetime() - duration('P7D')
SET o:Expired
REMOVE o:Pending
十五、标签管理 #
15.1 重命名标签 #
Neo4j不支持直接重命名标签,需要通过以下方式:
cypher
MATCH (n:OldLabel)
SET n:NewLabel
REMOVE n:OldLabel
15.2 合并标签 #
cypher
MATCH (n:LabelA)
SET n:LabelC
REMOVE n:LabelA
MATCH (n:LabelB)
SET n:LabelC
REMOVE n:LabelB
15.3 删除所有特定标签 #
cypher
MATCH (n:OldLabel)
REMOVE n:OldLabel
十六、总结 #
标签操作要点:
| 操作 | 语法 | 说明 |
|---|---|---|
| 创建 | CREATE (n:Label) | 创建带标签节点 |
| 查询 | MATCH (n:Label) | 按标签查询 |
| 添加 | SET n:Label | 添加标签 |
| 删除 | REMOVE n:Label | 删除标签 |
| 查看 | labels(n) | 查看所有标签 |
最佳实践:
- 每个节点至少有一个标签
- 使用有意义的标签名
- 保持命名风格一致
- 合理使用多标签
- 为常用标签创建索引
下一步,让我们学习数据操作!
最后更新:2026-03-27