`
weitao1026
  • 浏览: 1057991 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

Neo4j作为图形数据库,有其独特的数据存储结构。
数据存储主要分为节点、关系、节点或关系上属性这三类数据存储,这些数据也可以通过Lucene进行存储检索。





 

 

一个节点共占9个byte,,格式

 in_use(byte)+next_rel_id(int)+next_prop_id(int)

节点是否可用+最近一个关系的Id(-1表示无)+最近一个属性的Id(-1表示无)

通过每个节点Id号,很容易通过计算偏移量获取这个节点的相关数据。

 

[javascript] view plain copy
 
print?
  1. Node[0,used=true,rel=9,prop=-1]  
  2. Node[1,used=true,rel=1,prop=0]  
  3. Node[2,used=true,rel=2,prop=2]  
  4. Node[3,used=true,rel=2,prop=4]  
  5. Node[4,used=true,rel=4,prop=6]  
  6. Node[5,used=true,rel=5,prop=8]  
  7. Node[6,used=true,rel=5,prop=10]  
  8. Node[7,used=true,rel=7,prop=12]  
  9. Node[8,used=true,rel=8,prop=14]  
  10. Node[9,used=true,rel=8,prop=16]  
  11. Node[10,used=true,rel=10,prop=18]  
  12. Node[11,used=true,rel=11,prop=20]  
  13. Node[12,used=true,rel=11,prop=22]  
 Node[0,used=true,rel=9,prop=-1]
 Node[1,used=true,rel=1,prop=0]
 Node[2,used=true,rel=2,prop=2]
 Node[3,used=true,rel=2,prop=4]
 Node[4,used=true,rel=4,prop=6]
 Node[5,used=true,rel=5,prop=8]
 Node[6,used=true,rel=5,prop=10]
 Node[7,used=true,rel=7,prop=12]
 Node[8,used=true,rel=8,prop=14]
 Node[9,used=true,rel=8,prop=16]
 Node[10,used=true,rel=10,prop=18]
 Node[11,used=true,rel=11,prop=20]
 Node[12,used=true,rel=11,prop=22]



 

 

一个关系占33个byte,格式

directed|in_use(byte)+first_node(int)+second_node(int)+rel_type(int)+ first_prev_rel_id(int)+first_next_rel_id+second_prev_rel_id(int)+second_next_rel_id+next_prop_id(int)

是否可用+关系的头节点+关系的尾节点+关系类型+头节点的前一个关系Id+头节点的后一个关系id+尾节点的前一个关系Id+尾节点的后一个关系Id+关系的最近属性Id

其中节点的前一个或后一个关系Id,是怎么算出来的?

如果这个节点在添加关系过程中,如果是最初添加的则没有尾关系Id(-1表示),如果是最后一个关系则没有前一个关系Id(-1表示),中间添加的关系都应该有前一个和后一个关系Id,最终通过这些关系Id形成节点的关系列表。

 

[javascript] view plain copy
 
print?
  1. Relationship[0,used=true,source=1,target=0,type=0,sPrev=1,sNext=-1,tPrev=3,tNext=-1,prop=1]  
  2. Relationship[1,used=true,source=2,target=1,type=1,sPrev=2,sNext=-1,tPrev=-1,tNext=0,prop=3]  
  3. Relationship[2,used=true,source=3,target=2,type=2,sPrev=-1,sNext=-1,tPrev=-1,tNext=1,prop=5]  
  4. Relationship[3,used=true,source=4,target=0,type=0,sPrev=4,sNext=-1,tPrev=6,tNext=0,prop=7]  
  5. Relationship[4,used=true,source=5,target=4,type=1,sPrev=5,sNext=-1,tPrev=-1,tNext=3,prop=9]  
  6. Relationship[5,used=true,source=6,target=5,type=2,sPrev=-1,sNext=-1,tPrev=-1,tNext=4,prop=11]  
  7. Relationship[6,used=true,source=7,target=0,type=0,sPrev=7,sNext=-1,tPrev=9,tNext=3,prop=13]  
  8. Relationship[7,used=true,source=8,target=7,type=1,sPrev=8,sNext=-1,tPrev=-1,tNext=6,prop=15]  
  9. Relationship[8,used=true,source=9,target=8,type=2,sPrev=-1,sNext=-1,tPrev=-1,tNext=7,prop=17]  
  10. Relationship[9,used=true,source=10,target=0,type=0,sPrev=10,sNext=-1,tPrev=-1,tNext=6,prop=19]  
  11. Relationship[10,used=true,source=11,target=10,type=1,sPrev=11,sNext=-1,tPrev=-1,tNext=9,prop=21]  
  12. Relationship[11,used=true,source=12,target=11,type=2,sPrev=-1,sNext=-1,tPrev=-1,tNext=10,prop=23]  
Relationship[0,used=true,source=1,target=0,type=0,sPrev=1,sNext=-1,tPrev=3,tNext=-1,prop=1]
Relationship[1,used=true,source=2,target=1,type=1,sPrev=2,sNext=-1,tPrev=-1,tNext=0,prop=3]
Relationship[2,used=true,source=3,target=2,type=2,sPrev=-1,sNext=-1,tPrev=-1,tNext=1,prop=5]
Relationship[3,used=true,source=4,target=0,type=0,sPrev=4,sNext=-1,tPrev=6,tNext=0,prop=7]
Relationship[4,used=true,source=5,target=4,type=1,sPrev=5,sNext=-1,tPrev=-1,tNext=3,prop=9]
Relationship[5,used=true,source=6,target=5,type=2,sPrev=-1,sNext=-1,tPrev=-1,tNext=4,prop=11]
Relationship[6,used=true,source=7,target=0,type=0,sPrev=7,sNext=-1,tPrev=9,tNext=3,prop=13]
Relationship[7,used=true,source=8,target=7,type=1,sPrev=8,sNext=-1,tPrev=-1,tNext=6,prop=15]
Relationship[8,used=true,source=9,target=8,type=2,sPrev=-1,sNext=-1,tPrev=-1,tNext=7,prop=17]
Relationship[9,used=true,source=10,target=0,type=0,sPrev=10,sNext=-1,tPrev=-1,tNext=6,prop=19]
Relationship[10,used=true,source=11,target=10,type=1,sPrev=11,sNext=-1,tPrev=-1,tNext=9,prop=21]
Relationship[11,used=true,source=12,target=11,type=2,sPrev=-1,sNext=-1,tPrev=-1,tNext=10,prop=23]



 

 

一个属性默认占41个byte,格式

 1/*next and prev high bits*/ +4/*next*/  + 4/*prev*/  + DEFAULT_PAYLOAD_SIZE /*property blocks*/;

是否可用+前一个属性Id+后一个属性Id+属性块32个字节

PropertyRecords形成一个双向链表,每一个持有一个或多个PropertyBlocks的实际的属性键/值对。因为PropertyBlocks长度是可变的,一个完整的PropertyRecord可以只是一个PropertyBlock。

属性块格式:属性类型(8B)+属性值(如果非基础类型占8B)

属性键与属性值分别存储在不同的文件中。

属性记录属于动态存储格式。

为什么属性块要32个字节,还得慢慢看!

 

32个字节只是系统默认的大小。

一个节点如果有多个属性,一个属性记录集无法存下则通过下一个属性Id存储,最终通过上下属性Id完成列表连接。

DEFAULT_PAYLOAD_SIZE 是动态可变的,基础类型占一个8B,动态类型是类型占8B,值占8B,

如果属性值大于默认长度,则需要动态存储,类似数据库BLOB字段的存储。

 

Neo4j通过属性的header 计算属性的类型与属性所占字节数,仍不知道怎么计算出????

 

PropertyStore.encodeValue方法对属性数据进行编码处理。

LongerShortString对字符、数字等短字符进行编码,是否DEFAULT_PAYLOAD_SIZE可以存储下当前属性值。

对长字符或动态属性数据则通过动态方式存储。

 

动态存储格式:(in_use+next high)(1 byte)+nr_of_bytes(3 bytes)+next_block(int)

是否有效+字符长度+下一个块Id

属性值的加载都是延迟加载,除非前端需要获取属性值才会读取属性值,否则不会加载属性值。

 

通过生成的neo4j文件,输出节点、关系、属性了解他们之间的关系,数据存储结构的关系。

 

 

[javascript] view plain copy
 
print?
  1. Node[3,used=true,rel=2,prop=10]  
  2. header:1426063367 numBlocks:[1]  
  3. PropertyBlock[INT,key=7,value=5]  
  4. Property[10,used=true,prev=-1,next=9,PropertyBlock[INT,key=7,value=5]]  
  5. header:956301315 numBlocks:[1]  
  6. PropertyBlock[STRING,key=3,firstDynamic=3]  
  7. header:973078532 numBlocks:[1]  
  8. PropertyBlock[ARRAY,key=4,firstDynamic=3]  
  9. header:889192453 numBlocks:[1]  
  10. PropertyBlock[INT,key=5,value=3]  
  11. header:1157627910 numBlocks:[1]  
  12. PropertyBlock[INT,key=6,value=4]  
  13. Property[9,used=true,prev=10,next=8,PropertyBlock[STRING,key=3,firstDynamic=3],PropertyBlock[ARRAY,key=4,firstDynamic=3],PropertyBlock[INT,key=5,value=3],  
Node[3,used=true,rel=2,prop=10]
header:1426063367 numBlocks:[1]
PropertyBlock[INT,key=7,value=5]
Property[10,used=true,prev=-1,next=9,PropertyBlock[INT,key=7,value=5]]
header:956301315 numBlocks:[1]
PropertyBlock[STRING,key=3,firstDynamic=3]
header:973078532 numBlocks:[1]
PropertyBlock[ARRAY,key=4,firstDynamic=3]
header:889192453 numBlocks:[1]
PropertyBlock[INT,key=5,value=3]
header:1157627910 numBlocks:[1]
PropertyBlock[INT,key=6,value=4]
Property[9,used=true,prev=10,next=8,PropertyBlock[STRING,key=3,firstDynamic=3],PropertyBlock[ARRAY,key=4,firstDynamic=3],PropertyBlock[INT,key=5,value=3],
[javascript] view plain copy
 
print?
  1. DynamicRecord[3,used=true,light=true(99),type=0,data=null,next=-1]  
  2. DynamicRecord[3,used=true,light=true(17),type=0,data=null,next=-1]  
DynamicRecord[3,used=true,light=true(99),type=0,data=null,next=-1]
DynamicRecord[3,used=true,light=true(17),type=0,data=null,next=-1]
[javascript] view plain copy
 
print?
  1. PropertyBlock[INT,key=6,value=4]]  
  2. nextProp4294967295  
  3. header:-3348670910683938816 numBlocks:[2]  
  4. value block:1618  
  5. PropertyBlock[SHORT_STRING,key=0,value=Cypher]  
  6. header:371083010969174017 numBlocks:[1]  
  7. PropertyBlock[SHORT_STRING,key=1,value=test]  
  8. header:308431181316098 numBlocks:[1]  
  9. PropertyBlock[SHORT_STRING,key=2,value=QQ]  
  10. Property[8,used=true,prev=9,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Cypher],PropertyBlock[SHORT_STRING,key=1,value=test],PropertyBlock[SHORT_STRING,key=2,value=QQ]]  
PropertyBlock[INT,key=6,value=4]]
nextProp4294967295
header:-3348670910683938816 numBlocks:[2]
value block:1618
PropertyBlock[SHORT_STRING,key=0,value=Cypher]
header:371083010969174017 numBlocks:[1]
PropertyBlock[SHORT_STRING,key=1,value=test]
header:308431181316098 numBlocks:[1]
PropertyBlock[SHORT_STRING,key=2,value=QQ]
Property[8,used=true,prev=9,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Cypher],PropertyBlock[SHORT_STRING,key=1,value=test],PropertyBlock[SHORT_STRING,key=2,value=QQ]]

 

 

 

 

 

[javascript] view plain copy
 
print?
  1. Node[0,used=true,rel=9,prop=-1]  
  2. Node[1,used=true,rel=1,prop=0]  
  3. Property[0,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Neo122333],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
  4. Node[2,used=true,rel=2,prop=2]  
  5. Property[2,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Morpheus],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
  6. Node[3,used=true,rel=2,prop=4]  
  7. Property[4,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Cypher],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
  8. Node[4,used=true,rel=4,prop=6]  
  9. Property[6,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Neo122333],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
  10. Node[5,used=true,rel=5,prop=8]  
  11. Property[8,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Morpheus],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
  12. Node[6,used=true,rel=5,prop=10]  
  13. Property[10,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Cypher],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
  14. Node[7,used=true,rel=7,prop=12]  
  15. Property[12,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Neo122333],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
  16. Node[8,used=true,rel=8,prop=14]  
  17. Property[14,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Morpheus],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
  18. Node[9,used=true,rel=8,prop=16]  
  19. Property[16,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Cypher],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
  20. Node[10,used=true,rel=10,prop=18]  
  21. Property[18,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Neo122333],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
  22. Node[11,used=true,rel=11,prop=20]  
  23. Property[20,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Morpheus],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
  24. Node[12,used=true,rel=11,prop=22]  
  25. Property[22,used=true,prev=-1,next=-1,PropertyBlock[SHORT_STRING,key=0,value=Cypher],PropertyBlock[SHORT_STRING,key=1,value=QQ],PropertyBlock[INT,key=2,value=100]]  
分享到:
评论

相关推荐

    neo4j社区版 neo4j社区版neo4j社区版

    1. 图形数据模型:不同于传统的关系型数据库,Neo4j使用节点、边和属性来存储数据,这种模型更适合处理具有关联性、层次结构或复杂网络的数据。 2. Cypher查询语言:Cypher是一种声明式、易于理解的语言,用于查询...

    neo4j介绍.pptx

    Neo4j 是一个开源的 NoSQL 图数据库,应用图形理论存储实体之间的关系信息,以“图”这种数据结构做为逻辑结构存储和查询数据。Neo4j 具有高效存储和查询关联数据的优势,在需要表示多对多关系时,可以通过关系能够...

    Neo4j学习-Neo4j入门-Neo4j文档

    Neo4j是一款强大的图形数据库系统,它以节点、关系和属性的形式存储数据,适用于处理复杂的网络结构和关联数据。在“Neo4j学习-Neo4j入门-Neo4j文档”这个主题中,我们将深入探讨Neo4j的基本概念、安装与配置、查询...

    Linux的neo4j安装包

    1. **了解Neo4j**: Neo4j是一款NoSQL数据库,它以图形模型存储数据,其中节点代表实体,边代表实体之间的关系。这种数据结构使得查询复杂关系变得高效。 2. **下载安装包**: "neo4j-community-3.5.35"是Neo4j社区版...

    Neo4j官方中文文档-翻译

    Neo4j是一款先进的图形数据库系统,专注于处理复杂的网络数据结构。作为NoSQL数据库的一员,它以节点、边(关系)和属性的形式存储数据,特别适合处理具有关联性的数据,如社交网络、推荐系统、知识图谱等。这个...

    neo4j的jar文件

    Neo4j是一个强大的开源图数据库,它以图形结构来存储和处理数据,特别适合于处理具有复杂关系的数据。在Java环境中进行图数据库开发,Neo4j的JAR文件扮演着核心角色,它提供了丰富的API和功能,使得开发者能够轻松地...

    Centos 7.4_neo4j3.4.11企业版 + Haproxy 1.79 高可用集群部署.docx

    它使用图形结构来存储数据,而不是传统的表格结构。这使得它特别适合存储和查询复杂关系的数据。 Neo4j 高可用集群部署 高可用集群部署是指使用多个服务器来提供服务,以确保服务的可用性和可靠性。在这个文档中,...

    图数据库Neo4J的实践之路.pdf

    首先,Neo4J是一种基于图结构的数据库,它可以高效地存储和查询大量的图形数据。图结构由vertex和edge组成,vertex表示实体,edge表示实体之间的关系。 Neo4J使用property来存储 vertex 和 edge 的属性信息。 在...

    neo4j最新版,neo4j-community-4.2.3-windows.zip

    与传统的关系型数据库(如MySQL、PostgreSQL)不同,图形数据库以节点、边和属性的形式存储数据,这种结构特别适合表示和查询复杂的关联数据。在社交网络、推荐系统、知识图谱等领域,图形数据库展现出了其独特的...

    Neo4j 1.8 windows交流版

    图数据库的核心理念是将数据以节点、边和属性的形式存储,这样的结构非常适合处理高度关联的数据,例如社交网络、推荐系统和复杂关系分析等。 Neo4j 1.8作为其早期的一个稳定版本,提供了高效且易于使用的图数据模型...

    Neo4j Desktop Setup 1.4.15.windows.zip

    Cypher是Neo4j的图查询语言,用于创建、删除、查询和更新图结构。 6. **数据导入与导出**: - Neo4j Desktop支持从CSV、JSON、XML等多种格式导入数据,同时也方便导出数据到这些格式。这对于数据迁移和分析非常...

    Neo4j Developer Manual 3.0 Java

    - **图数据库**是一种使用图结构存储实体之间的关系的数据库类型,其中实体由节点表示,而它们之间的关系则通过边(即关系)来表达。 - **节点(Node)**:代表实体或对象。 - **关系(Relationship)**:节点之间的...

    neo4j-community-4.3.6-windows

    10. **图形建模工具**: Neo4j还提供了一些图形建模工具,如Neo4j Bloom,用于可视化数据模型,帮助用户理解和调整数据结构。 总之,"neo4j-community-4.3.6-windows"是Windows平台上的一个强大工具,适合那些需要...

    neo4j课件和代码

    6. 性能优化:学习如何通过索引、存储配置和硬件优化提高Neo4j的性能。 通过这门课程,无论你是初学者还是有一定经验的开发者,都能提升对Neo4j和知识图谱的理解,为实际项目中的数据管理和分析打下坚实基础。实际...

    neo4j-community-3.5.5-windows.zip

    传统的关系型数据库(如MySQL、PostgreSQL)以表格形式存储数据,而图形数据库则以节点、边和属性三元组的形式表示数据,更适合处理具有关联性或网络结构的数据,例如社交网络、推荐系统、知识图谱等。 Neo4j 社区...

    neo4j-community-3.5.12-windows.zip

    图数据库利用图形结构来存储和查询数据,其核心理念是节点、边(关系)和属性,这使得在处理网络、社交关系和多对多关系数据时更加高效。本文将详细介绍Neo4J社区版3.5.12在Windows环境下的安装步骤和基本使用方法。...

    neo4j-community-3.5.5

    知识图谱是一种结构化的数据模型,用于存储实体(如人、地点、事件)及其相互关系。使用Neo4j构建知识图谱,可以轻松地进行关联数据的查询和分析,有助于提升智能推荐、问答系统和数据挖掘的效率。 在压缩包子文件...

    neo4j-community-4.3.5-windows.zip

    Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中...

    neo4j-community-3.5.31-windows

    4. **图形浏览器**:内建的Neo4j Browser是一个图形化界面,用户可以通过它运行Cypher查询,查看和编辑数据库,以及可视化数据结构。 5. **插件支持**: Neo4j 社区版支持多种插件,可以扩展其功能,如连接其他数据...

Global site tag (gtag.js) - Google Analytics