做毕设的时候用到了很多之前没有用过的工具,也学了不少东西,想着趁这个时间把这些东西都记录下来,便于以后使用。
计算机系小白一个,如有不对请多指正。
create (n) //创建一个节点
create (n),(m) //创建两个节点
也可以这么做:
CREATE (:person{name:'张三',age:11}),
(:person{name:'李四',age:11}),
(:person{name:'王五',age:11})
cypher语句中可以出现中文不需要更改编码方式,但是要注意属性之间的逗号是英文的逗号,引号也是英文的引号,在引号中可以出现中文
create (n:Person) //创建一个标签为Person的节点
create (n:Person:Husband) //创建带有多个标签(Person,Husband)的节点
create(n:person{name:'Sherlock'}) return n
在创建节点的时候,数据库会自动为节点分配一个id
create
(:)-
[:]->
(:)
RETURN
示例如下
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
(:{})-
[:{}]
->(:{})
RETURN
#RETURN可选。 如果我们想立即看到结果,那么使用它。 否则,我们可以省略这个子句。
示例如下:
create (n:detective{name:'Sherlock})-[r:care{rating:1}]->(m:women{name:'Irene Idler'})
其实和带有属性的节点是完全类似的
这里要使用到查找语句 match
具体语法规则如下
MATCH (:),(:)
CREATE
()-[:]->()
RETURN
#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) 这样的句子是错误的)
最基本的查找语句
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
(这部分来源于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
这里只需要记住一点:先删关系,再删节点。
当我们想要删除节点时,如果它和其他节点之间存在关系,那么单独删除节点会报错,正确代码如下
MATCH (n:DC{name:'Bruce Wayen'})-[r]-()
DELETE n,r
这样我们就删除了这个节点和它的所有关系(双向的)
通常情况下,一个节点会和其他节点产生多条关系,而我们只想删掉某一种,这时可以指定删除某种关系,示例如下
MATCH (n:DC{name:'Bruce Wayen'})-[r:son]-()
DELETE r
这条语句指定删除了名为son的关系
这里要注意只能删除r,不能删除n,因为节点没有把所有关系都删除掉,所以它不能被删除。
remove,专门用来删除属性和标签,比delete安全一些。
MATCH (n:DC{name:'Clark'}) REMOVE n.age
这样节点的age属性就被删掉了
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
删库跑路有时的确是不错的选择(不)
MATCH (r:DC{name:"Dick"})
SET r.name="Jason"
对节点的name属性进行了修改
MATCH (n:DC)-[r:father]-(m:DC)
WHERE id(n)=500 and id(m)=401
CREATE (n)-[r2:daddy]->(m)
DELETE r
这里要记得,新建的关系是r2不要和r重名了
MATCH (n:OLD_LABEL)
REMOVE n:OLD_LABEL
SET n:NEW_LABEL