最近在做一个各应用间的调用关系展示的项目,想想各应用间的关系图就像一个社交网络。传统的关系型数据MySql确实可以解决问题,但是想尝试下新的技术(工具),因此就找到了Neo4j–世界领先的图数据库。
Neo4j简介: Why graph database?
What is Neo4j?
根据官网的说明,Neo4j是一个高度可扩展,面向图的数据库,不仅可存储数据信息,还可以存储数据之间的关系(relationship)。以下也类似官网的结构,依次从:1)架构、开发、运维;2)与传统关系型数据库和非关系型数据库的比较,两个方面做简要说明。
从架构、开发、运维的角度
便利的Model Schema:Node和Relation上的属性可随时增删,及时适应需求的变化。需求赶不上变化,传统基于Mysql的数据或基于NOSQL的,频繁增减字段的痛,只有经历过的人才懂。
提供了功能强大的查询语言Cypher ,支持常规的ACID操作,能够覆盖从各种角度/维度去查询数据的需求。类似MySql提供了”explain”解析你的查询语句,碰到慢查询帮你你定位真正的原因。
提供了一个易于上手的Web Playboard。其中自带的Demo例子就足够让你了解图数据库的强大,修修改改你就基本能让你的需求原型跑起来。
提供Java, C#, Python和JavaScript的驱动(driver)。对于java,还有spring-data, jdbc等类似的接入方式。因此对于现有项目,极易集成。
部署方式,可以集群的方式部署,设置数据备份数量,master的选举和failover机制,保证你的服务高可用。另外,商业版还有个特色功能,集群自动弹性扩展。
支持csv的方式导入数据。这就意味着,产品经理给你发过来的excel,无需额外开发,就上手可用啦!
Neo4j vs. Relation Database and NOSQL Database
建模
- 毫无疑问,关系型数据库(RDBMS)需要”稳定“的Model,针对图的场景,只能引入外键或不必要的冗余数据,而且模型难以理解和扩展(例如某些字段/属性放在任意一个子表里都不合适)。
- 而NOSQL,确实没有类似的问题,它的问题是Model的schema必须经过精心的设计(例如,如何高效的存,如何针对查询设计rowkey等)。好的设计与坏的设计,在工程实现、查询使用性能上都有着天壤之别(熟练的大数据工程师和普通工程师的区别)。
- 而Neo4J既具有NOSQL的好处,也有面向人类理解的建模方式。”图“即model,产品经理和工程师在白板上画的图,就是工程师需要实现的model!并且通过它自带的Web Browser,所见即所得。在原型阶段,你就能拿着东西和产品经理、架构师讨论你的设计!!!(三个感叹号的意思是这个太有用了,节约你宝贵的生命。帮你把原先交流沟通返工的时间,更多的投入到你最喜欢的coding之中。)
查询
- RDBMS来实现图,势必需要众多外键join的方式(正常人肯定不会就设计一张大表来解决这个问题),更不用说写入时需校验各维度字段的有效性和关联性等等。效率不言而喻。
- NOSQL。相对于RDBMS的SQL查询语言,NOSQL的写入查询基本都是按照需求和建模个性化定制的,扩展和兼容新旧版本就极其困难。(貌似也有类似的apache开源项目在做类似的通用的SQL)
- Cypher,Neo4j的SQL。通用易学好用。
总结
如果你的需求模型是一个基于图的,赶紧试试Neo4j。它真的可以节约你的生命。
本系列的提纲: From designer to developer, then Operator
本系列文章会摘取官网上的说明,让大家从”开发-建模”到“开发”到“运维”,三个方面对Neo4j有更深入的认识。
Model (link)
- 描述你的需求
- 提炼出Node和Relationship,把数据模型画下来。
- 针对查询需求,对着刚才的数据模型图把你所有的问题列出来。
- 将上步的问题转化为Cypher,确认你的模型能够解答你所有的问题。
done。
开发必读
TBD运维必读
TBD其他相关
- javascript集成:link
- Cypher详细说明
- Example Project
- Jetbrain IDE plugin: https://github.com/neueda/jetbrains-plugin-graph-database-support
- spring-data-neo4j: https://github.com/spring-projects/spring-data-neo4j
小试牛刀: Play demo from Docker Image
TBD