β

neo4j学习笔记

arganzheng's Weblog 147 阅读

一、图模型——Labeled Property Graph Model

二、查询语言——Cypher

Cypher is an expressive (yet compact) graph database query language.

TIPS 其他的图查询语言

底层API :TODO

三、图遍历——index-free adjacency

另一种方式是index-based adjacency,对应的开源图数据库有ArangoDB。关于两者的优劣有一个讨论: Index Free Adjacency or Hybrid Indexes for Graph Databases

个人认为如果分布式环境下,index-free adjacency要保证邻近节点能够尽量保存在同台机器,减少网络的交互才有意义。另外,index-free adjacency的拥护者在对比性能的时候一直说index-based adjacency需要O(log n),而它们只需要O(1),而实际上如果采用Hash索引,完全是可以达到O(1)性能的。事实上,ArangoDB在所有的性能测试中都是靠前的。

四、图存储

TIPS index-free adjacency的关键

fixed-sized records + pointer-like record IDs = index-free adjacency

将动态的关系分开存储,节点和关系只存储图结构,从而保证定长。这个是所谓的index-free adjacency的实现关键,在node节点中存放关系id,通过O(1)定位到关系记录而不是通常的O(log n)。

nodes

relationships

TIPS 关系存储中的双向链表

neo4j的关系记录中以双向链表的形式存储了from节点和to节点的整个关系链,方便对关系关联的节点进行关系遍历,这也是为什么节点记录只存储了起始节点指针的原因。

properties

其他的存储还有label存储、schema存储、版本信息存储、活跃日志存储等,这些相对不是很重要,这里就不展开了。

NOTES

Property的data部分采用了定长的8字节存储数据本身或者ID到变长数据(long string或者array)。但是对于int类型的数据8个字节有点浪费。所以新版的neo4j做了优化。具体参见 Neo4j High Performance (2015) 。总之,Property也是定长的。

五、图索引

With a graph database, most queries follow a pattern whereby an index is used simply to find a starting node (or nodes). The remainder of the traversal then uses a combination of pointer chasing and pattern matching to search the data store.

TIPS

六、缓存

七、事务

八、高可用(HA)

九、Scale

因为不支持sharding,所以其实图的大小和吞吐率(主要是写)是比较受限的。当然,引入sharding,对图分割的合理性是一个挑战,处理不好很容易引起剧烈的性能下降。 当然,对于neo4j,之所以不支持sharding,我觉得客观原因有如下两个:

  1. 因为它的index-free adjacency实现依赖于存储指针(ID),而这个指针能够快速转换成偏移量很大程度上依赖于本地定长记录,可以很方便快速的计算出记录的偏移量
  2. 入口节点/边的索引依赖于lucene,而分布式索引(类似于ES)的构建并不是一个简单的问题

不过即使不sharding,neo4j单机的性能还是可以的:

1、Capacity (graph size)

can support single graphs having tens of billions of nodes, relationships, and properties.

2、Latency (response time)

With a graph database, most queries follow a pattern whereby an index is used simply to find a starting node (or nodes). The remainder of the traversal then uses a combination of pointer chasing and pattern matching to search the data store.

3、Read and write throughput

作者:arganzheng's Weblog
原文地址:neo4j学习笔记, 感谢原作者分享。

发表评论