一、Neo4j简介
Neo4j是NoSQL中的图数据库,具有原生处理功能和原生图存储功能。在Neo4j中,数据分为两种:节点和边。节点代表具体的实体,类似关系数据库中行记录的概念;边代表节点之间的连接,这种连接可以是概念,也可以是具体的事物,因此节点和边都拥有自己的属性。
上图是Neo4j的一个简单网络,不同的节点和边拥有不同的属性,且不同节点之间由不同的边连接,可以发现Neo4j中的网络比MongoDB的BSON结构更加灵活。
二、Neo4j存储
节点和关系的存储文件是固定大小的。
节点使用单向链表存储,第一个字节表示是否被使用的标识位,后四个字节代表连接该节点的第一个关系的ID,再四个字节代表该节点第一个属性的ID,再五个字节代表节点的标签的指针,最后一个字节作为保留位。
关系使用双向链表存储,第一个字节表示是否被使用的标识位,后四个字节表示连接该关系的第一个节点的ID,再四个字节表示连接该关系的最后一个节点的ID,再四个字节表示关系的类型,然后是第一个节点的前后关系以及最后一个节点的前后关系,再四个字节是该关系的属性的ID,最后一个字节指示当前记录是否位于链表的首位。
下图是物理存储的更加直观的表示形式。
三、Neo4j查询优化
几种优化思路如下:
- 增加索引
- 优化配置文件
- 增加服务器内存
- 增加ssd固态硬盘
后三种暂且不提,分析一下从索引角度出发的优化。
neo4j的索引分为三类:手动索引、自动索引和模式索引。手动索引需要人工创建和维护,自动索引需要修改配置文件且已被新版本摒弃,模式索引利用索引对应一组标签和属性,使索引随着节点的删除或更新自动删除或更新。
建立模式索引需要使用Cypher语句:
CREATE INDEX ON: label
除模式索引外,neo4j-3.5版本中增加了对ORDER BY的优化,可有通过使用节点属性索引提高排序性能。
参考文章
Linux中国:Neo4j 图数据库基础zhuanlan.zhihu.com