Neo4j 入门

Neo4j 入门

一、什么是图形数据库

图数据库是基于图论实现的一种新型 nosql 数据库,其数据库存储结构和数据的查询方式都是以图论为基础的。图论中图的基本元素为节点和边,在图数据库中对应的就是节点和关系。

在这里插入图片描述

neo4j 基本元素与概念

  • 标签:在Neo4j中,一个节点可以有一个以上的标签,从现实世界的角度去看,一个标签可以认为节点的某个类别,比如BOOK、MOVIE等等。

  • 节点:节点是指一个实实在在的对象,这个对象可以有好多的标签,表示对象的种类,也可以有好多的属性,描述其特征,节点与节点之间还可以形成多个有方向(或者没有方向)的关系。
    在这里插入图片描述

  • 关系:用来描述节点与节点之间的关系,这也是图数据与与普通数据库最大的区别,正是因为有这些关系的存在,才可以描述那些我们普通行列数据库所很难表示的网状关系,比如我们复杂的人际关系网,所谓的六度理论,就可以很方便的用图数据库进行模拟,比如我们大脑神经元之间的连接方式,都是一张复杂的网。关系可以拥有属性。
    在这里插入图片描述

  • 属性:描述节点的特性,采用的是Key-Value结构,可以随意设定来描述节点的特征。

关于图论?
图论是数学的一个分支,它以图为研究对象,图论中的图是由若干个给定的点及连接两点的线所构成的图型,这种图形通常用来描绘某些事物之间的某种特定关系,用点代表事务,用连接两点的线表示相应两个事物间具有这种关系。

二、Neo4j 图形理论基础

图形是一组节点和连接这些节点的关系。 图形以属性的形式将数据存储在节点和关系中。 属性是用于表示数据的键值对。

在图形理论中,我们可以表示一个带有圆的节点,节点之间的关系用一个箭头标记表示。

最简单的可能图是单个节点。

在这里插入图片描述
我们可以使用节点表示社交网络(如Google+(GooglePlus)个人资料)。 它不包含任何属性。

向 Google+个人资料添加一些属性
在这里插入图片描述

此节点包含一组属性。 属性是一个名称:值对。

在两个节点之间创建关系

在这里插入图片描述

此处在两个配置文件之间创建关系名称“跟随”。 这意味着 Profile-1遵循 Profile-2。

复杂的示例图
在这里插入图片描述

这里节点用关系连接。 关系是单向或双向的。
从PQR到XYZ的关系是单向关系。
从ABC到PQR的关系是双向关系。

三、什么是Neo4j

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

优点:

  • 它很容易表示连接的数据
  • 检索/遍历/导航更多的连接数据是非常容易和快速的
  • 它非常容易地表示半结构化数据
  • Neo4j CQL查询语言命令是人性化的可读格式,非常容易学习
  • 使用简单而强大的数据模型
  • 它不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引

四、Neo4j 安装

  • 检查 jdk 环境 必须为 jdk 11
  • 下载安装包
  • 解压
tar -zxvf neo4j-chs-community-4.2.4-unix.tar.gz
  • 修改配置文件
vim conf/neo4j.conf
  • 放开访问权限
dbms.connectors.default_listen_address=0.0.0.0
  • 启动
./bin/neo4j start
  • 停止
./bin/neo4j stop
  • 访问 web 管理页面
http://ip:7474/browser

neo4j 自带示例:Movie Graph

  • 节点创建
  • 节点查询
  • 关系查询
    在这里插入图片描述

五、Cypher 查询语言

概念:
Cypher 是一种声明式图数据库查询语言,类似关系数据库中当中 SQL,Python 语言惯用做法。

  • MATCH:匹配图模式
  • WHERE:过滤条件
  • RETURN:定义返回结果

基本语法:

关键字作用
CREATE创建
MATCH匹配
RETURN加载
WHERE过滤检索条件
DELETE删除节点和关系
REMOVE删除节点和关系的属性
ORDER BY排序
SET添加或更新属性
create 语法
CREATE (<node-name>:<label-name>)
# 创建一个带有标签名“Employee”的节点“emp”。
CREATE (emp:Employee)

CREATE (
   <node-name>:<label-name>
   { 	
      <Property1-name>:<Property1-Value>
      ........
      <Propertyn-name>:<Propertyn-Value>
   }
)

# 创建具有一些属性(deptno,dname,位置)的Dept节点
CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" })

match 语法

MATCH 
(
   <node-name>:<label-name>
)

# 查询Dept下的内容
MATCH (dept:Dept) return dept

# 查询Employee标签下 id=123,name="Lokesh"的节点
MATCH (p:Employee {id:123,name:"Lokesh"}) RETURN p

## 查询Employee标签下name="Lokesh"的节点,使用(where命令)
MATCH (p:Employee)
WHERE p.name = "Lokesh"
RETURN p

return 语法

RETURN 
   <node-name>.<property1-name>,
   ........
   <node-name>.<propertyn-name>

RETURN dept.deptno

delete 语法

# 删除节点子句
DELETE <node-name-list>
# 删除节点和关系子句
DELETE <node1-name>,<node2-name>,<relationship-name>

MATCH (e: Employee) DELETE e

MATCH (cc: CreditCard)-[rel]-(c:Customer) 
DELETE cc,c,rel

match(aa:pig{name:"猪爷爷",age:12})-[r:夫妻]-(bb:pig{name:"猪奶奶",age:12}) delete aa,bb,r

remove 语法

删除节点或关系的标签
删除节点或关系的属性

REMOVE <property-name-list>

REMOVE <label-name-list> 

MATCH (book { id:122 })
REMOVE book.price
RETURN book

MATCH (m:Movie) 
REMOVE m:Picture

union 语法

它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。

限制:结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。

<MATCH Command1>
   UNION
<MATCH Command2>


MATCH (cc:CreditCard) RETURN cc.id,cc.number
UNION
MATCH (dc:DebitCard) RETURN dc.id,dc.number

在这里插入图片描述

union all 语法

它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。

限制:结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。

<MATCH Command1>
UNION ALL
<MATCH Command2>

MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,
   cc.valid_from as valid_from,cc.valid_to as valid_to
UNION ALL
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,
   dc.valid_from as valid_from,dc.valid_to as valid_to

在这里插入图片描述

limit 语法

LIMIT”子句来过滤或限制查询返回的行数

LIMIT <number>

MATCH (emp:Employee) 
RETURN emp
LIMIT 2

skip 语法

SKIP”子句来过滤或限制查询返回的行数。

SKIP<number>

MATCH (emp:Employee) 
RETURN emp
SKIP 2

基本查找 match return

# 创建两个节点,猪爸爸与猪妈妈,他们之间是属于夫妻关系
# 其中create表示新建
# p 表示这个节点的别名
# pig表示节点p的标签pig的属性
# {} 大括号中间的键值对,表示p这个节点作为pig这个标签类别所拥有的属性
# -[r:夫妻]-> 表示节点p指向节点f,他们之间的关系是夫妻,这个关系的别名是r,r可以拥有属于自己的属性
# return 表示执行这段语句之后,需要返回的对象,return p,r,f 表示返回 节点p,节点f,以及他们之间的关系r
CREATE (p:pig{name:"猪爸爸",age:5})-[r:夫妻]->(f:pig{name:"猪妈妈",age:4}) RETURN p,r,f;

查找指定节点、指定属性、指定关系的节点、关系

# MATCH 匹配命令
# return 后面的别名p还可以利用as 设置指定返回值名称,如:p as username
MATCH (p:pig{name:"猪爸爸"})-[r]-(n) RETURN p,r,n;

对查找结果进行排序order by,并限制返回条数 limit

order by关键字与SQL里面是一样的操作,后面跟上需要根据排序的关键字,limit的操作是指定输出前几条


# 这里利用order by来指定返回按照Person.name来排序
# limit 表示只返回前3条数据
match(p:pig) return p order by p.name limit 3

删除节点 delete 命令

删除节点的操作也是通过dlete来操作,如果被删除的节点存在Relationship,那么单独删除该节点的操作会不成功,所以如果想删除一个已经存在关系的节点,需要同时将关系进行删除。

# 删除指定条件的节点
# 先通过匹配关键字match找到匹配元素,然后通过delete关键字指定删除
MATCH (p:pig{name:"猪爸爸"}) delete p;

# 删除节点和节点相关的关系
MATCH (p:pig{name:"猪爸爸"})-[r]-() delete p,r;

删除属性 remove 命令

remove命令是用来删除节点或者关系的属性

neo4j 字符串函数

upper,lower,substring,replac四种字符串的操作,其中upper与lower在将来的版本中会被修改为toupper/tolower

//大写转换操作
MATCH (p:pig) return toupper(p.name);

聚合函数

常用的聚合函数有COUNT、MAX、MIN、AVG、SUM等五种。

MATCH (p:pig) return p.name as name,p.age as age,count(p) as count,max(p.age) as maxAge,min(p.age) as minAge,avg(p.age) as avgAge,sum(p.age) as sumAge;

关系函数

函数名功能描述
STARTNODE查找关系起点
ENDNODE查找关系终点
ID查找关系id
TYPE查找关系的类型,也就是我们在图中看到的名称
# 先获取关系,然后通过关系函数来获取关系 id,type,起始节点,终止节点等信息

MATCH ()-[r:父子]-() return stratnode(r).name as start_node,endnode(r).name as end_node,id(r) as relationship_id,type(r) as realtionship_type

在这里插入图片描述

小猪佩奇家庭族谱示例:

在这里插入图片描述

  • 猪爷爷、猪奶奶
    • 猪爸爸、猪妈妈
      • 乔治、佩奇
  • 猪外公、猪外婆
//创建基础节点
CREATE (:pig{name:"猪爷爷",age:12}),(:pig{name:"猪奶奶",age:9})
//基于现有节点创建关系
MATCH(a:pig{name:"猪爷爷",age:12}) MATCH(b:pig{name:"猪奶奶",age:9}) CREATE (a) -[r:夫妻]->(b) RETURN r;

//创建关系加节点
CREATE (:pig{name:"猪爸爸",age:5})-[:夫妻]->(:pig{name:"猪妈妈",age:4})

//创建佩奇,乔治以及关系
CREATE (:pig{name:"佩奇",age:2})-[:姐弟]->(:pig{name:"乔治",age:1})

//创建猪爷爷,猪爸爸关系
MATCH(c:pig{name:"猪爸爸",age:5}) MATCH(d:pig{name:"猪爷爷",age:12}) CREATE (d) -[r:父子]->(c) RETURN r;

//创建猪爸爸与佩奇关系
MATCH(c:pig{name:"猪爸爸",age:5}) MATCH(d:pig{name:"佩奇",age:2}) CREATE (c) -[r:父女]->(d) RETURN r;

//创建猪爷爷与佩奇关系
MATCH(c:pig{name:"猪爷爷",age:12}) MATCH(d:pig{name:"佩奇",age:2}) CREATE (c) -[r:孙女]->(d) RETURN r;

//创建猪奶奶与佩奇关系
MATCH(c:pig{name:"猪奶奶",age:9}) MATCH(d:pig{name:"佩奇",age:2}) CREATE (c) -[r:孙女]->(d) RETURN r;

//创建猪奶奶与猪爸爸关系
MATCH(c:pig{name:"猪奶奶",age:9}) MATCH(d:pig{name:"猪爸爸",age:5}) CREATE (c) -[r:母子]->(d) RETURN r;

//修改属性
MATCH (a:pig{name:"猪爸爸",age:5}) SET a.age=4;

//创建多标签节点
CREATE (a:die:pig{name:"猪祖父",age:15}) RETURN a.name;

//删除节点
MATCH (n:die) DELETE n;

六、Neo4j 程序开发

  • java 嵌入式开发模式:

    neo4j 基于 java 语言开发的,在第一版发布之初是专门针对java 领域的,所以它能够与 java 开发天然结合, java 程序可以直接集成 neo4j 库至应用当中。
    在这里插入图片描述

  • 各语言驱动包开发模式:

    毕竟 neo4j 是一门数据库,其使用范围 肯定不能局限于java 应用,为了满足其他语言的调用,Neo4j 引入了驱动开发模式。
    在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_子栖_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值