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;

neo4j 图的schema设计 neo4j的cypher_查询语言

 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;

neo4j 图的schema设计 neo4j的cypher_数据库_02

 

 

 4. 查询关系

在Cypher中,关系分为三种:符号“--”,表示有关系,忽略关系的类型和方向;符号“-->”和“<--”,表示有方向的关系;

4.1 查询整个数据库

neo4j 图的schema设计 neo4j的cypher_删除节点_03

 

 

 4.2 查询跟指定节点有关系的节点

示例脚本返回跟Movie标签有关系的所有节点

match(n)--(m:Movie) 
return n;

neo4j 图的schema设计 neo4j的cypher_neo4j 图的schema设计_04

 

 

 4.3 查询有向关系的节点

MATCH (:Person { name: 'Tom Hanks' })-->(movie)
RETURN movie;

neo4j 图的schema设计 neo4j的cypher_删除节点_05

 

 

 4.4 为关系命名

通过[r]为关系定义一个变量名,通过函数type获取关系的类型

MATCH (:Person { name: 'Tom Hanks' })-[r]->(movie)
RETURN r,type(r);

neo4j 图的schema设计 neo4j的cypher_数据库_06

 

 

 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值为该节点设置属性和标签

neo4j 图的schema设计 neo4j的cypher_删除节点_07

 

 

5.2 为节点增加属性

通过节点的ID获取节点,Neo4j推荐通过where子句和ID函数来实现。

match (n)
where id(n)=7
set n.name = 'neo'
return n;

neo4j 图的schema设计 neo4j的cypher_数据库_08

 

 

 5.3 为节点增加标签

match (n)
where id(n)=7
set n:Company
return n;

neo4j 图的schema设计 neo4j的cypher_数据库_09

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;