在上篇Neo4j系列(一)—初始Neo4j,我们简单认识了neo4j,了解其模型规则和安装步骤,这一节来了解下Neo4j的查询语言Cypher。
像关系型数据库Mysql、Oracle等有查询语言SQL,Neo4j的查询语言便是CQL。Cypher是对图形的声明查询语言,接下来从Neo4j基本命令、函数和索引三方面来认识一下Cypher
本博目录:
一、 CQL 基本命令
Neo4j的主要构建块是:节点、关系、属性,CQL命令用来操作这三个构建块,我们使用CQL基本命令来描绘如图所示的关系:
Cypher语言的关键字不区分大小写,但是属性值,标签,关系类型和变量是区分大小写的
① CREATE : 创建节点或者关系 (每个节点都有一个整数ID),语法如下:
CREATE (<node-name>:<label-name>)
//创建多个标签
create (p:Person:People)
//创建无属性节点
create (p:Person)
//创建带属性节点
create (p:Person{name:"刘备",word:"玄德",horse:"的卢",weapon:"双股剑",sex:"男"})
create (p:Person{name:"关羽",word:"长生",horse:"赤兔",weapon:"青龙偃月刀"})
create (p:Person{name:"张飞",word:"翼德",horse:"王追",weapon:"丈八蛇矛"})
create (p:Person{name:"曹操",word:"孟德",horse:"绝影",weapon:"青虹剑"})
create (p:Person{name:"孙权",word:"仲谋",horse:"快航",weapon:"白虹剑"})
//创建无属性的关系
match(p:Person),(g:Person)
where p.name="刘备" and g.name="关羽"
create(p)-[r:MY_GENERAL]->(g)
//创建带属性的关系
match(p:Person),(g:Person)
where p.name="刘备" and g.name="孙权"
create(p)-[r:MY_ENEMY{relative:"0"}]->(g)
return r
② MATCH:匹配图形模式,可以定位感兴趣的数据,不能单独使用MATCH子句,语法如下:
MATCH ( <node-name>:<label-name>)
match (p:Person) //匹配模式,无return返回报错
③ RETURN:返回感兴趣的结果,不能单独使用RETURN子句; Neo4j使用CQL MATCH + RETURN从数据库检索数据,语法如下:
RETURN
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>
match (p:Person)
return p.name
④DELETE:删除节点和关联关系,与MATCH命令一起使用。 语法如下:DELETE <node-name-list>
// 删除节点
match (p: Person)
where p.name="刘备"
delete p
// 删除关系
MATCH (p: Person)-[r:MY_GENERAL]-(g:Person)
DELETE r
⑤REMOVE: 删除节点或关系的标签、属性,与MATCH命令一起使用。语法如下:
REMOVE <property-name-list>
// 删除节点P的“性别”属性
match(p:Person)
remove p.sex
return p
//删除节点的标签
match(m:Person)
remove m:People
⑥SET :向现有节点或关系添加或更新属性值,语法如下:
SET <property-name-list>
// 给节点P添加字属性
match (p:Person)
where p.name="关羽"
set p.word="云长"
return p
⑦order by 排序,语法如下:ORDER BY <property-name-list> [DESC]
//按照p.name按降序排序
match (p:Person)
return p.name,p.word
order by p.name
⑧LIMIT:过滤或限制查询返回的行数,语法如下LIMIT <number>
// 返回3个Person标签的节点
match (p:Person)
return p
limit 3
⑨SKIP:从第几个记录开始,语法如下:SKIP <number>
// 返回从第3个起的Person标签的节点
match (p:Person)
return p
skip 3
⑩where : 基于某些标准过滤数据,在where语句中使用 and、or、not、xor、= 、<>、<、>、<=、>=等运算符
match(p:Person)
where p.name =<> '刘备'
return p
经过以上命令,我们建立了如图所示的关系图:
二、 CQL 函数
2.1、字符串函数
函数 | 功能 |
---|---|
UPPER | 将所有字母改为大写字母 |
LOWER | 将所有字母改为小写字母 |
SUBSTRING | 获取给定String的子字符串 |
REPLACE | 替换一个字符串的子字符串 |
2.2、聚合函数
函数 | 功能 |
---|---|
COUNT | 返回由MATCH命令返回的行数 |
MAX | 从MATCH命令返回的一组行返回最大值 |
MIN | 返回由MATCH命令返回的一组行的最小值 |
AVG | 返回由MATCH命令返回的所有行的平均值 |
SUM | 返回由MATCH命令返回的所有行的求和值 |
2.3、关系函数
函数 | 功能 |
---|---|
STARTNODE | 用于知道关系的开始节点 |
ENDNODE | 用于知道关系的结束节点 |
ID | 用于知道关系的ID,获取指定节点的内部编号 |
TYPE | 查找一个关系的类型 |
HAS | 如果一个节点或关系具有给定名字的属性存在,返回true |
NODES | 把一个路径转换成一个可迭代的节点集 |
2.4、with语句的管道功能
在Cypher中,可以将一个查询的输出链接到另一个查询中,从而创建功能强大的图形结构,with的每一个结果,必须使用别名标识。
MATCH (p:Person)-[:MY_GENERAL]->(g:Person)
WITH p, p.name AS name
WHERE name <> "刘备"
RETURN p.name, p.word,p.weapon
三、 CQL 索引、约束
Neo4j SQL支持节点或关系属性上的索引,以提高应用程序的性能。
我们可以为具有相同标签名称的所有节点的属性创建索引。
我们可以在MATCH或WHERE或IN运算符上使用这些索引列来改进CQL Command的执行。
3.1 Neo4j索引操作
创建索引 CREATE INDEX ON :<label_name> (<property_name>)
CREATE INDEX ON :Person(name)
丢弃索引 DROP INDEX ON :<label_name> (<property_name>)
DROP INDEX ON :Person(name)
3.2 约束操作
在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据我们对某些节点或关系的应用需求,我们必须避免这种重复。 然后我们不能直接得到这个。 我们应该使用一些数据库约束来创建节点或关系的一个或多个属性的规则。
像SQL一样,Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束,UNIQUE约束的使用是为了避免重复记录,强制执行数据完整性规则。语法如下:
CREATE CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE
Neo4j CQL提供了“DROP CONSTRAINT”命令,以从NODE或Relationship的属性中删除现有的Unique约束。语法如下:
DROP CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE