图数据库概念 #

一、图数据库概述 #

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