节点(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}) 存在则匹配,不存在则创建

最佳实践:

  1. 为节点设计合理的标签体系
  2. 使用唯一标识属性
  3. 保持属性命名一致
  4. 避免节点属性过多
  5. 使用MERGE处理重复数据

下一步,让我们学习关系!

最后更新:2026-03-27