现实中很多数据都是用图来表达的,比如社交网络中人与人的关系、新冠疫情传播链,基因序列等等。
关系型数据库(RDBMS)并不适合表达这类数据,而且由于海量数据的存在,RDBMS处理起来效率也堪忧。
NoSQL数据库的兴起,很好地解决了海量数据的存放问题,图数据库也是NoSQL的一个分支,相比于NoSQL中的其他分支,它很适合用来原生表达图结构的数据。
下面一张图说明,相比于其他NoSQL,图数据库存放的数据规模有所下降,但是更能够表达复杂的数据。

通常来说,一个图数据库存储的结构就如同数据结构中的图,由顶点和边组成。
Neo4j是图数据库中一个主要代表,其开源,且用Java实现。经过几年的发展,已经可以用于生产环境。
其有两种运行方式,一种是服务的方式,对外提供REST接口;另外一种是嵌入式模式,数据以文件的形式存放在本地,可以直接对本地文件进行操作。
对于Neo4J图数据库来说,要想真正吃透理解,其存储模型是必须要吃透的,同时他们的文件结构也需要熟知。
1. neo4j 的存储模型

neo4j 的存储模型:
节点保存的是第一个属性和第一个关系ID。
节点的关联关系是一个双向列表
节点和关系的属性(Property)是用一个 Key-Value 的双向列表来保存的;
通过上述存储模型,从一个Node-A开始,可以方便的遍历以该Node-A为起点的图。

我们可以举一个例子来了解一下Neo4J的存储模型:在下面的这个例子中,A~E表示Node 的编号,R1~R7 表示 Relationship
编号,P1~P10 表示Property
的编号。
Node 的存储示例图如下,每个Node
保存了第1个Property
和 第1个Relationship
:

2. neo4j graph db的存储文件介绍
当我们下载neo4j-community-2.1.0-M01 并安装,然后拿 neo4j embedded-example 的EmbeddedNeo4j 例子跑一下,可以看到在target/neo4j-hello-db下会生成如下neo4j graph db 的存储文件。
对于节点(NODE)的存储主要有如下的4个文件:

对于节点关系(RELATIONSHIP)的存储,主要有如下的8个文件:

对于属性( property) 的存储,主要有如下的10个文件:

3. 总结
图的四大特性:节点(NODE),关系(Relationship),属性(PROPERTY),标签(LABELS)均是以数组作为核心存储结构的。
同时对节点,属性,关系等类型的每个数据项都会分配一个唯一的ID,在存储时以该ID 为数组的下标。这样,在访问时通过其ID作为下标,实现快速定位。
所以在图遍历等操作时,才能达到更高的速度和效率。




