标签(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) 查看所有标签

最佳实践:

  1. 每个节点至少有一个标签
  2. 使用有意义的标签名
  3. 保持命名风格一致
  4. 合理使用多标签
  5. 为常用标签创建索引

下一步,让我们学习数据操作!

最后更新:2026-03-27