属性(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 += 批量更新

最佳实践:

  1. 使用有意义的属性名
  2. 保持命名风格一致
  3. 合理使用NULL值
  4. 为常用查询属性创建索引
  5. 避免存储过多属性

下一步,让我们学习标签!

最后更新:2026-03-27