Skip to content

Commit

Permalink
add BFS > DFS
Browse files Browse the repository at this point in the history
  • Loading branch information
whitewum committed Jun 17, 2021
1 parent fa471d0 commit c1c25da
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions docs-2.0/8.service-tuning/2.graph-modeling.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ Nebula Graph {{ nebula.release }} 是强 schema 的系统,这意味着业务

例如,在一个业务模型中,人的属性部分是相对固定的:“年龄”,“性别”,“姓名”;而部分是相对会发生改变的,“通信好友”,“出入场所”,“交易账号”,“登录设备”;前者适合建模为属性,后者适合建模为点-边关系。

### 合理设置边属性
### 广度优先 > 深度优先

- Nebula Graph 基于图拓扑结构进行深度图遍历的性能较低,但是广度优先遍历以及获取属性的性能较好。因此为了减少遍历深度,请使用点属性代替边。例如,模型a包括姓名、年龄、眼睛颜色三种属性,建议创建一个标签`person`,然后为它添加姓名、年龄、眼睛颜色的属性。如果创建一个包含眼睛颜色的标签和一个边类型`has`,然后创建一个边用来表示人拥有的眼睛颜色,这种建模方法会降低遍历性能。
- Nebula Graph 基于图拓扑结构进行深度图遍历的性能较低,广度优先遍历以及获取属性的性能较好。例如,模型a包括姓名、年龄、眼睛颜色三种属性,建议创建一个标签`person`,然后为它添加姓名、年龄、眼睛颜色的属性。如果创建一个包含眼睛颜色的标签和一个边类型`has`,然后创建一个边用来表示人拥有的眼睛颜色,这种建模方法会降低遍历性能。

- 为边创建属性时请勿使用长字符串:虽然 Nebula Graph 支持在边上存储长字符串属性,但是这些属性会同时保存在出边和入边,注意写入放大问题(write amplification)
- “通过边属性获取边”的性能与“通过点属性获取点”的性能是接近的。在一些数据库中,会建议将边上的属性重新建模为中间节点的属性:例如 `(src)-[edge {P1, P2}]->(dst)``edge` 上有属性 `P1, P2`,会建议建模为 `(src)-[edge1]->(i_node {P1, P2})-[edge2]->(dst)`。在 Nebula Graph {{ nebula.release }} 中可以直接使用 `(src)-[edge {P1, P2}]->(dst)`,减少遍历深度有助于性能

### 利用边的方向
### 边的方向

查询时,如果需要使用边的逆向查询,可以用如下语法:

Expand All @@ -54,6 +54,10 @@ Nebula Graph {{ nebula.release }} 是强 schema 的系统,这意味着业务

参考[点VID一节](../1.introduction/3.vid.md)

### 长文本

为边创建属性时请勿使用长文本:这些属性会被[存储2份](../1.introduction/3.nebula-graph-architecture/4.storage-service.md),导致写入放大问题(write amplification)。此时建议将长文本放在 HBase/ES 中,将其地址存放在 Nebula Graph 中。

## 不能支持动态时序图

在某些场景下,图需要同时带有时序信息,以描述整个图的结构随着时间变化的情况。Nebula Graph {{ nebula.release }} 的边可以使用 rank 字段存放时间信息(int64),但是点上没有字段可以存放时间信息(存放在属性会被新写入覆盖)。因此不能支持动态时序图。

0 comments on commit c1c25da

Please sign in to comment.