图数据库初探之Neo4j

图数据库初试之Neo4j

自从进入了移动互联网时代,各类新事物出现的速度都好像坐上了宇宙飞船,几乎隔几天一个新概念。就拿数据库而言,什么Oracle、DB二、SQL Server、MySQL,这些你都得知道,而后是以MongoDB、HBase等为表明的NoSQL数据库,这几年图数据库也很快流行起来,它是如此的热门,以致于不赶忙学学好像无法跟你们交流了通常,虽然它也属于NoSQL。node

练习完本文,大概须要20分钟。web

基本概念

图数据库,这是一个很容易被误解的概念,好多人都下意识的觉得,这是存储图片的数据库,其实否则。算法

传统的关系型数据库数据模型就是二维表,存储时每一条记录按行存储;到了NoSQL,有些存储的是文档,如MongoDB中,有些存储的键值对,如Redis,而图数据库,存储的则是点边关系。数据库

所谓图,回想离散数学、数据结构之类的基础课,会想起它的定义,G = (V, E),简单来讲,一个图有两个必要的组成要素,点集合和边集合,点的集合是为点集,点之间的链接关系构成了边集。典型的好比社交网络,每个人均可以当作一个点,而他们之间的朋友关系,则能够当作是边。浏览器

为何说图数据库这几年很热门,一个很重要的缘由多是,单一数据中的规律已经有太多的模型和算法能够处理了,而好多隐藏的规律,则蕴含在数据之间的链接中。拿一个欺诈检测中最典型的例子来讲,好多不法分子申请信用卡,一个典型的特色是,他们会填写好多相同的地址和电话,若是单纯地分析信用卡申请单,很难判断他们是否欺诈,但若是利用图数据库,以申请人和地址做为点,以拥有某通讯地址为边构建图,则很容易发现欺诈。(你们不要钻牛角尖啊,我只是举例说用图数据库很容易发现这种欺诈模式,并无说你不能用其余的技术发现。)微信

还有一个传统关系型数据库和其余NoSQL数据库致命的弱点是,在一个图(也有的资料叫网络,这二者的区别之后有机会再解释)中,寻找二度及以上的关系,效率很是低。相比你们都据说过“小世界”理论,也就是说,世界上的任何两我的之间,只须要6我的就能够创建联系,也叫六度分割理论,这只是个假说,后来有研究人员研究过Facebook等的数据发现,真实的值,比6还要小,大概在4左右,不得不感叹,这个世界真小!言归正传,要想用关系型数据库寻找6度关系,你们想一想那个计算量,简直大得惊人,而使用图数据库,则简单地多,由于它存储的就是点边关系,寻找几度关系这类为题,不过是图的遍历而已!网络

安装

通常这种新兴软件的安装都很简单,本文以macOS为例,其余平台请参考官方文档。数据结构

使用安装文件安装

访问https://neo4j.com/download/,选择For Individuals(Community版,免费),下载相应平台的安装文件便可。学习

使用HomeBrew安装

使用HomeBrew安装一样很是简单code

$ brew install neo4j

使用以下命令启动

$ brew services neo4j start

启动后,打开浏览器,访问http://localhost:7474,便可看到Neo4j的web console,官方称之为Neo4j Browser。使用neo4j/neo4j分别做为用户名和密码。登陆后会要求你更改用户名和密码

NOTE
万一遗忘密码,能够到Neo4j的数据目录下,删除<Neo4j_database_location>/data/dbms/auth,这样下次登陆时会重置密码。

界面探索

启动后界面相似下图所示,作出的的边栏我点开了,右侧上方的命令条很重要,接下来的命令都要在此输入,整个界面仍是比较易用的。

接下来介绍Cypher语句,这可谓是Neo4j的关键。

Cypher语句

Cypher语句是Neo4j的图查询语言。如下例子来自Neo4j Browser,启动后在命令栏输入:play cypher便可,能够参照例子进行学习,也能够参考本文练习。

CREATE

在上方命令条中输入以下语句

CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })

CREATE是建立记录的关键词;()指定一个节点;ee:Person,ee是一个变量,Person是一个Label;{}为节点添加属性

结果以下图

MATCH

MATCH关键词能够用于进行模式匹配(Pattern Matching),例如查找节点或者关系

MATCH (ee:Person) WHERE ee.name = "Emil" RETURN ee;

MATCH节点或关系的匹配模式,相似SQL中的select;(ee:Person)一个Label为Person的单节点模式,匹配到的结果将赋值给变量ee;WHERE对结果的约束,相似SQL中的where语句;ee.name = "Emil"ee的属性name是Emil;RETURN请求特定结果。

MATCH语句不只能够用于查询节点,还能够用于查询关系,例如以下的语句

MATCH (ee:Person)-[:KNOWS]-(friends)
WHERE ee.name = "Emil" RETURN ee, friends

在上面这条语句中

MATCH语句描述了从已知节点到待寻找节点的模式;(ee)是一个指代已知节点的变量;-[:KNOWS]-匹配了KNOWS的关系(双向匹配);(friends)包含全部Emil的朋友

复合语句

除了上面这种简单的CREATE语句,还能够组合其余关键词添加更复杂的记录,我暂且叫它复合语句吧。

在上方命令条中输入以下语句

MATCH (ee:Person) WHERE ee.name = "Emil"
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),
(ir:Person { name: "Ian", from: "England", title: "author" }),
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)

执行结果显示Added 4 labels, created 4 nodes, set 14 properties, created 7 relationships, completed after 13 ms.

分析Cypher语句

使用PROFILEEXPLAIN能够用于分析Cypher语句,加深对查询的理解

PROFILE MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer

使用Cypher语句进行推荐

模式匹配还能用来进行推荐。例如Johan正在学习冲浪,他想寻找一个新的已经在学习冲浪的朋友

MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer

能够从结果看到,该语句找到一个Johan的朋友Alison

小结

短短二三十分钟,相信你已经大概了解了Neo4j,接下来还会介绍更加深刻的例子,结合客户端驱动(如Python)操做Neo4j,同时还会在后期结合一个具体的例子讲解Neo4j,感兴趣的欢迎关注哦。同时,你们也能够扫描二维码关注个人微信公众号哦。

相关文章
相关标签/搜索