Neptune核心概念 #
一、图数据库基础 #
1.1 什么是图数据库 #
图数据库是一种以图结构存储和查询数据的数据库,由顶点(节点)和边(关系)组成。
text
图数据库特点:
├── 以图结构存储数据
├── 顶点表示实体
├── 边表示关系
├── 属性存储详细信息
└── 适合处理复杂关系
1.2 与关系型数据库对比 #
| 特性 | 图数据库 | 关系型数据库 |
|---|---|---|
| 数据模型 | 图结构 | 表结构 |
| 关系表示 | 边直接连接 | 外键关联 |
| 查询方式 | 图遍历 | JOIN操作 |
| 复杂关系 | 高效 | 性能下降 |
| 扩展性 | 灵活 | 需要修改表结构 |
1.3 Neptune数据模型 #
Neptune支持两种数据模型:
text
数据模型:
├── 属性图(Property Graph)
│ ├── Gremlin查询语言
│ ├── 顶点(Vertex)
│ ├── 边(Edge)
│ └── 属性(Property)
└── RDF图
├── SPARQL查询语言
├── 三元组(Triple)
└── URI/字面量
二、属性图模型 #
2.1 顶点(Vertex) #
顶点表示图中的实体,如人、地点、事物等。
text
顶点组成:
├── 唯一标识符(ID)
├── 标签(Label)
└── 属性集合(Properties)
示例:
gremlin
// 创建顶点
g.addV('person').property('name', 'Tom').property('age', 30)
// 顶点结构
{
"id": "1",
"label": "person",
"properties": {
"name": ["Tom"],
"age": [30]
}
}
2.2 边(Edge) #
边表示顶点之间的关系。
text
边组成:
├── 唯一标识符(ID)
├── 标签(Label)
├── 方向(Direction)
│ ├── 出边(Out)
│ └── 入边(In)
├── 起始顶点(From)
├── 结束顶点(To)
└── 属性集合(Properties)
示例:
gremlin
// 创建边
g.addE('knows').from(V('1')).to(V('2')).property('since', 2020)
// 边结构
{
"id": "e1",
"label": "knows",
"outV": "1",
"inV": "2",
"properties": {
"since": [2020]
}
}
2.3 属性(Property) #
属性是附加在顶点或边上的键值对。
text
属性特点:
├── 键值对形式
├── 支持多值属性
├── 支持多种数据类型
└── 可附加元属性
支持的数据类型:
| 类型 | 示例 |
|---|---|
| String | “Tom” |
| Integer | 30 |
| Long | 1234567890L |
| Float | 3.14 |
| Double | 3.14159265359 |
| Boolean | true |
| Date | 2024-01-01 |
2.4 标签(Label) #
标签用于对顶点和边进行分类。
text
标签作用:
├── 分类顶点类型
├── 分类边类型
├── 加速查询过滤
└── 支持多标签
示例:
gremlin
// 顶点标签
g.addV('person')
g.addV('person').addV('employee')
// 边标签
g.addE('knows')
g.addE('works_at')
三、RDF图模型 #
3.1 三元组(Triple) #
RDF图的基本单元是三元组,由主语、谓语、宾语组成。
text
三元组结构:
├── 主语(Subject):资源URI
├── 谓语(Predicate):属性URI
└── 宾语(Object):资源URI或字面量
示例:
sparql
# 三元组示例
<http://example.org/Tom> <http://xmlns.com/foaf/0.1/name> "Tom" .
<http://example.org/Tom> <http://example.org/knows> <http://example.org/Jerry> .
3.2 资源(Resource) #
text
资源类型:
├── URI资源
│ └── 如:http://example.org/Tom
├── 空白节点(Blank Node)
│ └── 如:_:b1
└── 字面量(Literal)
├── 字符串:"Tom"
├── 带类型:"30"^^xsd:integer
└── 带语言:"Hello"@en
3.3 命名空间 #
sparql
# 命名空间定义
PREFIX ex: <http://example.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
# 使用命名空间
ex:Tom foaf:name "Tom" .
ex:Tom ex:knows ex:Jerry .
3.4 RDF图结构 #
text
┌─────────────────────────────────────────────────────┐
│ RDF图示例 │
│ │
│ ex:Tom ────foaf:name────▶ "Tom" │
│ │ │
│ │ │
│ ex:knows │
│ │ │
│ ▼ │
│ ex:Jerry ────foaf:name──▶ "Jerry" │
│ │ │
│ │ │
│ ex:worksAt │
│ │ │
│ ▼ │
│ ex:Company ────foaf:name──▶ "ACME Inc." │
└─────────────────────────────────────────────────────┘
四、属性图与RDF对比 #
4.1 概念映射 #
| 属性图 | RDF |
|---|---|
| 顶点(Vertex) | 资源(Resource) |
| 边(Edge) | 三元组(Triple) |
| 标签(Label) | rdf:type |
| 属性(Property) | 谓语(Predicate) |
| 属性值 | 宾语(Object) |
4.2 查询语言对比 #
属性图查询(Gremlin):
gremlin
// 查询Tom的朋友
g.V().has('name', 'Tom').out('knows').values('name')
RDF查询(SPARQL):
sparql
# 查询Tom的朋友
PREFIX ex: <http://example.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?friendName
WHERE {
ex:Tom foaf:name "Tom" .
ex:Tom ex:knows ?friend .
?friend foaf:name ?friendName .
}
4.3 选择建议 #
| 场景 | 推荐模型 | 原因 |
|---|---|---|
| 社交网络 | 属性图 | 关系建模直观 |
| 知识图谱 | RDF | 语义推理能力 |
| 欺诈检测 | 属性图 | 复杂遍历查询 |
| 数据集成 | RDF | 标准化数据模型 |
| 推荐系统 | 属性图 | 高效图遍历 |
五、图遍历基础 #
5.1 遍历概念 #
图遍历是指从图中的一个或多个顶点出发,沿着边访问其他顶点的过程。
text
遍历类型:
├── 深度优先遍历
├── 广度优先遍历
├── 路径遍历
└── 模式匹配
5.2 Gremlin遍历步骤 #
text
基本步骤:
├── V():获取所有顶点
├── E():获取所有边
├── out():出边遍历
├── in():入边遍历
├── both():双向遍历
├── outE():获取出边
├── inE():获取入边
└── bothE():获取所有边
示例:
gremlin
// 获取所有顶点
g.V()
// 获取所有边
g.E()
// 从顶点1出发,沿着出边遍历
g.V('1').out()
// 从顶点1出发,沿着knows边遍历
g.V('1').out('knows')
// 获取顶点1的所有出边
g.V('1').outE()
5.3 SPARQL图模式 #
sparql
# 基本图模式
SELECT ?s ?p ?o
WHERE {
?s ?p ?o .
}
# 带过滤的图模式
SELECT ?name
WHERE {
?person foaf:name ?name .
?person ex:age ?age .
FILTER (?age > 25)
}
# 可选图模式
SELECT ?name ?email
WHERE {
?person foaf:name ?name .
OPTIONAL { ?person foaf:mbox ?email }
}
六、图存储原理 #
6.1 存储结构 #
text
Neptune存储架构:
├── 分布式存储层
├── 索引层
│ ├── 顶点索引
│ ├── 边索引
│ └── 属性索引
├── 缓存层
│ └── 内存缓存
└── 持久化层
└── 分布式日志
6.2 索引机制 #
text
索引类型:
├── 主键索引
│ └── 顶点ID、边ID
├── 标签索引
│ └── 顶点标签、边标签
├── 属性索引
│ └── 属性键值对
└── 复合索引
└── 多属性组合
6.3 查询执行 #
text
查询执行流程:
├── 1. 解析查询语句
├── 2. 生成执行计划
├── 3. 优化执行计划
├── 4. 执行图遍历
├── 5. 过滤和转换
└── 6. 返回结果
七、事务模型 #
7.1 ACID特性 #
text
事务特性:
├── 原子性(Atomicity)
│ └── 事务要么全部成功,要么全部回滚
├── 一致性(Consistency)
│ └── 事务前后数据保持一致
├── 隔离性(Isolation)
│ └── 并发事务相互隔离
└── 持久性(Durability)
└── 提交后数据永久保存
7.2 隔离级别 #
text
Neptune隔离级别:
├── 快照隔离(Snapshot Isolation)
│ └── 读取事务开始时的数据快照
└── 并发控制
├── 乐观并发控制
└── 写入时加锁
7.3 事务示例 #
gremlin
// Gremlin事务(自动提交)
g.addV('person').property('name', 'Tom')
// 批量事务
g.addV('person').property('name', 'Tom').
addV('person').property('name', 'Jerry').
addE('knows').from(V().has('name', 'Tom')).to(V().has('name', 'Jerry'))
八、图算法概述 #
8.1 常用图算法 #
text
图算法分类:
├── 路径算法
│ ├── 最短路径
│ ├── 所有路径
│ └── 单源最短路径
├── 中心性算法
│ ├── PageRank
│ ├── 度中心性
│ └── 接近中心性
├── 社区发现算法
│ ├── 标签传播
│ ├── 连通分量
│ └── 强连通分量
└── 相似度算法
├── Jaccard相似度
└── 余弦相似度
8.2 Neptune ML #
text
Neptune ML功能:
├── 图神经网络
├── 节点分类
├── 链接预测
├── 节点回归
└── 边分类
九、最佳实践 #
9.1 数据建模 #
text
建模原则:
├── 顶点表示实体
├── 边表示关系
├── 属性存储详细信息
├── 标签用于分类
└── 避免过度嵌套
9.2 查询优化 #
text
优化建议:
├── 使用标签过滤
├── 使用属性索引
├── 限制遍历深度
├── 使用limit()限制结果
└── 避免全图扫描
9.3 性能考虑 #
text
性能要点:
├── 合理设计图模型
├── 控制顶点和边数量
├── 优化查询语句
├── 使用缓存
└── 监控查询性能
十、总结 #
核心概念要点:
| 概念 | 说明 |
|---|---|
| 顶点 | 图中的实体 |
| 边 | 实体之间的关系 |
| 属性 | 附加信息 |
| 标签 | 分类标识 |
| 遍历 | 图查询方式 |
下一步,让我们学习查询语言概述!
最后更新:2026-03-27