Ne04j
简介
- 一种Native graph database,即 本机图数据库系统。采用自定义的数据结构在本地硬盘存储图,而不是存在数据库关系型表中
- 开源 Java 实现
Neo4j 存储
- 顶点:node
- 边:relationship
- 顶点和边都可以有多个 key-value 对:成为 property
Neo4j 使用
- Cypher:Declarative query language(声明式查询语言)
- Traversal:Embedded Java lib
Cypher
Node
(name:type, {property_key:value, property_key:value...})
前面的 name:type 中,
name 表示该 Node 的名称
type 即为该 Node 的类型
后面的大括号内容中,即为多个 key-value 构成的 property
例子:
// 只有name
(Jerry)
// 有name,且有type
(Jerry:Dog)
// 有name,且有唐type,还有property
(Jerry:Dog, {name:"Jerry", sex:"male", age:"1"})
(爱玛:Vehicle,{name:"爱玛"})
Relationship
-[name:type, {property_key:value, property_key:value...}]->
其与 Node 的主要差别即为最外围的括号不是小括号,而是中括号,括号外还有形似箭头的组合字符。
-[:Cycling]->
-[:Cycling,{place:home, time: morning}]->
文件存储
分别存储所有的Node、Relationship 和 Property 的文件
- Node store、Ralationship store、Property store文件
- unique id:每个 node,relationship,property 都有自己的 unique id
Ralationship 双向链表
- 同一个 node 的 relationship 形成一个双向链表
- 链接指针为 relationship id
- 相应的 node 中记录链表的第一个 relation id
Property 单向链表
- 同一个 node/relationship 的 property 形成一个单向链表
- 链接指针为 next property id
- 链表第一个 property id 存在对应的 node/relationship 中
内存缓冲
OS 的文件系统有缓冲池,如页表
Node/Rel cache
- Neo4j 对 node,relationship 和 property 缓冲
- 内部的数据结构是以 node 和 relationship 为主要单位的,而 Property 是以附加形式加在 node 和 relationship 上
写文件
- 一个 transaction(即事务,对数据库的一次操作请求)的写先保存,直至 transaction.finish() 时,才真正尝试修改数据
- 采用了 transaction Log
HA,即 High Availability(高可用)
- 采用多副本
- 主副本把 transaction log 发送到从副本
- 从副本 replay log 从而执行同样的操作