neo4j数据库之节点与关系的增删改查

写在最前面

做毕设的时候用到了很多之前没有用过的工具,也学了不少东西,想着趁这个时间把这些东西都记录下来,便于以后使用。
计算机系小白一个,如有不对请多指正。

1.创建节点

1.1 创建一个或多个节点

create (n) //创建一个节点
create (n),(m) //创建两个节点

也可以这么做:

CREATE (:person{name:'张三',age:11}),
(:person{name:'李四',age:11}),
(:person{name:'王五',age:11})

cypher语句中可以出现中文不需要更改编码方式,但是要注意属性之间的逗号是英文的逗号,引号也是英文的引号,在引号中可以出现中文

1.2 创建带有标签的节点

create (n:Person)	//创建一个标签为Person的节点
create (n:Person:Husband)		//创建带有多个标签(Person,Husband)的节点

1.3 创建带有属性的节点

create(n:person{name:'Sherlock'}) return n

在创建节点的时候,数据库会自动为节点分配一个id

2.创建关系

2.1 创建两个新的节点并为他们增加关系

create 
   (<node1-label-name>:<node1-name>)-
   [<relationship-label-name>:<relationship-name>]->
   (<node1-label-name>:<node1-name>)
RETURN <relationship-label-name>

示例如下

create (n:person{name:'Sherlock'})-[r:love]->(m:person{name:'John'})

这里要注意,前后两个node不能一样(就像n和m,不能两个都是n),创建关系时一定是有向关系,要注意指向m的那个箭头,最开始我就是因为一直没加箭头一直报语法错误。

按照上述语句,我们就创建了一个标签是person属性中name为Sherlock的节点,和一个标签是person属性中name为John的节点,他们之间的关系是Sherlock指向John的,关系名为love

在这个基础上,我们还可以给关系增添属性

语法如下:

CREATE  
	(<node1-label-name>:<node1-name>{<define-properties-list>})-
	[<relationship-label-name>:<relationship-name>{<define-properties-list>}]
	->(<node1-label-name>:<node1-name>{<define-properties-list>})
RETURN <relationship-label-name>
#RETURN可选。 如果我们想立即看到结果,那么使用它。 否则,我们可以省略这个子句。

示例如下:

create (n:detective{name:'Sherlock})-[r:care{rating:1}]->(m:women{name:'Irene Idler'})

其实和带有属性的节点是完全类似的

2.2 现有节点添加关系

这里要使用到查找语句 match
具体语法规则如下

MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
CREATE  
	(<node1-label-name>)-[<relationship-label-name>:<relationship-name>]->(<node2-label-name>)
RETURN <relationship-label-name>
#RETURN子句是可选的。 如果我们想立即看到结果,那么使用它。 否则,我们可以省略这个子句。

示例如下:

match (n:doctor),(m:detective)
create (n)-[r:likes]->(m)
return n,r,m

在查找节点的时候,我们可以增加限制,使用where语句为节点添加限制

match (n:doctor),(m:detective)
where n.name="John" and m.name="Sherlock"
create (n)-[r:likes]->(m)
return n,r,m

之前说过,数据库会自动为节点分配一个id,每一个都不一样,所以如果想要精确的找到,可以使用id查找

match (n:doctor),(m:detective)
where id(m)=221 and id(n)=234
create (n)-[r:likes]->(m)
return n,r,m

这里要注意是id(n)而不是n.id,n.id是查找节点n的属性中名为id的值,二者不一样

补充说明

1.创建节点和关系语句必须一次执行完,否则创建关系时()中的节点被认为是新的节点。
2.match,create,return 大写小写不影响语法正确与否
3.使用match语句之后如果不对数据库中的数据进行修改一定要使用return语句,否则会报语法错误(比如说match (n) 这样的句子是错误的)

3. 查找节点和关系

3.1 查找节点

最基本的查找语句

MATCH (n) 
RETURN n

查找某个标签的节点

MATCH (n:doctor)
RETURN n

查找带有某个属性的节点

MATCH(n{name:"张三"})
RETURN n

使用id查找

MATCH (n)
WHERE id(n)=222
RETURN n

指定节点,查询跟这个节点相关的节点

MATCH (n)-[r:likes]-(m)
WHERE n.name="Reese"
RETURN m

最后再来一个比较特殊的,查询孤立节点

match (n)
where not (n)-[]-()
return n

3.2 查找关系

(这部分来源于https://www.cnblogs.com/ljhdo/p/10929702.html

指定关系的方向来查询节点

MATCH (:Person { name: 'Oliver Stone' })-->(movie)
RETURN movie.title

查询关系的类型

在查询关系时,可以在match子句中指定关系变量,后续子句可以引用该变量,例如,使用type()函数查看关系的类型:

MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN type(r)

匹配关系类型

在匹配关系时,可以指定关系的类型

MATCH (wallstreet:Movie { title: 'Wall Street' })<-[:ACTED_IN]-(actor)
RETURN actor.name

匹配多种关系类型

在匹配关系时,可以指定多种关系的类型,只需要匹配其中任意一个关系类型就匹配成功

MATCH (wallstreet { title: 'Wall Street' })<-[:ACTED_IN|:DIRECTED]-(person)
RETURN person.name

匹配关系类型,并指定关系变量

MATCH (wallstreet { title: 'Wall Street' })<-[r:ACTED_IN]-(actor)
RETURN r.role

匹配多个关系

MATCH (charlie { name: 'Charlie Sheen' })-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)
RETURN movie.title, director.name

4.删除节点和关系

这里只需要记住一点:先删关系,再删节点。

4.1 删除某个节点的所有关系

当我们想要删除节点时,如果它和其他节点之间存在关系,那么单独删除节点会报错,正确代码如下

MATCH (n:DC{name:'Bruce Wayen'})-[r]-()
DELETE n,r

这样我们就删除了这个节点和它的所有关系(双向的)

4.2 删除某个节点的某类关系

通常情况下,一个节点会和其他节点产生多条关系,而我们只想删掉某一种,这时可以指定删除某种关系,示例如下

MATCH (n:DC{name:'Bruce Wayen'})-[r:son]-()
DELETE r

这条语句指定删除了名为son的关系
这里要注意只能删除r,不能删除n,因为节点没有把所有关系都删除掉,所以它不能被删除。

4.3 删除某些节点或者关系的属性

remove,专门用来删除属性和标签,比delete安全一些。

MATCH (n:DC{name:'Clark'}) REMOVE n.age

这样节点的age属性就被删掉了

4.4 删除所有节点和关系

MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r

删库跑路有时的确是不错的选择(不)

5.修改关系、属性、标签

5.1 修改节点属性

MATCH (r:DC{name:"Dick"})
SET r.name="Jason"

对节点的name属性进行了修改

5.2 修改关系名称

MATCH (n:DC)-[r:father]-(m:DC)
WHERE id(n)=500 and id(m)=401
CREATE (n)-[r2:daddy]->(m)
DELETE r

这里要记得,新建的关系是r2不要和r重名了

5.3 修改节点标签

MATCH (n:OLD_LABEL) 
REMOVE n:OLD_LABEL 
SET n:NEW_LABEL
  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值