图数据库概念 #
一、图数据库概述 #
1.1 什么是图数据库 #
图数据库是一种以图结构存储和查询数据的数据库,由以下核心元素组成:
text
图数据库组成:
├── Vertex(顶点)- 代表实体
├── Edge(边)- 代表关系
└── Property(属性)- 顶点和边的属性
1.2 图数据库优势 #
| 优势 | 说明 |
|---|---|
| 关系表达 | 直观表达实体间关系 |
| 查询性能 | 关系遍历性能优异 |
| 灵活性 | 动态添加关系和属性 |
| 可视化 | 图形化展示数据关系 |
1.3 OrientDB图特性 #
text
OrientDB图特性:
├── 原生图存储
├── 支持属性图模型
├── SQL兼容的图查询
├── 支持图遍历
└── 多模型融合
二、属性图模型 #
2.1 属性图组成 #
text
属性图模型:
┌─────────────────────────────────────────┐
│ Property Graph │
├─────────────────────────────────────────┤
│ Vertex (顶点) │
│ ├── 唯一标识符 (RID) │
│ ├── 标签 (Label/Class) │
│ └── 属性 (Properties) │
├─────────────────────────────────────────┤
│ Edge (边) │
│ ├── 唯一标识符 (RID) │
│ ├── 类型 (Type/Class) │
│ ├── 方向 (Direction) │
│ ├── 起点顶点 (out) │
│ ├── 终点顶点 (in) │
│ └── 属性 (Properties) │
└─────────────────────────────────────────┘
2.2 图示例 #
text
社交网络图示例:
(Person:Tom)──KNOWS──>(Person:Jerry)
│ │
│ │
WORKS_AT WORKS_AT
│ │
▼ ▼
(Company:ABC) (Company:XYZ)
三、顶点(Vertex) #
3.1 顶点概念 #
顶点代表图中的实体节点:
text
顶点特点:
├── 继承自V类
├── 可以有多个标签(Class)
├── 可以有任意属性
├── 可以有入边和出边
└── 有唯一的RID
3.2 创建顶点类 #
sql
CREATE CLASS Person EXTENDS V
CREATE CLASS Company EXTENDS V
CREATE CLASS Product EXTENDS V
3.3 顶点属性 #
sql
CREATE CLASS Person EXTENDS V
CREATE PROPERTY Person.name STRING
CREATE PROPERTY Person.age INTEGER
CREATE PROPERTY Person.email STRING
CREATE PROPERTY Person.createdAt DATETIME
3.4 创建顶点 #
sql
CREATE VERTEX Person SET name = 'Tom', age = 30
CREATE VERTEX Person SET name = 'Jerry', age = 25
CREATE VERTEX Company SET name = 'ABC Corp', industry = 'Technology'
3.5 查询顶点 #
sql
SELECT FROM Person WHERE name = 'Tom'
SELECT FROM Person WHERE age > 25
SELECT FROM V WHERE @class = 'Person'
四、边(Edge) #
4.1 边概念 #
边代表顶点之间的关系:
text
边特点:
├── 继承自E类
├── 有方向性(有向边)
├── 可以有属性
├── 连接两个顶点
└── 有唯一的RID
4.2 边的方向 #
text
边方向:
├── out - 出边,从当前顶点出发
└── in - 入边,指向当前顶点
示例:
(A)──out──>(B)
<──in──
4.3 创建边类 #
sql
CREATE CLASS KNOWS EXTENDS E
CREATE CLASS WORKS_AT EXTENDS E
CREATE CLASS BOUGHT EXTENDS E
4.4 边属性 #
sql
CREATE CLASS KNOWS EXTENDS E
CREATE PROPERTY KNOWS.since INTEGER
CREATE PROPERTY KNOWS.level STRING
CREATE PROPERTY KNOWS.createdAt DATETIME
4.5 创建边 #
sql
CREATE EDGE KNOWS
FROM (SELECT FROM Person WHERE name = 'Tom')
TO (SELECT FROM Person WHERE name = 'Jerry')
SET since = 2020, level = 'close'
4.6 查询边 #
sql
SELECT FROM KNOWS WHERE since > 2020
SELECT FROM E WHERE @class = 'KNOWS'
五、图关系操作 #
5.1 查询出边 #
sql
SELECT outE('KNOWS') FROM Person WHERE name = 'Tom'
SELECT out('KNOWS') FROM Person WHERE name = 'Tom'
5.2 查询入边 #
sql
SELECT inE('KNOWS') FROM Person WHERE name = 'Jerry'
SELECT in('KNOWS') FROM Person WHERE name = 'Jerry'
5.3 查询双向关系 #
sql
SELECT
name,
out('KNOWS').name AS following,
in('KNOWS').name AS followers
FROM Person
5.4 关系计数 #
sql
SELECT
name,
SIZE(out('KNOWS')) AS followingCount,
SIZE(in('KNOWS')) AS followerCount
FROM Person
六、图模型设计 #
6.1 设计原则 #
text
图模型设计原则:
├── 顶点代表实体
├── 边代表关系
├── 属性存储详细信息
├── 边可以有属性
└── 合理设置边方向
6.2 实体识别 #
text
实体识别方法:
├── 名词通常是顶点
│ └── 用户、产品、订单...
├── 动词通常是边
│ └── 购买、关注、属于...
└── 形容词通常是属性
└── 名称、年龄、价格...
6.3 关系设计 #
text
关系设计考虑:
├── 是否需要方向
├── 是否需要属性
├── 是否需要多重关系
└── 查询模式
6.4 示例:社交网络 #
sql
CREATE CLASS User EXTENDS V
CREATE PROPERTY User.username STRING
CREATE PROPERTY User.email STRING
CREATE CLASS Post EXTENDS V
CREATE PROPERTY Post.title STRING
CREATE PROPERTY Post.content STRING
CREATE CLASS FOLLOWS EXTENDS E
CREATE PROPERTY FOLLOWS.since DATETIME
CREATE CLASS LIKES EXTENDS E
CREATE PROPERTY LIKES.createdAt DATETIME
CREATE CLASS POSTED EXTENDS E
6.5 示例:电商系统 #
sql
CREATE CLASS Customer EXTENDS V
CREATE CLASS Product EXTENDS V
CREATE CLASS Category EXTENDS V
CREATE CLASS Order EXTENDS V
CREATE CLASS BOUGHT EXTENDS E
CREATE PROPERTY BOUGHT.quantity INTEGER
CREATE PROPERTY BOUGHT.price DECIMAL
CREATE CLASS BELONGS_TO EXTENDS E
CREATE CLASS PLACED EXTENDS E
七、图与文档混合 #
7.1 混合模型优势 #
text
混合模型优势:
├── 图关系表达关联
├── 文档存储详细信息
├── 灵活选择查询方式
└── 兼顾性能和表达力
7.2 混合设计示例 #
sql
CREATE CLASS Person EXTENDS V
CREATE PROPERTY Person.name STRING
CREATE PROPERTY Person.address EMBEDDED
CREATE PROPERTY Person.preferences EMBEDDEDMAP
CREATE CLASS Order EXTENDS V
CREATE PROPERTY Order.items EMBEDDEDLIST
CREATE PROPERTY Order.shippingAddress EMBEDDED
CREATE CLASS KNOWS EXTENDS E
CREATE PROPERTY KNOWS.since INTEGER
八、图查询基础 #
8.1 邻居查询 #
sql
SELECT out('KNOWS') FROM Person WHERE name = 'Tom'
SELECT in('KNOWS') FROM Person WHERE name = 'Tom'
SELECT both('KNOWS') FROM Person WHERE name = 'Tom'
8.2 路径查询 #
sql
SELECT
name,
out('KNOWS').name AS friends,
out('KNOWS').out('KNOWS').name AS friendsOfFriends
FROM Person
8.3 条件过滤 #
sql
SELECT FROM Person WHERE out('KNOWS').size() > 5
SELECT FROM Person WHERE in('WORKS_AT').name = 'ABC Corp'
九、图约束 #
9.1 边约束 #
sql
CREATE CLASS WORKS_AT EXTENDS E
ALTER CLASS WORKS_AT CUSTOM outVertexClassNames = Person
ALTER CLASS WORKS_AT CUSTOM inVertexClassNames = Company
9.2 唯一关系 #
sql
CREATE INDEX unique_knows ON KNOWS (out, in) UNIQUE
9.3 必须属性 #
sql
ALTER PROPERTY KNOWS.since MANDATORY true
十、图可视化 #
10.1 Studio可视化 #
text
Studio图可视化:
├── 选择Graph视图
├── 执行查询
├── 自动生成图结构
└── 支持交互操作
10.2 查询可视化数据 #
sql
SELECT @rid, name, out('KNOWS') FROM Person LIMIT 50
十一、实际应用示例 #
11.1 社交网络模型 #
sql
CREATE CLASS User EXTENDS V
CREATE PROPERTY User.id STRING
CREATE PROPERTY User.username STRING
CREATE PROPERTY User.email STRING
CREATE CLASS FOLLOWS EXTENDS E
CREATE PROPERTY FOLLOWS.since DATETIME
CREATE VERTEX User SET id = 'u1', username = 'tom', email = 'tom@example.com'
CREATE VERTEX User SET id = 'u2', username = 'jerry', email = 'jerry@example.com'
CREATE EDGE FOLLOWS
FROM (SELECT FROM User WHERE id = 'u1')
TO (SELECT FROM User WHERE id = 'u2')
SET since = sysdate()
11.2 知识图谱模型 #
sql
CREATE CLASS Entity EXTENDS V
CREATE PROPERTY Entity.name STRING
CREATE PROPERTY Entity.type STRING
CREATE CLASS Concept EXTENDS V
CREATE PROPERTY Concept.name STRING
CREATE CLASS RELATED_TO EXTENDS E
CREATE PROPERTY RELATED_TO.relationType STRING
CREATE PROPERTY RELATED_TO.weight FLOAT
CREATE VERTEX Entity SET name = 'Python', type = 'Language'
CREATE VERTEX Concept SET name = 'Programming'
CREATE EDGE RELATED_TO FROM #12:0 TO #12:1 SET relationType = 'is_a', weight = 0.9
11.3 推荐系统模型 #
sql
CREATE CLASS User EXTENDS V
CREATE CLASS Item EXTENDS V
CREATE CLASS VIEWED EXTENDS E
CREATE PROPERTY VIEWED.duration INTEGER
CREATE PROPERTY VIEWED.timestamp DATETIME
CREATE CLASS PURCHASED EXTENDS E
CREATE PROPERTY PURCHASED.quantity INTEGER
CREATE PROPERTY PURCHASED.price DECIMAL
SELECT item.name, COUNT(*) AS viewCount
FROM (
SELECT out('VIEWED') AS item FROM User WHERE id = 'user1'
)
GROUP BY item
ORDER BY viewCount DESC
十二、总结 #
图数据库概念要点:
| 概念 | 说明 |
|---|---|
| Vertex | 顶点,代表实体 |
| Edge | 边,代表关系 |
| Property | 属性,存储信息 |
| out/in | 出边/入边方向 |
| Property Graph | 属性图模型 |
下一步,让我们学习顶点与边操作!
最后更新:2026-03-27