节点(Nodes) #
一、节点概述 #
1.1 什么是节点 #
节点是Neo4j图数据库中最基本的数据实体,用于表示现实世界中的对象。每个节点可以拥有:
- 标签(Label):用于分类节点
- 属性(Property):存储节点的数据
- 关系(Relationship):与其他节点的连接
text
┌─────────────────────────┐
│ Person │ ← 标签
│ │
│ name: "Tom Hanks" │ ← 属性
│ born: 1956 │
│ id: 1 │
└─────────────────────────┘
│
│ ACTED_IN
▼
1.2 节点特点 #
text
节点特点:
├── 唯一ID:系统自动分配
├── 可有多个标签
├── 可有多个属性
├── 可有多个关系
└── 属性值可为NULL
二、创建节点 #
2.1 创建空节点 #
cypher
CREATE ()
2.2 创建带标签的节点 #
cypher
CREATE (:Person)
CREATE (:Person:Actor)
2.3 创建带属性的节点 #
cypher
CREATE (:Person {name: 'Tom', born: 1956})
2.4 创建完整节点 #
cypher
CREATE (p:Person:Actor {
name: 'Tom Hanks',
born: 1956,
birthplace: 'California'
})
RETURN p
2.5 批量创建节点 #
cypher
CREATE (:Person {name: 'Tom'}),
(:Person {name: 'Jerry'}),
(:Person {name: 'Mike'})
2.6 使用UNWIND批量创建 #
cypher
UNWIND [
{name: 'Tom', age: 30},
{name: 'Jerry', age: 25},
{name: 'Mike', age: 35}
] AS person
CREATE (p:Person)
SET p = person
2.7 从参数创建 #
cypher
:param person => {name: 'Tom', age: 30}
CREATE (p:Person $person)
RETURN p
三、查询节点 #
3.1 查询所有节点 #
cypher
MATCH (n)
RETURN n
LIMIT 100
3.2 按标签查询 #
cypher
MATCH (p:Person)
RETURN p
3.3 按属性查询 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN p
3.4 多条件查询 #
cypher
MATCH (p:Person)
WHERE p.name = 'Tom' AND p.age > 25
RETURN p
3.5 查询节点数量 #
cypher
MATCH (n)
RETURN count(n) AS total_nodes
MATCH (p:Person)
RETURN count(p) AS person_count
四、节点标签 #
4.1 查看节点标签 #
cypher
MATCH (p:Person)
RETURN labels(p) AS node_labels
4.2 添加标签 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p:Actor
4.3 添加多个标签 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p:Actor:Director:Producer
4.4 移除标签 #
cypher
MATCH (p:Person {name: 'Tom'})
REMOVE p:Actor
4.5 查询所有标签 #
cypher
CALL db.labels()
4.6 多标签查询 #
cypher
MATCH (p:Person:Actor)
RETURN p
五、节点属性 #
5.1 查看节点属性 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN properties(p) AS props
5.2 查看属性键 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN keys(p) AS property_keys
5.3 添加属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p.age = 30
5.4 更新属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p.age = 31
5.5 添加多个属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p.age = 30, p.city = 'New York'
5.6 使用映射更新属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p += {age: 30, city: 'New York'}
5.7 替换所有属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p = {name: 'Tom', age: 30, city: 'New York'}
5.8 删除属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p.age = NULL
MATCH (p:Person {name: 'Tom'})
REMOVE p.age
六、节点ID #
6.1 获取节点ID #
cypher
MATCH (p:Person)
RETURN id(p) AS node_id, p.name
6.2 通过ID查询 #
cypher
MATCH (n)
WHERE id(n) = 0
RETURN n
6.3 elementId(Neo4j 5.x) #
cypher
MATCH (p:Person)
RETURN elementId(p) AS element_id
MATCH (n)
WHERE elementId(n) = '4:xxx-xxx-xxx'
RETURN n
七、删除节点 #
7.1 删除单个节点 #
cypher
MATCH (p:Person {name: 'Tom'})
DELETE p
7.2 删除多个节点 #
cypher
MATCH (p:Person)
WHERE p.name IN ['Tom', 'Jerry']
DELETE p
7.3 删除节点及其关系 #
cypher
MATCH (p:Person {name: 'Tom'})
DETACH DELETE p
7.4 删除所有节点 #
cypher
MATCH (n)
DETACH DELETE n
八、MERGE操作 #
8.1 MERGE基本用法 #
cypher
MERGE (p:Person {name: 'Tom'})
RETURN p
8.2 MERGE带属性 #
cypher
MERGE (p:Person {name: 'Tom'})
ON CREATE SET p.created = timestamp()
ON MATCH SET p.lastSeen = timestamp()
RETURN p
8.3 MERGE多属性 #
cypher
MERGE (p:Person {name: 'Tom', age: 30})
ON CREATE SET p.created = timestamp()
ON MATCH SET p.updated = timestamp()
RETURN p
8.4 MERGE与CREATE的区别 #
cypher
CREATE (p:Person {name: 'Tom'})
MERGE (p:Person {name: 'Tom'})
九、节点函数 #
9.1 labels函数 #
cypher
MATCH (n)
RETURN labels(n) AS labels
9.2 properties函数 #
cypher
MATCH (n)
RETURN properties(n) AS properties
9.3 keys函数 #
cypher
MATCH (n)
RETURN keys(n) AS keys
9.4 coalesce函数 #
cypher
MATCH (p:Person)
RETURN coalesce(p.nickname, p.name, 'Unknown') AS display_name
十、节点统计 #
10.1 统计各标签节点数 #
cypher
MATCH (n)
RETURN labels(n) AS label, count(n) AS count
ORDER BY count DESC
10.2 统计节点属性 #
cypher
MATCH (n:Person)
WITH n, keys(n) AS props
UNWIND props AS prop
RETURN prop, count(*) AS count
ORDER BY count DESC
10.3 查找孤立节点 #
cypher
MATCH (n)
WHERE NOT (n)--()
RETURN n
10.4 查找高度节点 #
cypher
MATCH (n)-[r]-()
WITH n, count(r) AS degree
ORDER BY degree DESC
LIMIT 10
RETURN n, degree
十一、节点设计最佳实践 #
11.1 标签设计 #
text
建议:
├── 使用名词命名:Person, Product, Order
├── 使用大驼峰命名法
├── 避免过多标签(建议不超过5个)
├── 标签应代表实体的类型或角色
└── 保持标签的语义清晰
11.2 属性设计 #
text
建议:
├── 为节点添加唯一标识属性
├── 属性名使用小驼峰或下划线命名
├── 避免过大的属性值
├── 合理使用NULL值
└── 保持属性命名一致性
11.3 唯一标识 #
cypher
CREATE CONSTRAINT FOR (p:Person) REQUIRE p.id IS UNIQUE
CREATE (p:Person {id: 'person_001', name: 'Tom'})
11.4 避免反模式 #
text
避免:
├── 节点存储大量数据(考虑拆分)
├── 过深的属性嵌套
├── 使用数组存储复杂结构
└── 节点属性过多(建议不超过50个)
十二、实际应用示例 #
12.1 用户节点 #
cypher
CREATE (u:User {
id: 'user_001',
username: 'tom_hanks',
email: 'tom@example.com',
created_at: datetime(),
status: 'active',
profile: {
firstName: 'Tom',
lastName: 'Hanks',
avatar: 'avatar.png'
}
})
12.2 产品节点 #
cypher
CREATE (p:Product {
id: 'prod_001',
name: 'iPhone 15',
price: 999.99,
category: 'Electronics',
tags: ['phone', 'apple', 'smartphone'],
stock: 100,
created_at: datetime()
})
12.3 文档节点 #
cypher
CREATE (d:Document {
id: 'doc_001',
title: 'Neo4j Guide',
content: '...',
author: 'Tom',
created_at: datetime(),
updated_at: datetime(),
status: 'published',
tags: ['neo4j', 'database', 'graph']
})
十三、总结 #
节点操作要点:
| 操作 | 语法 | 说明 |
|---|---|---|
| 创建 | CREATE (n:Label {prop: value}) | 创建新节点 |
| 查询 | MATCH (n:Label) WHERE … | 查询节点 |
| 更新 | SET n.prop = value | 更新属性 |
| 删除 | DELETE n | 删除节点 |
| 合并 | MERGE (n:Label {prop: value}) | 存在则匹配,不存在则创建 |
最佳实践:
- 为节点设计合理的标签体系
- 使用唯一标识属性
- 保持属性命名一致
- 避免节点属性过多
- 使用MERGE处理重复数据
下一步,让我们学习关系!
最后更新:2026-03-27