neo4j基本知识及Cypher语言

1. neo4j中的基本概念

在这里插入图片描述

  1. 节点(node):表示一个实体记录。一个节点包含多个属性和标签,如上图中的Tom Hanks、Sleepless等。每个圆圈都是一个节点
  2. 关系(relationship):关系用于将节点关联起来构成图,关系也称为图论的边(Edge)。也即上图中节点之间的连线
  3. 属性(property):节点和关系都可以有多个属性。属性由键值对组成,就像java中的哈希。如上图中,将鼠标放在Tom Hanks后,下方会出现born、name等属性。
  4. 标签(label):标签指示一组拥有相同属性的节点,但不强制要求相同,一个节点可以有多个标签。如上图中有Person、Movie的标签
  5. 路径(path):图中任意两个节点都存在由关系组成的路径,路径有长短之分。

2. Cypher语言

Cypher是一种声明式图数据库查询语言,类似关系数据库中的SQL。Cypher设计借鉴了其他如SQL、python语言惯用做法。

  • MATCH:匹配图模式
  • WHERE:过滤条件
  • RETURN:定义返回的结果
    基本语法:
  • 增(CREATE)
  • 删(DELETE)
  • 改(SET)
  • 查(MATCH)
    现以小猪佩奇为例,节点有猪爷爷、猪奶奶、猪爸爸、猪妈妈、佩奇、乔治(佩奇的弟弟)
  • 1.首先创建猪爷爷的节点,在neo4j网页版代码块处写:
create(:pig{name:"猪爷爷", age:15});

对代码的解释:create后一个括号代表一个节点。pig是标签、name和age都是属性
同样的可以再创建一个猪奶奶的标签:

create(:pig{name:"猪奶奶", age:13});

下图,点击左边的pig可以看到,已经创建好了猪爷爷和猪奶奶两个节点
在这里插入图片描述
创建多个节点,可以以逗号隔开,即上述可以写成一句:

create(:pig{name:"猪爷爷", age:15}),(:pig{name:"猪奶奶", age:13});
  • 2.创建关系:有了猪爷爷和猪奶奶两个节点,怎么创建两个人的关系呢?代码如下:
match(a:pig{name:"猪爷爷"}) match(b:pig{name:"猪奶奶"}) create(a)-[r:夫妻]->(b) return r;

代码解释:两个match分别查找pig标签下,name为猪爷爷或者猪奶奶的节点,并将结果分别赋予a、b。create语句为创建猪爷爷、猪奶奶的关系(a)(b)两个变量之间有两者的关系,并且注意箭头的使用,r是关系的结果,最后要返回(return)r。另外需要注意,指代关系的箭头,有两种用法(a) -[r:夫妻]->(b)或者(a) <-[r:夫妻]-(b),但两个箭头不能同时使用。为了测试箭头用法,再次创建了猪爸爸(name:“猪爸爸”, age:10)及其与猪爷爷的关系,最终如下图所示:
在这里插入图片描述
从图中可以看出似乎创建错了,以猪爸爸和猪爷爷为例,图中的关系似乎是猪爸爸的儿子是猪爷爷,故应该将替换箭头,或者两个a、b的先后顺序颠倒。

  • 3.上述为创建节点并保存关系,实际上还可以将两步合成一步,代码如下:
create(:pig{name:"猪爸爸", age:9})-[:妻子{marriage_age:3}]->(:pig{name:"猪妈妈", age:8});

注意:关系也可以有属性:
结果如下:
在这里插入图片描述
为什么会有两个猪爸爸呢?是因为我们这里的create又再次创建了一个猪爸爸,即使他和原来猪爸爸的标签、属性都相同,也会重新创建一个猪爸爸。
备注:不同标签的节点之间也可以创建关系。
出于好奇,既然有这么多猪爸爸,那么match 猪爸爸时,究竟哪个猪爸爸会被选择呢?执行代码,创建猪爸爸和猪奶奶的关系,如下所示:
在这里插入图片描述
发现所有符合条件的猪爸爸都和猪奶奶创建了关系。

  • 4.创建多标签节点,代码如下:
create(a:proc:multi{name:"tom", age:13}) return a.name;

对比之前创建节点的过程,create后每个冒号后面紧跟一个标签,create括号后可以将结果赋值给变量a,也可以不赋值。赋值的好处是后面可以指定return返回a的哪个属性。如果没有return则默认是第一个属性(当之前已经创建了相同标签的节点时,则默认是之前节点的属性。即使有了return,之前创建过相同标签的节点,图中节点圆圈内的内容也是原来节点的属性名),即使赋值给了变量a,也可以不写return。

  • 节点之间创建多个关系:
match(a:pig{name:"猪爸爸"})-[r:妻子]->(b:pig{name:"猪妈妈"}) create(a)-[r2:老婆{marrage:4}]->(b)

或者:

match(a:pig{name:"猪爷爷"}) match(b:pig{name:"猪奶奶"}) create(a)-[r:老婆]->(b)

最终结果如下:
在这里插入图片描述

  • 5.修改/增加/删除节点的属性
match(a:pig{name:"猪爷爷"}) set a.age=15;  
# 注释:当a.age存在时,为修改节点的age属性;当a.age不存在时,为增加节点属性。
# 注释:删除节点的属性
match(a:pig{name:"佩奇"}) remove a.age
  • 6.增加/删除标签
# 注释:增加标签
match(a:pig{name:"猪妈妈"}) set a:animal;
# 删除标签
match(a:pig{name:"猪妈妈"}) remove a:animal;

以上删除、增加标签一起操作的结果就是修改标签。

  • 7.增加/删除关系
# 以下均为增加关系
match(a:pig{name:"猪爷爷"})-[r:妻子]->(b:pig{name:"猪奶奶"}) create(a)-[r2:老婆{marrage:4}]->(b)
match(a:pig{name:"猪爷爷"}) match(b:pig{name:"猪奶奶"}) create(a)-[r:老婆]->(b)
# 当pig下存在多个猪爷爷和猪奶奶时,两种方式结果不同,第一种仅在猪爷爷和猪奶奶是妻子关系时才增加另一层关系老婆;第二种方式会在所有猪爷爷和猪奶奶间都增加老婆这一关系
# 删除关系
match(a:pig{name:"猪爷爷"})-[r:家人]->(b:pig{name:"猪奶奶"}) delete r;

以上增加、删除关系的操作可看成是修改了关系

扫描二维码关注公众号,回复: 8635017 查看本文章
  • 8.增加/删除/修改关系的属性
# 当marriage_age存在时为修改关系属性;当marriage_age不存在时为增加关系属性
match(a:pig{name:"猪爸爸"})-[r:妻子]->(b:pig{name:"猪妈妈"}) set r.marriage_age=10;
# 删除关系属性
match(a:pig{name:"猪爸爸"})-[r:妻子]->(b:pig{name:"猪妈妈"}) remove r.marriage_age;
  • 9.删除节点
match(a:pig{name:"tom"}) delete a;
# 删除节点前必须先删除与该节点所有的关系
  • 10.查询两个节点之间的最短路径
mathc p=shorttestpath((a:Star{name:"向华强"})-[*..5]->(b:Star{name:"郭富城"})) return p;
# shortpath是个函数,查询向华强和郭富城的一条关系路径;5应该是最大的路径长度

在这里插入图片描述

mathc p=allshorttestpaths((a:Star{name:"向华强"})-[*..5]->(b:Star{name:"郭富城"})) return p;
# allshortpaths是个函数,查询向华强和郭富城的所有关系路径;5应该是最大的路径长度

在这里插入图片描述

  • 11.查询与节点所有相关的其他节点
return (:Star{name:"王菲"})-->() limit 50
match p= (:Star{name:"王菲"})-->() return p;
# limit为限制50个

在这里插入图片描述

match p=(n:Star{name:"杨幂"})-[*..5]->() return p limit 50
# 杨幂朋友的所有关系图

在这里插入图片描述

发布了111 篇原创文章 · 获赞 113 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43178406/article/details/103906826
今日推荐