Cypher的基本概念:Cypher是neo4j图数据的查询语言, 类似于mysql数据库的sql语句, 但是它允许对图形进行富有表现力和有效的查询和更新.

Cypher的基本命令和语法:

  • create命令
  • match命令
  • merge命令
  • relationship关系命令
  • where命令
  • delete命令
  • sort命令
  • 字符串函数
  • 聚合函数
  • index索引命令

一、create命令: 创建图数据中的节点

1、创建命令格式一

CREATE (e:Employee{id:222, name:'Bob', salary:6000, deptnp:12})

  • 此处create是关键字, e为’节点’(相当于mysql中的表中的一条记录)的变量名称, Employee为’节点标签’(相当于myslq中的一张表), e和Employee放在小括号里面(),中间用冒号表示关系
  • 后面把所有属于节点标签属性(相当于Myslq中表的列名)放在大括号’{}‘里面, 依次写出属性名称:属性值, 不同属性用逗号’,'分隔
  • 例如下面命令创建一个节点对象e, 节点标签是Employee, 拥有id, name, salary, deptnp四个属性;
  • 数据库图longtest应该放多大 图数据库cypher_删除节点

  • 节点名称 e 是当前语句中的临时变量,节点标签 Employee 才真正保存到图数据库中;
  • 如果你不对对象进行操作就可以不写节点名称 e,比如create操作:
create(:程序员 {name:"小东",age:23,birthday:"1995/12/06"})
>>Added 1 label, created 1 node, set 3 properties, completed after 21 ms.
  • 对匹配到或者创建的实例进行操作的时候就需要写节点名称 e,因为只有拿到对象,才能对对象操作,这是必须的.比如下面你要返回检索的结果
match(person:程序员) where person.name="小东" return person
╒══════════════════════════════════════════════╕
│"person"                                      │
╞══════════════════════════════════════════════╡
│{"birthday":"1995/12/06","name":"小东","age":23}│
└──────────────────────────────────────────────┘

match(p1:程序员) where p1.name="小东" return p1
╒══════════════════════════════════════════════╕
│"p1"                                          │
╞══════════════════════════════════════════════╡
│{"birthday":"1995/12/06","name":"小东","age":23}│
└──────────────────────────────────────────────┘

由上面的例子可以看出,无论你节点起什么名字都无所谓,它相当于是python语言里面的一个变量名,指向一个对象,可以对其进行操作.

所以节点是可写可不写的.需要操作实例的时候就需要写节点,也可以理解为节点是对应实例的变量名.

但是注意标签是一定要写的.标签是Neo4j图数据库的分类.需要根据这个进行搜索.

2、创建命令格式二

CREATE (e:Employee) set e.id=222, e.name='Bob', e.salary=6000, e.deptnp=12

比如:

CREATE (e:Employee)  set e.id=222, e.name='Bob', e.salary=6000, e.deptnp=12 return e

二、match命令: 匹配(查询)已有数据

# match命令专门用来匹配查询, 节点名称:节点标签, 依然放在小括号内, 然后使用return语句返回查询结果, 和SQL很相似.
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno

数据库图longtest应该放多大 图数据库cypher_子字符串_02


三、merge命令: 若节点存在, 则等效与match命令; 节点不存在, 则等效于create命令.

MERGE (e:Employee {id:146, name:'Lucer', salary:3500, deptno:16})

数据库图longtest应该放多大 图数据库cypher_数据库图longtest应该放多大_03

然后再次用merge查询, 发现数据库中的数据并没有增加, 因为已经存在相同的数据了, merge匹配成功.

MERGE (e:Employee {id:146, name:'Lucer', salary:3500, deptno:16})

数据库图longtest应该放多大 图数据库cypher_子字符串_04


四、使用create创建关系:

必须创建有方向性的关系, 否则报错

# 创建一个节点p1到p2的有方向关系, 这个关系r的标签为Buy, 代表p1购买了p2, 方向为p1指向p2
CREATE (p1:Profile1)-[r:Buy]->(p2:Profile2)

数据库图longtest应该放多大 图数据库cypher_数据库图longtest应该放多大_05


五、使用merge创建关系

可以创建有/无方向性的关系.

# 创建一个节点p1到p2的无方向关系, 这个关系r的标签为miss, 代表p1-miss-p2, 方向为相互的
MERGE (p1:Profile1)-[r:miss]-(p2:Profile2)

数据库图longtest应该放多大 图数据库cypher_删除节点_06


六、where命令: 类似于SQL中的添加查询条件

# 查询节点Employee中, id值等于123的那个节点
MATCH (e:Employee) WHERE e.id=123 RETURN e

数据库图longtest应该放多大 图数据库cypher_子字符串_07


七、delete命令: 删除节点/关系及其关联的属性.

# 注意: 删除节点的同时, 也要删除关联的关系边
MATCH (c1:CreditCard)-[r]-(c2:Customer) DELETE c1, r, c2

数据库图longtest应该放多大 图数据库cypher_删除节点_08


match(t:Teacher) delete t

match(s:Student)-[r]-(t:Teacher) delete r,s,t

delete节点时,如果节点之间还有关系会报错

数据库图longtest应该放多大 图数据库cypher_Cypher_09


match(t:Teacher) detach delete t 直接将节点和关系一起删除

快速清空数据库:

MATCH (n)  DETACH DELETE n

八、sort命令: Cypher命令中的排序使用的是order by

# 匹配查询标签Employee, 将所有匹配结果按照id值升序排列后返回结果
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno ORDER BY e.id

# 如果要按照降序排序, 只需要将ORDER BY e.salary改写为ORDER BY e.salary DESC
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno ORDER BY e.salary DESC

数据库图longtest应该放多大 图数据库cypher_删除节点_10


九、字符串函数:

  • toUpper()函数
  • toLower()函数
  • substring()函数
  • replace()函数

1、toUpper()函数

将一个输入字符串转换为大写字母.

MATCH (e:Employee) RETURN e.id, toUpper(e.name), e.salary, e.deptno

数据库图longtest应该放多大 图数据库cypher_子字符串_11

2、toLower()函数

讲一个输入字符串转换为小写字母.

MATCH (e:Employee) RETURN e.id, toLower(e.name), e.salary, e.deptno

数据库图longtest应该放多大 图数据库cypher_数据库图longtest应该放多大_12

3、substring()函数

返回一个子字符串.

# 输入字符串为input_str, 返回从索引start_index开始, 到end_index-1结束的子字符串
substring(input_str, start_index, end_index)

# 示例代码, 返回员工名字的前两个字母
MATCH (e:Employee) RETURN e.id, substring(e.name,0,2), e.salary, e.deptno

数据库图longtest应该放多大 图数据库cypher_数据库图longtest应该放多大_13

4、replace()函数

替换掉子字符串.

# 输入字符串为input_str, 将输入字符串中符合origin_str的部分, 替换成new_str
replace(input_str, origin_str, new_str)

# 示例代码, 将员工名字替换为添加后缀_HelloWorld
MATCH (e:Employee) RETURN e.id, replace(e.name,e.name,e.name + "_HelloWorld"), e.salary, e.deptno

数据库图longtest应该放多大 图数据库cypher_Cypher_14


十、聚合函数

  • count()函数
  • max()函数
  • min()函数
  • sum()函数
  • avg()函数

1、count()函数

返回由match命令匹配成功的条数.

# 返回匹配标签Employee成功的记录个数
MATCH (e:Employee) RETURN count( * )

数据库图longtest应该放多大 图数据库cypher_数据库图longtest应该放多大_15

2、max()函数

返回由match命令匹配成功的记录中的最大值.

# 返回匹配标签Employee成功的记录中, 最高的工资数字
MATCH (e:Employee) RETURN max(e.salary)

数据库图longtest应该放多大 图数据库cypher_子字符串_16

3、min()函数

返回由match命令匹配成功的记录中的最小值.

# 返回匹配标签Employee成功的记录中, 最低的工资数字
MATCH (e:Employee) RETURN min(e.salary)

数据库图longtest应该放多大 图数据库cypher_删除节点_17

4、sum()函数

返回由match命令匹配成功的记录中某字段的全部加和值.

# 返回匹配标签Employee成功的记录中, 所有员工工资的和
MATCH (e:Employee) RETURN sum(e.salary)

数据库图longtest应该放多大 图数据库cypher_删除节点_18

5、avg()函数

返回由match命令匹配成功的记录中某字段的平均值.

# 返回匹配标签Employee成功的记录中, 所有员工工资的平均值
MATCH (e:Employee) RETURN avg(e.salary)

数据库图longtest应该放多大 图数据库cypher_Cypher_19


十一、索引index

Neo4j支持在节点或关系属性上的索引, 以提高查询的性能.

可以为具有相同标签名称的所有节点的属性创建索引.

1、创建索引

使用create index on来创建索引.

# 创建节点Employee上面属性id的索引
CREATE INDEX ON:Employee(id)

数据库图longtest应该放多大 图数据库cypher_Neo4j_20

2、删除索引

使用drop index on来删除索引.

# 删除节点Employee上面属性id的索引
DROP INDEX ON:Employee(id)

数据库图longtest应该放多大 图数据库cypher_删除节点_21

小节总结:

Cypher的基本概念:Cypher是neo4j图数据的查询语言, 类似于mysql数据库的sql语句, 但是它允许对图形进行富有表现力和有效的查询和更新.

Cypher的基本命令和语法:
* create命令
* match命令
* merge命令
* relationship关系命令
* where命令
* delete命令
* sort命令
* 字符串函数
* 聚合函数
* index索引命令


  • create命令: 创建图数据中的节点.
  • CREATE (e:Employee{id:222, name:‘Bob’, salary:6000, deptnp:12})

  • match命令: 匹配(查询)已有数据.
  • MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno

  • merge命令: 若节点存在, 则等效与match命令; 节点不存在, 则等效于create命令.
  • MERGE (e:Employee {id:145, name:‘Lucy’, salary:7500, deptno:12})

  • 使用create创建关系: 必须创建有方向性的关系, 否则报错.
  • CREATE (p1:Profile1)-[r:Buy]->(p2:Profile2)

  • 使用merge创建关系: 可以创建有/无方向性的关系.
  • MERGE (p1:Profile1)-[r:miss]-(p2:Profile2)

  • where命令: 类似于SQL中的添加查询条件.
  • MATCH (e:Employee) WHERE e.id=123 RETURN e

  • delete命令: 删除节点/关系及其关联的属性.
  • MATCH (c1:CreditCard)-[r]-(c2:Customer) DELETE c1, r, c2

  • sort命令: Cypher命令中的排序使用的是order by.
  • MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno ORDER BY e.id

  • 字符串函数:
  • toUpper()函数
  • toLower()函数
  • substring()函数
  • replace()函数

  • toUpper()函数: 将一个输入字符串转换为大写字母.
  • MATCH (e:Employee) RETURN e.id, toUpper(e.name), e.salary, e.deptno

  • toLower()函数: 讲一个输入字符串转换为小写字母.
  • MATCH (e:Employee) RETURN e.id, toLower(e.name), e.salary, e.deptno

  • substring()函数: 返回一个子字符串.
  • MATCH (e:Employee) RETURN e.id, substring(e.name,0,2), e.salary, e.deptno

  • replace()函数: 替换掉子字符串.
  • MATCH (e:Employee) RETURN e.id, replace(e.name,e.name,e.name + “_HelloWorld”), e.salary, e.deptno

  • 聚合函数
  • count()函数
  • max()函数
  • min()函数
  • sum()函数
  • avg()函数

  • count()函数: 返回由match命令匹配成功的条数.
  • MATCH (e:Employee) RETURN count( * )

  • max()函数: 返回由match命令匹配成功的记录中的最大值.
  • MATCH (e:Employee) RETURN max(e.salary)

  • min()函数: 返回由match命令匹配成功的记录中的最小值.
  • MATCH (e:Employee) RETURN min(e.salary)

  • sum()函数: 返回由match命令匹配成功的记录中某字段的全部加和值.
  • MATCH (e:Employee) RETURN sum(e.salary)

  • avg()函数: 返回由match命令匹配成功的记录中某字段的平均值.
  • MATCH (e:Employee) RETURN avg(e.salary)

  • 索引index
  • Neo4j支持在节点或关系属性上的索引, 以提高查询的性能.
  • 可以为具有相同标签名称的所有节点的属性创建索引.

  • 创建索引: 使用create index on来创建索引.
  • CREATE INDEX ON:Employee(id)

  • 删除索引: 使用drop index on来删除索引.
  • DROP INDEX ON:Employee(id)



参考资料:
图数据库(十四):Neo4j中Cypher书写规范