目录
图数据模型
查询语言
Neo4j简介
Neo4j图平台组件
安装Neo4j
快速入门
Cypher查询语言
说到图计算,很多人会觉得离自己很远。嗯,很多人大概的想法是这样的。
呃...我得把《离散数学》中的图论学一遍。
嗯...得学无向图、有向图、加权图、循环图、二部图、欧拉图、哈密顿图、平面图。
哈...最短路径、关键路径、DFS、BFS、生成树、PageRank、社群算法。
艹...我还是乖乖回去打王者吧。
理论的东西是蛮重要的,但如果你是一名应用型开发人员。用MySQL/Oracle的时候,95%你没有看一遍集合论、二元关系论。其实集合论、二元关系也不简单,一样有很多的理论作为背后的支撑,只是我们平时根本没有留意罢了。所以,但眼下,我们是一名应用开发人员,不管你是数据开发、还是业务系统开发,图相关的技术是不能不懂的,因为你发现,图可以用在很多地方。
因为小猴的项目用到了Neo4j(我喜欢称它为尼奥——对,没错,就是黑客帝国的救世主尼奥),所以就花了一点时间。把图数据库Neo4j和声明式图检索语言Cypher分享给大家。
1
图数据模型
年1月初,小猴写了一篇MySQL只是关系模型?心塞!80%的后端开发不知道的融合数据模型!。其中提到了,数据与数据之间的关系决定应该使用什么样的数据模型来组织。如果数据之间存在大量的多对多关系,虽然我们可以在关系模型中处理,但如果数据中的连接越来越复杂,此次就将数据建模为图会更加自然。
学习Neo4j和Cypher之前,先来做一些热身运动。
1
图模型
图(Graph)由两种对象构成:顶点、和边。
例如:
顶点通常表示某个实体
最简单的图就是只有一个顶点。下面就是一个顶点的图。
可以将多种数据建模为图,典型的场景包括:
社交关系图:顶点是人,边是表示彼此认识
网页图:顶点是网页,边表示网页可以跳转到其他的HTML网页
公路或者铁路图:顶点是路口,边表示路口与路口之间的道路或者铁路。
有了图之后,就可以在图上运行一些经典的算法。例如:汽车导航系统搜索两点之间的最短路径、PageRank可以在大量的网页图中确定哪些网页最受欢迎,并对显示的结果排名。
上面的三个场景,每个顶点都是同一类的事物(分别是人、网页、或路口),但图不局限于同类数据。图的强大之处:可以将完全不同类型的对象存储起来,并提供一致的操作方法。例如:Facebook维护具有不同类型的顶点和边的Graph。例如:顶点代表用户、位置、事件、签到、评论。边代表哪些人是朋友、在什么地方签到的、谁评论的帖子、谁参加了哪些活动等等。
2
属性图
我们一般用的图其实都是属性图,顾名思义,属性图就是顶点和边都带有属性。在属性图模型中,每个顶点包括:
唯一标识符
描述顶点的标签
一组输出的边
一组输入的边
属性集(键值对)
每个边包括:
唯一标识符
边的开始顶点
边的结束顶点
描述两个顶点之间关系的标签
属性集(键值对)
标签是可用于将顶点按照标签分组。例如:用有代表用户的顶点标记为:label:User。有了这个,就可以方便地使用Neo4j在用户顶点上执行操作,例如:查找指定名称的所有用户。在Neo4j中,标签是可以动态添加、删除的。可以用标签来标识一些临时状态。一个顶点可以添加多个标签。
边(即关系)将两个顶点连接起来,将顶点组织成结构。每一种关系都有类型,例如:下面的图的关系类型为ACTED_IN,该关系属性带有一个roles属性。
顶点与自身也是可以有关系的。
3
设计图数据模型
在关系数据库中,设计数据模型直接会影响SQL语句编写的难易度、清晰度,数据模型对存储的数据结构是非常重要的。而在图数据库中同样适用。关系型数据库一般都是有schema的,而Neo4j是无schema,所以如果业务不断调整,Neo4j也是能够快速适应的。
所谓图数据建模就是用户将业务数据描述为节点的连通图、属性和标签关系的过程。以往在设计关系型模型上,我们先得大体的列出有哪些数据,然后规范化,分开建立表结构。而图数据建模画出来什么样的图,就可以直接用于建模。
基于上面图,再进一步完善,添加标签和更多属性。
2
查询语言
1
命令式查询语言
我们用高级语言编写代码搜索数据时是这样的。例如:检索价格大于的商品。
publicvoidgetGoodsGreaterThan(){ArrayListGoodsgtList=newArrayList;for(Goodsgoods:allGoodsList){if(goods.price){gtList.add(goods);}}returngtList;}
这种代码都是一行一行地执行、遍历,检查条件。在进行数据处理时,其实是比较繁琐的。所以,大部分人做数据分析的时候不会写Java。我们把这种语言称之为命令式查询语言。
而是使用SQL这种语言。那SQL和Java有什么不一样吗?
2
声明式查询语言
在基于关系模型时,一般会使用SQL来查询、检索数据。SQL是一种声明式的查询语言。上面的Java代码,如果我们使用SQL,一个SELECT就完成了。
SELECT*FROMtbl_goodsWHEREprice=;
在声明式查询语言中,只需要指定我们所需要的数据的模式(满足特定的条件),同时指定如何转换数据(例如:排序、分组、聚合)。根本无需考虑如何实现这些功能。数据库系统会自动帮助我们实现,例如:进行查询优化、如何使用索引、如何关联、以及如何执行查询各个部分的顺序。
声明性查询语言使用起来比命令性API更简洁,更易于使用。它隐藏了数据库引擎的实现细节。
3
MapReduce查询
MapReduce是用于批量处理大量数据的编程模型。MapReduce既不是声明式查询语言,也不是完全命令式查询API,它介于二者之间:查询的逻辑用代码段表示,处理框架会反复调用它们。基于Map和Reduce模型,然后用开发语言就可以实现数据的查询。
4
CypherQueryLanguage
Cypher是专门操作图数据库的声明式查询语言,在Neo4j中,使用Cypher可以非常方便的检索、查询图。Cypher使用的是黑客帝国中的角色来命名的。看一下CypherQuery:
简单解释下:
CREATE/*表示创建图对象,顶点、关系、模式*/(NAmerica/*顶点标识符*/:Location/*顶点类型*/{name:xxx/*属性*/,type:xxxx},...(Idaho/*引用之前的顶点*/)-[:WITH/*关系类型*/]-/*定义关系*/(USA/*应用顶点*/)...
每个顶点都有一个符号名称,例如:NAmerica、USA,以及可以在顶点之间使用箭头,(Idaho)-[:WITHIN]-(USA)来创建标记为WITHIN的边。Idaho边的头结点、USA为边的尾节点。
现在大家看着会有点蒙圈,等看完这篇就明白啦。
3
Neo4j简介
1
介绍
Neo4j旨在有效存储、处理和查询关联在一起的数据。Neo4j(NetworkExplorationandOptimization4Java)是一个图数据库管理系统(GDBMS)。它是一个具有Native(翻译成:原生)的图存储、图数据处理功能,而且支持ACID的数据库。
之所以称之为Native,是数据存储的时候就是彼此连接的。不像其他库,物理分离,通过计算层来做关联。
Neo4j提供开源的社区版,也有闭源高级版本。Neo4j是基于Java来实现的,它可以通过HTTP或者二进制协议,用CypherQL操作图数据。
PS:Neo4j一定是和TheMatrix有关系的。大家看查询语言的命名(Cypher)就知道了。2
历史
可以看到,Neo4j发布基本是比较稳定的。从4.0.11开始支持Java11。
3
结构
与传统的数据库按照行、列、表的结构不同,Neo4j使用的是灵活的图结构,这种结构是由数据记录之间的存储关系来定义的。Neo4j每个数据节点都可以存储指向与其连接的所有节点的引用,可以更快地执行复杂的连接查询。
在Neo4j中,所有存储的数据都以节点、边或者属性的形式存储。每个节点和边都可以包含任意数量的属性。节点和边还可以被打上标签,通过标签可以缩小检索范围。
4
Cypher查询语言
Cypher是一种功能强大、基于图的查询语言。它比大量的SQLJoin更简单、更容易编写。因为Neo4j没有表的概念,所以也不用考虑JOIN。Cypher是一种声明式语言,重点表达从图中检索什么样的数据,而不是如何获取数据。
参考下面的SQL语句:
SELECTp.nameFROMtbl_productASpJOINtbl_prod_categorycON(p.cID=c.cIDANDc.cName="家用电器")JOINtbl_prod_categoryc1ON(p.cID=c1.cID)JOINtbl_prod_categoryc2ON(c1.ParentID=c2.cIDANDc2.cName="家用电器")JOINtbl_prod_cc3ON(p.cID=c3.cID)JOINtbl_prod_cc4ON(c3.ParentID=c4.cID)JOINtbl_prod_cc5ON(c4.ParentID=c5.cIDANDc5.cName="家用电器");
而使用Cypher语言,如下:
MATCH(p:Product)-[:CATEGORY]-(l:ProductCategory)-[:PARENT*0..]-(:ProductCategory{name:"家用电器"})RETURNp.name
4
Neo4j图平台组件
Neo4j中有多种与图数据库进行交互和使用的方法。
Neo4j现在做成了一个图平台,各种用户都可以基于平台来工作。不论是开发人员、管理员、大数据开发、数据科学家、BI开发等等。在安装Neo4j之前,我们先来了解下Neo4j里面的一些组件。
1
Neo4j图数据库
这是核心的图数据库,用于存储和检索数据。有两种版本供选择。
1、社区版本
社区版是Neo4j的全功能版本,适用于部署在单机上。支持Neo4j的关键功能,例如:支持ACID的事务、Cypher和编程API,比较适合学习Neo4j,自己开发的项目或者小型的应用。
2、企业版本
企业版提供了所有的功能,包括备份、集群、故障转移等功能。如果项目对规模、可用性要求较高,就需要使用企业版了。
2
Neo4jDestop
用于管理Neo4j的本地实例应用程序。
3
Neo4jBroswer
Neo4j的在线浏览器界面,用于查询和查看数据库中的数据。使用Cypher查询语言的基本可视化功能。
4
Neo4jBloom
业务用户的可视化工具,不需要任何代码、编程技能就可以查看和分析数据。
5
Neo4jAura
由Neo4j管理的用于公有云上的图数据库。
6
GraphDataScience
官方支持的库,用于使用Neo4j执行图算法,并针对企业工作负载和管道进行优化。
5
安装Neo4j
1
安装
Neo4j的安装非常简单。
1、上传并解压Neo4j
[root
node1~]#lltotal0-rw-r--r--1rootroot0Jan:58Neo4j-