Skip to content

Latest commit

 

History

History
93 lines (49 loc) · 5.03 KB

graph-ocean-design.md

File metadata and controls

93 lines (49 loc) · 5.03 KB

Graph Ocean 设计文档

Graph Ocean 又名:Nebula Java ORM。

Session 管理

由于 nebula-java-client 中 Session 是由 NebulaPool 所产生,且 com.vesoft.nebula.client.graph.net.NebulaPool#getSession 每次获取 Session 都需要传入用户名、密码等不变配置,所以想要加强 Session 则需要同步加强 NebulaPool 类

image1

image2

加强的连接池管理和 Session 管理有如下优点:

  1. 获取 Session 时不用每次指定用户名、密码和重连次数,交由加强类管理;
  2. 微服务时代,每个应用通常只对应了一个图空间(space),加强之后不必每次指定 space;
  3. 加强类区分了查询和更新操作,并且查询封装了自己的返回 POJO,为实体类的转换打下基础。

注解定义

本套 ORM 框架是使用注解将实体映射到数据库元素的,有点仿 JPA 的意思。

注解包括:

  • GraphVertex:顶点 Tag
  • GraphEdge:边类型
  • GraphProperty:图属性

image3

image4

image5

其中包括主键策略(因为没有图空间实体映射,主键策略放在了顶点 TAG 的注解上),ID 是否作为属性、属性格式工厂等设置。

整体架构

精炼之后的整体骨架设计图如下:

image6

有了上面的注解定义,于是应该有注解解释器,将注解标注的实体映射成图空间中的元素,而元素也是一种抽象概念,它有两种形式:TAG 和 EDGE,这两种有很多共同的特性。

image7

image8

注解映射成抽象元素的过程,一般不常变,所以每次应用第一次解析成抽象实体之后,都应该缓存起来,所以有了缓存管理。

image9

将实体解析映射成抽象图元素以及抽象图元素的实体是一个复杂的解析过程,并且 Tag 和 Edge 的解析略有区别,所以区别对待。

image10

image11

image12

image13

image14

POJO 中的属性值和 Nebula 中的字段值不一定是一致的,所以需要向用户提供开放接口。

image15

在基础 Mapper 中封装了写和查询的方法,但写和查的引擎又是分开的。

image16

image17

image18

image19

image20

更新和查询都会运用缓存中的抽象元素实体,所以缓存中的元素统一由 GraphTypeManager 管理

image21

查询中可能会有一些比较复杂的语句,比如条件过滤,case when 等,所以引入了 GraphExpressionGraphCondition 两种概念,而 GraphCondition 又继承了 GraphExpression

image22

image23

结果返回封装类:QueryResult

上面的设计完成之后,再辅助一些工具类和异常管理,整个 ORM 框架即呼之欲出。