绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Neo4j:面向领域模型的图数据库--讲解与Eleme使用实战
2020-05-20 10:05:29

Neo4j:面向领域模型的图数据库

通常谈到数据库或数据存储,我们一般会立刻想到Mysql、SQLServer、Oracal等关系型数据库,或HBase、Redis、MongoDB等非关系型数据库。今天要介绍的图数据库--Neo4j也是一种非关系型数据库。

在工程项目中,数据存储的选择基本直接决定了开发和维护的难度。在技术选型时,如果应用场景不仅是模型自身的属性(例如,增删改查的逻辑等),还更关注模型之间的“关系”,那么就可以尝试使用Neo4j了。Neo4j使用图的概念:“节点”和“关系”来存储数据与数据间的关联,由于不需要固定的schema,可以随项目发展扩展节点上的属性,带来优于传统数据库的便利行和扩展能力。

还是举例来讨论其中的异同,假设我们为某高校开发一套最简单选课系统,分别使用MySql和Neo4j来实现。

我们和产品经理一番讨论需求后,抽象出“老师、学生、课程”三个概念,包含“老师授课”,“学生选课”两个关联关系,画一个模型图就如下所示:

采用MySql来实现,构建几个最基本的数据库表,可能如下:

其中可以看到为了实现达到数据库设计的“第三范式”,相关关联表中我们都必须带上相应数据的id,既要避免数据的冗余,又要串联起相互之间的关联关系。有过相关开发经验的朋友应该能理解,如果领域模型大多是多对多的关系,其中复杂的关联主键就可能要超过一半的数据库字段。而且这个简单的例子中只有三个概念,如果数量更多,关联关系会更复杂。如果是Neo4j,会是怎么样的一种实现方式呢?
首先,Neo4j里的模型设计就和我们最初的概念交互图一摸一样,可以用下面这个式子表示:

(:Student{name})-[:CHOOSE]->(:Course {name})<-[:TEACH]-(:Teacher{name})

其次,Neo4j里没有建表的流程,写入数据的过程就是构建具体的数据库--即数据的图。

CREATE (孙七:Student {name:'孙七'})
CREATE (周八:Student {name:'周八'})
CREATE (吴九:Student {name:'吴九'})

CREATE (计算机系统:Course {name: '计算机系统'});
CREATE (数据结构:Course {name: '数据结构'});

CREATE (张老师:Teacher {name:'张老师'})
CREATE (李老师:Teacher {name:'李老师'})
CREATE (王老师:Teacher {name:'王老师'})

CREATE (孙七)-[:CHOOSE]->(计算机系统)<-[:TEACH]-(张老师)
CREATE (孙七)-[:CHOOSE]->(数据结构)<-[:TEACH]-(李老师)
CREATE (周八)-[:CHOOSE]->(计算机系统)<-[:TEACH]-(张老师)
CREATE (周八)-[:CHOOSE]->(数据结构)<-[:TEACH]-(王老师)
CREATE (吴九)-[:CHOOSE]->(计算机系统)<-[:TEACH]-(张老师)
CREATE (吴九)-[:CHOOSE]->(数据结构)<-[:TEACH]-(王老师)

再把我们写入的数据全部查询出来,就得到了题图。

MATCH p=(:Student)-[:CHOOSE]->(:Course)<-[:TEACH]-(:Teacher) RETURN p

我们用和产品经理在白板上讨论出来的模型图,就能直接“搬”到我们的代码之中。真的就是这么简单,也就是Neo4j所说的“白板友好的设计”,简化了我们沟通和开发的流程。

实战:使用Neo4j构建复杂的应用依赖拓扑图

上文中,我们通过一个简单的例子了解到面向复杂的真实世界的模型时,最难的部分就是将领域模型转换成我们代码可执行、可高效运行、可维护的模型。而有了Neo4j,这一切都变得简单。接下来,我将拿ETrace团队之前用Neo4j做得一个元数据收集、统计、展示的项目做实战讲解。
先讲讲这个元数据项目的背景。ETrace是饿了么研发团队应用层监控的解决方案,是一个涵盖各语言应用客户端(Java、Python、NodeJS、Go等),从SOA调用,数据库访问,缓存读取,队列使用等全链路监控系统。通过分析应用埋点数据,我们可以获取应用与各组件之间的依赖和调用关系,相比于存储于配置管理系统中静态的信息,ETrace更能收集到实时的、真实的应用信息。适逢饿了么进行整体多活改造,急需一份真实有效的元数据信息,因此这个项目应运而生。

类似的,我们先做领域建模,仔细分析应用场景,抽象出来的领域模型有:“应用”,“机器”, “EZone(逻辑上的机房)”,“机房”,“SOA接口”,“数据库”,“队列”,“缓存”等。最终以“应用”为中心,(简化过的)依赖拓扑图由如下所示:

其中需要稍加解释的是,为什么“SOA接口”会单独成为一个“节点”。在开发工作中,我们常说“应用A调用了B的接口”,如果我们的需求仅是统计应用间相互的调用关系,那么可以把“SOA调用”作为一种“关系”来串联“应用”这个节点。但是实际需求是将统计维度细到“SOA接口”级别:某些核心应用的某个接口被数十个应用调用,与某些公共应用所有接口被数十应用调用体现出来的场景完全不同。因此,“统计到SOA接口级别”在这个需求驱动下,它可以独立成为一个“节点”。它的上游是提供接口的应用,下游是调用接口的应用,自身的属性可以是这个接口名。

剩下的工作就是根据领域模型代码实现。相关的代码开发与Neo4j Server的运维,实际不是真正的难点,难的是模型的抽象和分析需求场景。以下示范几个实际的关系图:

应用->机器->Ezone->机房的实例图
应用-(调用)->SOA接口<-(提供)-应用

上面两张图是Neo4j Browser查询后自动生成的图,后来我们将相关关系集中展示到ETrace之中,例如可以直接看到应用它依赖的所有外部组件:

或分析提供SOA接口最多的应用或调用SOA接口最多的应用等信息,为业务升级和架构改造等提供决策信息:

Neo4j使用入门:用图来思考,现在就开始

讲完了实战,接下来我们运行一个实际的Neo4j实例来亲自试试:

  1. 下载Neo4j社区版:(社区版?是的,待会有说明)
  2. 下载完成后,解压。执行 ‘bin/neo4j start’命令启动neo4j。
  3. 浏览器中输入“http://localhost:7474”,会出现Neo4j的Browser。(第一次登录会让你修改默认的用户名和密码)

耶,成功!在输入框中输入“:play movie graph”,使用自带的Movie教程,开始探索“图”吧。自然除了手动下载压缩包外,Neo4j也是有官方Docker镜像等多种安装方式的。

Neo4j是使用Java开发的开源项目,客户端除了Java外还有.NetPythonJavascriptRubyPHPC/C++等等。理论上所有的编程语言都可以集成Neo4j,因为Neo4j提供了Restful API(Json格式的Cypher语句申明)及纯文本的Bolt协议来直接运行Cypher语句。

这个Cypher,就是在上文中类似自然查询语言的语句,是Neo4j使用的“SQL”。使用起来简单易学,通过查看它的说明文档,基本30分钟内可以上手。

最后说说Neo4j这款开源软件背后的公司。他们最初的三位创始人从2000年开始开发Neo4j原型版本,2002年开发完成并于2003年投入生产环境使用。到了2007年他们正式成立了一家也叫做Neo4j的公司,经过四轮数千万美元的投资后,现在这款产品越做越好,从初创公司到世界500强都有他们的客户。意思就是,Neo4j公司是要盈利的,所以Neo4j有开源的社区版(Community Edition)和收费的企业版(Enterprise Edition)就可以理解了。两者最显著的区别是,社区版就是“单机版”,集群模式和HA高可用只有企业版才支持。所以,社区版在水平扩展和可靠性上有很大的局限性,而据称企业版费用昂贵。“没有免费的商业化开源产品”,总是这个道理。

最后

这篇文章中我们简单介绍了面向领域建模的图数据库Neo4j,并介绍了在ETrace团队在元数据项目中使用Neo4j构建了应用依赖的拓扑图,最后讲解了Neo4j的使用入门。大家可以尝试Neo4j,并希望它能解决各位项目中的难题。


相关文档

官网: Neo4j, the world&amp;amp;amp;amp;amp;#x27;s leading graph database - Neo4j Graph Database
Cypher: 介绍, cheatsheet
Neo4j Java Driver: neo4j/neo4j-java-driver
使用Neo4j进行全栈Web开发: infoq.com/cn/articles/f

最后的两点说明:

1.文中所有示例数据均为测试环境开发数据,非正式数据。
2.细心的读者可能会发现第一节的Neo4j实现的选课示例中,两个老师同时授课“数据结构”时他们都关联到了同一个“数据结构”的节点上。现实世界中他们所教授的“数据结构”应是不同的课程,要修复这个问题在“Course”节点上加上课程编号即可区分同名的课程。
分享好友

分享这个小栈给你的朋友们,一起进步吧。

Neo4j 图形数据库
创建时间:2020-05-19 17:48:05
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。 Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注.
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • ☀️
    专家
戳我,来吐槽~