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