【用TypeScript实现内存型图数据库】0x02:Dagoba内存型图数据库相关的类

导读

原文500 Lines or Less Dagoba: An In-Memory Graph Database中语言比较精炼,在讲解代码的时候并不是按照“先定义再引用”的顺序来展示的,而是倾向于把代码“语义化”来理解。所以会出现前面引用到的函数,后面还才会实现的情况。
再由于原作者使用了很多JavaScript语言的弱类型和动态解释的特性,导致难以像强类型和编译型语言一样通过语言本身的约束来推理代码意图,因为约束太弱导致可能性太多了。
所以这里重新整理一下,按照先提纲后细节的顺序,从整体设计讲起。

类图

这里的类图中的数据类型并不能做到完全准确,因为JavaScript是弱类型的语言,所以一个变量可以多次存放不同类型的值,而原实现里确实也这么做了。

图的存储结构

Dagoba里实现的图是有向图,顶点是具备_out_in出入边的。
由于原文用的是原生JS,也不是ES6的具备class的版本,所以“面向对象”的特性是通过原型+工厂方法实现的。这里为了便于理解,把它的用“原型+工厂模式”实现的概念,还原成类。

1
n
1
n
1
n
1
2
Graph
+Edge[] edges
+Vertex[] vertices
+Map<string, Vertex> vertexIndex
+number autoid
+addVertices(Vertices[] vertices)
+addEdges(Edges[] edges)
+addVertex(Vertex vertex)
+addEdge(Edge edge)
+findVerticesByIds(string[] ids) : Vertex[]
+findVertexById(string id) : Vertex
+v() : Query
+findVertices()
+searchVertices()
+findInEdges(Vertex vertex) : Edge[]
+findOutEdges(Vertex vertex) : Edge[]
+toString() : string
Vertex
+string _id
+Edge[] _out
+Edge[] _in
Edge
+Vertex _in
+Vertex _out

从上面可以看到,图的数据结构简单,只包含了顶点列表vertices,和边列表edges。另外,vertexIndex作为一个映射是用来检索根据ID检索顶点的。在后面的持久化中,我们可以看到,实际上只会对顶点列表和边列表进行持久化,不会对其他属性,包括vertexIndex这个ID-顶点的映射进行持久化。
Vertex顶点的属性则是:id唯一标识,_out出边列表,_in入边列表。
Edge边的属性则是:_in入方向顶点,_out出方向顶点。

查询类

1
n
1
n
1
n
1
1
1
1
Query
-Graph graph
-State[] state
-Program[] program
-Gremlin[] gremlins
+add(Program program)
+run() : Vertex
Program
+string pipetype
+object[] args
Gremlin
+string result
+Vertex vertex
+State state
State
+Vertex[] vertices
+Edge[] edges
+Gremlin gremlin
+number taken
+State as

查询类Query持有属性如下:

  • graph,要查询的图
  • state,查询时,执行步骤对应的状态(为了实现Pipetype流式处理和惰性计算)
  • program,查询时按优先级执行的步骤
  • gremlin,潜在的查询结果(命名来自Gremlin图遍历语言)

Program对应的属性则是:

  • pipetype,要执行的管道类型的名称
  • args,要执行的管道步骤的参数(保存参数用于惰性计算)

Gremlin潜在的查询结果对应的属性:

  • result,查询执行步骤对应的结果
  • vertex,潜在查询结果所属的顶点
  • state,查询执行步骤对应的状态

State执行步骤对应的状态的属性:

  • vertices,匹配该查询步骤的顶点列表
  • edges,查询步骤的gremlin对应的vertex的入边或出边列表
  • gremlin,当前查询步骤的潜在查询结果
  • taken,管道类型take的计数器,记录已经获取了多少个结果
  • as,管道步骤结果的标签,用于查询步骤结果等操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值