您的位置:首页 > 其它

Graph database_neo4j 底层存储结构分析(8)

gisblogs 2015-06-02 10:44 49 查看

3.8 示例1:neo4j_exam

下面看一个简单的例子,然后看一下几个主要的存储文件,有助于理解<3–neo4j存储结构>描述的neo4j 的存储格式。

3.8.1 neo4j_exm 代码

上述程序执行后,会在target/neo4j-test00.db 下生成 neo4j 的 db 存储文件,

下面我们看几个主要的存储文件,来帮助我们对 neo4j 的存储格式有个直观的认识。

为了看文件的内容,笔者用二进制方式打开neo4j_exam的db存储文件,并用虚拟打印机输出到pdf 文件,并根据每个文件的格式,进行了着色。

3.8.2 neostore.nodestore.db.id 的内容

打开neo4j_exam的neostore.nodestore.db.id文件看到如下内容:





id 文件的header 部分: sticky 值是0, nextFreeId是3,目前已回收可复用的 ID 是 02。

3.8.3 neostore.nodestore.db 的内容





从neo4j_exam的neostore.nodestore.db文件内容可以看到,文件中保存了有 3 条node record 几率的数组和一个字符串“NodeStore v0.A.2”(文件类型描述TYPE_DESCRIPTOR和 neo4j 的 ALL_STORES_VERSION构成)。

其中3 条 node record 的内容如下:

a) node_id=0 (即数组下标为0) 的node record 是在使用的, nextRelId=0, nextPropId=1, labels=0, extra=0

b) node_id=1 (即数组下标为0) 的node record 是在使用的, nextRelId=0, nextPropId=3, labels=0, extra=0

c) node_id=2 (即数组下标为0) 的node record 是已经释放了, nextRelId=1, nextPropId=4, labels=0, extra=0

结合 2.6.1 的源代码,可以的看到,fromNode 的 node_id=0, toNode的node_id=1, companyNode 的 node_id=2.

3.8.4 neostore.relationshipstore.db 的内容





从neo4j_exam的neostore.relationshipstore.db文件内容可以看到,文件中保存了有 2 条 relationship record记录的数组和一个字符串“RelationshipStore v0.A.2”(文件类型描述TYPE_DESCRIPTOR和 neo4j 的 ALL_STORES_VERSION构成)。

其中2 个 relationship record 的内容如下:

字段第1条记录第2条记录
in_use10
first_node00
second_node12
rel_type01
first_prev_rel_id12
first_next_rel_id-10
second_prev_rel_id11
second_next_rel_id-1-1
next_prop_id56
first-in-chain-markers33

3.8.5 neostore.relationshiptypestore.db的内容





record[0].name_id=0×01

record[1].name_id=0×02

3.8.6 neostore.relationshiptypestore.db.names 的内容





record[1]=”FELLOW”

record[2]=”BELONG”

3.8.7 neostore.propertystore.db的内容





type=0xB 表示 SHORT_STRING, type=0×9 表示 STRING.

因为 companyNode 节点和 belongRelationship 关系已经删除,所以其属性property[4], property[5] , property[7] 的 block_header (key,type,value)部分填充为0。

3.8.8 neostore.propertystore.db.strings的内容





打开neo4j_exam的neostore.nodestore.db.id文件看到如上内容:

第0个block 的前4个Bytes 保存 block_size=0×80, 即 block_header_size=8 和 string_block_size=120

第1个block 的保存例子中关系relationship的属性值一部分: < ["2013fubushi zhongguo fuhaobang:liyanhong no.3 mahuateng no.5 mayu no.8 ","liyanhong tui qinyingyong,mayu rugu liulanq >, 其中 block_header的值如下:link_block=0, in_use=1, nr_of_bytes=0x78 , next_block=2

第2个block 的保存例子中关系relationship的属性值一部分: < i; yidong rukou zhengduo anzhan shengji"] >, 其中 block_header的值如下:link_block=1, in_use=1, nr_of_bytes=0×28 , next_block=0xFFFFFFFF(即NULL)

3.8.9 neostore.propertystore.db.index的内容





record[0].name_id=01

record[1].name_id=02

record[2].name_id=03

record[3].name_id=04

3.8.10 neostore.propertystore.db.index.keys的内容





block[1]=”prop_key_table”

block[2]=”prop_key_name”

block[3]=”prop_key_event”

block[4]=”event”

4 参考

<graph databases>

http://blog.csdn.net/huaishu/article/details/11748927

http://www.neo4j.org.cn/old-docs/
标签: