属性(Properties) #
一、属性概述 #
1.1 什么是属性 #
属性是附加在节点或关系上的键值对,用于存储实体的详细信息。
text
节点属性示例:
┌─────────────────────────────┐
│ Person │
│ │
│ name: "Tom Hanks" │
│ born: 1956 │
│ birthplace: "California" │
│ active: true │
│ tags: ["actor", "director"]│
└─────────────────────────────┘
关系属性示例:
(Tom)-[r:KNOWS {since: 2020, level: "close"}]->(Jerry)
1.2 属性特点 #
text
属性特点:
├── 键必须是字符串
├── 值必须是支持的类型
├── 值可以为NULL
├── 节点和关系都可以有属性
├── 属性数量没有限制(但建议合理)
└── 同名属性值可以不同类型
二、支持的属性类型 #
2.1 基本类型 #
| 类型 | 示例 | 说明 |
|---|---|---|
| Integer | 42, -100 | 64位整数 |
| Float | 3.14, -0.5 | 64位浮点数 |
| String | ‘hello’, “world” | Unicode字符串 |
| Boolean | true, false | 布尔值 |
2.2 时间类型 #
| 类型 | 示例 | 说明 |
|---|---|---|
| Date | date(‘2024-01-15’) | 日期 |
| Time | time(‘14:30:00’) | 时间 |
| LocalTime | localtime(‘14:30:00’) | 本地时间 |
| DateTime | datetime(‘2024-01-15T14:30:00’) | 日期时间 |
| Duration | duration(‘P1D’) | 时间间隔 |
2.3 空间类型 #
| 类型 | 示例 | 说明 |
|---|---|---|
| Point | point({x:1, y:2}) | 点坐标 |
| Point | point({lat:40.7, lon:-74.0}) | 地理坐标 |
2.4 集合类型 #
| 类型 | 示例 | 说明 |
|---|---|---|
| List | [1, 2, 3] | 列表 |
| List | [‘a’, ‘b’, ‘c’] | 字符串列表 |
2.5 不支持的类型 #
text
不支持作为属性值:
├── Map(映射)
├── Node(节点引用)
├── Relationship(关系引用)
├── Path(路径引用)
└── 嵌套的复杂结构
三、属性操作 #
3.1 创建时设置属性 #
cypher
CREATE (p:Person {
name: 'Tom',
age: 30,
active: true,
tags: ['developer', 'designer']
})
3.2 查询属性 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN p.name, p.age
MATCH (p:Person)
RETURN p['name'], p['age']
3.3 添加属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p.email = 'tom@example.com'
3.4 更新属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p.age = 31
3.5 批量设置属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p += {
age: 31,
email: 'tom@example.com',
city: 'New York'
}
3.6 替换所有属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p = {
name: 'Tom',
age: 31,
email: 'tom@example.com'
}
3.7 删除属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p.age = NULL
MATCH (p:Person {name: 'Tom'})
REMOVE p.age
四、属性函数 #
4.1 properties函数 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN properties(p) AS all_properties
4.2 keys函数 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN keys(p) AS property_keys
MATCH ()-[r]->()
RETURN keys(r) AS rel_property_keys
4.3 coalesce函数 #
cypher
MATCH (p:Person)
RETURN coalesce(p.nickname, p.name, 'Unknown') AS display_name
4.4 检查属性是否存在 #
cypher
MATCH (p:Person)
WHERE p.email IS NOT NULL
RETURN p.name, p.email
MATCH (p:Person)
WHERE p.email IS NULL
RETURN p.name
五、属性查询 #
5.1 按属性值查询 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN p
MATCH (p:Person)
WHERE p.age > 25
RETURN p
5.2 多属性条件 #
cypher
MATCH (p:Person)
WHERE p.name = 'Tom' AND p.age > 25
RETURN p
5.3 属性范围查询 #
cypher
MATCH (p:Person)
WHERE p.age >= 20 AND p.age <= 30
RETURN p
5.4 属性IN查询 #
cypher
MATCH (p:Person)
WHERE p.name IN ['Tom', 'Jerry', 'Mike']
RETURN p
5.5 属性正则匹配 #
cypher
MATCH (p:Person)
WHERE p.name =~ 'T.*'
RETURN p
5.6 属性存在性检查 #
cypher
MATCH (p:Person)
WHERE exists(p.email)
RETURN p
六、属性统计 #
6.1 统计属性使用情况 #
cypher
MATCH (n)
WITH n, keys(n) AS props
UNWIND props AS prop
RETURN prop, count(*) AS usage_count
ORDER BY usage_count DESC
6.2 按标签统计属性 #
cypher
MATCH (n:Person)
WITH n, keys(n) AS props
UNWIND props AS prop
RETURN prop, count(*) AS usage_count
ORDER BY usage_count DESC
6.3 查找特定属性的节点 #
cypher
MATCH (n)
WHERE n.name IS NOT NULL
RETURN n
七、NULL值处理 #
7.1 NULL的特点 #
text
NULL特点:
├── 表示缺失或未知的值
├── NULL与任何值比较都返回NULL
├── NULL参与运算返回NULL
├── 需要使用IS NULL/IS NOT NULL判断
└── 可以用于删除属性
7.2 NULL判断 #
cypher
MATCH (p:Person)
WHERE p.middle_name IS NULL
RETURN p
MATCH (p:Person)
WHERE p.middle_name IS NOT NULL
RETURN p
7.3 NULL处理函数 #
cypher
MATCH (p:Person)
RETURN
p.name,
coalesce(p.middle_name, 'N/A') AS middle_name,
coalesce(p.age, 0) AS age
7.4 NULL传播示例 #
cypher
RETURN
null + 1 AS result,
null * 2 AS result2,
null = null AS result3
八、列表属性 #
8.1 创建列表属性 #
cypher
CREATE (p:Person {
name: 'Tom',
tags: ['developer', 'designer', 'manager'],
scores: [85, 90, 78, 92]
})
8.2 查询列表属性 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN p.tags, p.scores
8.3 列表元素访问 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN
p.tags[0] AS first_tag,
p.tags[-1] AS last_tag,
p.tags[1..3] AS range_tags
8.4 列表条件查询 #
cypher
MATCH (p:Person)
WHERE 'developer' IN p.tags
RETURN p
8.5 更新列表属性 #
cypher
MATCH (p:Person {name: 'Tom'})
SET p.tags = p.tags + ['architect']
8.6 列表属性函数 #
cypher
MATCH (p:Person {name: 'Tom'})
RETURN
size(p.tags) AS tag_count,
head(p.scores) AS first_score,
last(p.scores) AS last_score
九、时间属性 #
9.1 创建时间属性 #
cypher
CREATE (e:Event {
name: 'Conference',
date: date('2024-06-15'),
start_time: time('09:00:00'),
end_time: time('17:00:00'),
created_at: datetime()
})
9.2 查询时间属性 #
cypher
MATCH (e:Event)
WHERE e.date > date('2024-01-01')
RETURN e
9.3 时间运算 #
cypher
MATCH (e:Event)
RETURN
e.date + duration('P1D') AS next_day,
e.date - duration('P1W') AS last_week
9.4 时间属性函数 #
cypher
MATCH (e:Event)
RETURN
e.date.year AS year,
e.date.month AS month,
e.date.day AS day
十、空间属性 #
10.1 创建空间属性 #
cypher
CREATE (l:Location {
name: 'New York',
coordinates: point({latitude: 40.7128, longitude: -74.0060})
})
10.2 查询空间属性 #
cypher
MATCH (l:Location)
RETURN l.name, l.coordinates
10.3 空间距离查询 #
cypher
MATCH (l:Location)
WITH l, point({latitude: 40.7, longitude: -74.0}) AS center
WHERE point.distance(l.coordinates, center) < 10000
RETURN l
十一、属性命名规范 #
11.1 命名风格 #
text
推荐命名风格:
├── 小驼峰命名:firstName, lastName, createdAt
├── 或下划线命名:first_name, last_name, created_at
├── 保持一致性
└── 避免混合风格
11.2 命名建议 #
text
建议:
├── 使用有意义的名称
├── 避免缩写(除非通用)
├── 布尔属性使用is/has前缀
├── 时间属性使用_at后缀
└── 避免使用保留字
11.3 常见属性命名 #
| 属性类型 | 推荐命名 |
|---|---|
| 标识 | id, uuid, code |
| 名称 | name, title, label |
| 描述 | description, summary, content |
| 状态 | status, state |
| 布尔 | isActive, hasPermission |
| 时间 | createdAt, updatedAt, deletedAt |
| 数量 | count, quantity, amount |
| 金额 | price, cost, total |
十二、属性设计最佳实践 #
12.1 属性选择原则 #
text
原则:
├── 属性应描述实体本身的特征
├── 关系属性应描述关系的特征
├── 避免存储可计算的数据
├── 避免存储冗余数据
└── 考虑查询性能
12.2 属性数量建议 #
text
建议:
├── 节点属性:建议不超过50个
├── 关系属性:建议不超过10个
├── 列表元素:建议不超过100个
└── 字符串长度:建议不超过10KB
12.3 索引属性 #
cypher
CREATE INDEX FOR (p:Person) ON (p.email)
CREATE INDEX FOR (p:Person) ON (p.name, p.age)
12.4 唯一约束属性 #
cypher
CREATE CONSTRAINT FOR (p:Person) REQUIRE p.id IS UNIQUE
CREATE CONSTRAINT FOR (p:Person) REQUIRE p.email IS UNIQUE
12.5 避免反模式 #
text
避免:
├── 存储大型二进制数据
├── 存储嵌套的复杂结构
├── 过多的属性
├── 冗余的属性
└── 不一致的命名
十三、实际应用示例 #
13.1 用户属性 #
cypher
CREATE (u:User {
id: 'user_001',
username: 'tom_hanks',
email: 'tom@example.com',
firstName: 'Tom',
lastName: 'Hanks',
isActive: true,
roles: ['admin', 'editor'],
preferences: {
theme: 'dark',
language: 'en'
},
createdAt: datetime(),
updatedAt: datetime()
})
13.2 产品属性 #
cypher
CREATE (p:Product {
id: 'prod_001',
name: 'iPhone 15',
description: 'Latest iPhone model',
price: 999.99,
category: 'Electronics',
tags: ['phone', 'apple', 'smartphone'],
stock: 100,
isActive: true,
createdAt: datetime()
})
13.3 订单属性 #
cypher
CREATE (o:Order {
id: 'order_001',
orderNumber: 'ORD-2024-001',
status: 'pending',
totalAmount: 1999.98,
currency: 'USD',
items: [
{productId: 'prod_001', quantity: 2, price: 999.99}
],
shippingAddress: {
street: '123 Main St',
city: 'New York',
zip: '10001'
},
createdAt: datetime()
})
十四、总结 #
属性操作要点:
| 操作 | 语法 | 说明 |
|---|---|---|
| 创建 | 创建时设置属性 | |
| 查询 | n.key 或 n[‘key’] | 访问属性 |
| 更新 | SET n.key = value | 更新属性 |
| 删除 | SET n.key = NULL | 删除属性 |
| 批量 | SET n += | 批量更新 |
最佳实践:
- 使用有意义的属性名
- 保持命名风格一致
- 合理使用NULL值
- 为常用查询属性创建索引
- 避免存储过多属性
下一步,让我们学习标签!
最后更新:2026-03-27