Neo4j之Cypher语法(2)
Neo4j使用Cypher查询图形数据,Cypher是描述性的图形查询语言,语法简单,功能强大,由于Neo4j在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得Cypher成为图形查询语言的事实上的标准。
1. 创建节点
节点模式的构成:(Variable:Lable1:Lable2{Key1:Value1,Key2,Value2}),实际上,每个节点都有一个整数ID,在创建新的节点时,Neo4j自动为节点设置ID值,在整个数据库中,节点的ID值是递增的和唯一的。
下面的Cypher查询创建一个节点,标签是Person,具有两个属性name和born,通过RETURN子句,返回新建的节点:
create (n:Person { name: 'Tom Hanks', born: 1956 }) return n;
2. 查询节点
通过match子句查询数据库,match子句用于指定搜索的模式(Pattern),where子句为match模式增加谓词(Predicate),用于对Pattern进行约束;
2.1 查询整个图形数据库
match(n) return n;
2.2 查询born属性小于1955的节点
match(n) where n.born<1955 return n;
2.3 查询具有指定Lable的节点
match(n:Movie)
return n;
2.4 查询具有指定属性的节点
match(n{name:'Tom Hanks'})
return n;
3. 创建关系
关系的构成:StartNode - [Variable:RelationshipType{Key1:Value1,Key2:Value2}] -> EndNode,在创建关系时,必须指定关系类型。
3.1 创建没有任何属性的关系
MATCH (a:Person),(b:Movie)
WHERE a.name = 'Robert Zemeckis' AND b.title = 'Forrest Gump'
CREATE (a)-[r:DIRECTED]->(b)
RETURN r;
3.2 创建关系,并设置关系的属性
MATCH (a:Person),(b:Movie)
WHERE a.name = 'Tom Hanks' AND b.title = 'Forrest Gump'
CREATE (a)-[r:ACTED_IN { roles:['Forrest'] }]->(b)
RETURN r;
4. 查询关系
在Cypher中,关系分为三种:符号“--”,表示有关系,忽略关系的类型和方向;符号“-->”和“<--”,表示有方向的关系;
4.1 查询整个数据库
4.2 查询跟指定节点有关系的节点
示例脚本返回跟Movie标签有关系的所有节点
match(n)--(m:Movie)
return n;
4.3 查询有向关系的节点
MATCH (:Person { name: 'Tom Hanks' })-->(movie)
RETURN movie;
4.4 为关系命名
通过[r]为关系定义一个变量名,通过函数type获取关系的类型MATCH (:Person { name: 'Tom Hanks' })-[r]->(movie)
RETURN r,type(r);
4.5 查询特定的关系类型
通过[Variable:RelationshipType{Key:Value}]指定关系的类型和属性
MATCH (:Person { name: 'Tom Hanks' })-[r:ACTED_IN{roles:'Forrest'}]->(movie)
RETURN r,type(r);
5. 更新图形
set子句,用于对更新节点的标签和实体的属性;remove子句用于移除实体的属性和节点的标签;
5.1 创建一个完整的Path
由于Path是由节点和关系构成的,当路径中的关系或节点不存在时,Neo4j会自动创建;
CREATE p =(vic:Worker:Person{ name:'vic',title:"Developer" })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael:Worker:Person { name: 'Michael',title:"Manager" }) RETURN p
变量neo代表的节点没有任何属性,但是,其有一个ID值,通过ID值为该节点设置属性和标签
5.2 为节点增加属性
通过节点的ID获取节点,Neo4j推荐通过where子句和ID函数来实现。
match (n)
where id(n)=7
set n.name = 'neo'
return n;
5.3 为节点增加标签
match (n)
where id(n)=7
set n:Company
return n;
5.4 为关系增加属性
match (n)<-[r]-(m) where id(n)=7 and id(m)=8 set r.team='Azure' return n;
6. 删除操作
6.1 清空数据库(慎用)
对于节点比较少的可以使用:
match (n) detach delete n
对于节点比较多的:
1、停掉服务; 2、删除 graph.db 目录; 3、重启服务。
6.2 删除节点和关系
首先不删除干净连接的节点和关系是不能删除一个节点的,会报执行错
一种方式,就是删除一个节点,连带着它的关系全部删除,刚刚上面这种执行错误的,加一个detach
关键字即可解决。
match(p:Person{name: 'jt'}) detach delete p # 使用关键字detach
还有一种情况,只想删除关系,可以运行命令:
match(p:Person{name: "reba"})-[r:WORK_AT]->() delete r # 可以删除reba节点的关系WORK_AT
6.3 删除节点和关系中的属性
下面这段代码利用remove关键字直接进行删除属性,删除后的属性为null
# 使用remove字段,发现返回的参数d.code为null
match(d:Disease{name:"诊断"})
remove d.code
return d.name, d.oid, d.code
除了删除属性,我们还能删除label
,什么是label呢?其实就是类名,运行下面命令:
# 比如用下面这段话,把“诊断”的类都删掉,节点也删掉
match(d:Disease{name:"诊断"})
remove d:Disease
return d.name, d.oid, d.code
7 跟实体相关的函数
跟实体相关的函数,主要是获取节点或关系的ID,关系类型,标签和属性等函数。
7.1 通过id函数,返回节点或关系的ID
MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN id(r);
7.2 通过type函数,查询关系的类型
MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN type(r);
7.3 通过lables函数,查询节点的标签
MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN lables(movie);
7.4 通过keys函数,查看节点或关系的属性键
MATCH (a)
WHERE a.name = 'Alice'
RETURN keys(a)
7.5 通过properties()函数,查看节点或关系的属性
CREATE (p:Person { name: 'Stefan', city: 'Berlin' })
RETURN properties(p)
match (n) where id(n)=7 set n.name = 'neo' return n;