Neo4j语法

环境

介绍

neo4j是基于Java语言编写图形数据库。图是一组节点和连接这些节点的关系。图形数据库也被称为图形数据库管理系统或GDBMS。
Neo4j的是一种流行的图形数据库。 其他的图形数据库是Oracle NoSQL数据库,OrientDB,HypherGraphDB,GraphBase,InfiniteGraph,AllegroGraph。

安装

  1. 既然是基于java语言编写的,那就需要安装JRE/JDK ,目前最新版需要java 12,否则会报jvm版本不支持高版本编译的class
  2. 官网下载最新版 Neo4j 社区版(Community)
  3. 解压就可以了

使用

启动:找到bin目录,使用./neo4j start 命令启动。

停止:./neo4j stop

首次登陆用户名和密码都是neo4j,会提示修改密码。

修改好密码之后就可以进行操作了

语法

基础语法

命令列表

命令 说明
create 创建节点、关系或者属性
match 匹配有关节点、关系或者属性的数据
return 返回查询结果
where 提供条件过滤
delete 删除节点或者关系
remove 删除节点属性或者关系属性
order by 排序
set 添加或者更新标签

函数

函数 说明
String 用于字符串
Aggregation 用于一些聚合操作
Relationship 用于获取关系的细节

数据类型

类型 说明
boolean 布尔类型:true,false
byte 8位整数
short 16位整数
int 32位整数
long 64位整数
float 32位浮点数
double 64位浮点数
char 16位字符
String 字符串

create语句

1
2
3
4
5
6
7
8
CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)

label-name 表示标签名称,node-name表示节点名称。节点名称其实只在这个语句中有效。创建语句不一定需要属性和节点名称,只要有标签名称就可以创建了。

例如:创建一个姓名叫张三,年龄40岁的教师。

1
create(:teacher{name:"张三",age:40})

这样就能看到一个张三的教师节点了。

同样可以再创建一个叫李四的45岁教师。

match和return语句

1
2
3
4
5
6
7
8
MATCH 
(
<node-name>:<label-name>
)
RETURN
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>

match语句一般和return语句一起使用。
例如:查询一下教师

1
match(t:teacher) return t

或者查询具体的属性

1
match(t:teacher) return t.name,t.age

创建多标签节点

例如创建一个名叫王五的55岁教师,同时他也是校长。

1
create(t:teacher:principal{name:"王五",age:55})

创建节点和关系

1
2
3
CREATE (<node1-name>:<label1-name>)-
[<relationship-name>:<relationship-label-name>]
->(<node2-name>:<label2-name>)

例如:创建一个名叫赵六的42岁教师,他教一个名叫钱七的12岁学生。
注意关系是有方向的。

1
create(t:teacher{name:"赵六",age:42})-[r:teach]->(s:student{name:"钱七",age:12})

创建已有节点的关系

例如:张三也开始教钱七了

1
match(a:teacher{name:"张三"}),(b:student{name:"钱七"}) create (a)-[r:teach]->(b)

创建新节点和已有节点的关系

例如:李四开始教一个名叫周八的14岁学生

1
match(a:teacher{name:"李四"}) create (a)-[r:teach]->(b:student{name:"周八",age:14})

where语句

用以过滤内容,例如查询教师张三

1
match (a:teacher) where a.name="张三" return a

where可以设置多个条件,例如查询教师张三和李四

1
match (a:teacher) where a.name="张三" or a.name="李四" return a

像这样查询不同节点标签也是可以的

1
2
3
MATCH (t:teacher),(s:student) 
WHERE t.name = "张三" AND s.name= "钱七"
return t,s

delete语句

删除李四与周八的关系

1
match (t:teacher{name:"李四"})-[r:teach]->(s:student{name:"周八"}) delete r

删除节点也是一样的,可以删除李四和周八

1
match (t:teacher{name:"李四"}),(s:student{name:"周八"}) delete t,s

set语句

set语句用于新增/更新属性或者标签

新增属性

1
match(t:teacher{name:"王五"}) set t.level = "A"

新增标签

1
match(t:teacher{name:"王五"}) set t:father

remove语句

remove语句用于删除属性或者标签
删除属性

1
match(t:teacher{name:"王五"}) remove t.level

删除标签

1
match(t:teacher{name:"王五"}) remove t:father

order by

查询教师的年龄,按照年龄排序

1
match(t:teacher) return t.name  order by t.age 

skip 和limit

跳过记录条数和查询记录条数

1
match(t:teacher) return t.name  order by t.age skip 1 limit 2

UNION

合并结果

1
match(t:teacher) return t.name as name UNION match(s:student) return s.name as name

UNION的前提是必须列名完全一样,所以这里要用as来取别名

MERGE

MERGE = CREATE + MATCH
Neo4j CQL MERGE命令在图中搜索给定模式,如果存在,则返回结果
如果它不存在于图中,则它创建新的节点/关系并返回结果。

null值

null的操作和sql类似,where name is null 或者 where name is not null

函数

字符串函数

函数 描述
UPPER 它用于将所有字母更改为大写字母。
LOWER 它用于将所有字母改为小写字母。
SUBSTRING 它用于获取给定String的子字符串。
REPLACE 它用于替换一个字符串的子字符串。

聚合函数

函数 描述
COUNT 它返回由MATCH命令返回的行数。
MAX 它从MATCH命令返回的一组行返回最大值。
MIN 它返回由MATCH命令返回的一组行的最小值。
SUM 它返回由MATCH命令返回的所有行的求和值。
AVG 它返回由MATCH命令返回的所有行的平均值。

例如查询教师的平均年龄

1
match(t:teacher) return avg(t.age)

函数 描述
STARTNODE 它用于知道关系的开始节点。
ENDNODE 它用于知道关系的结束节点。
ID 它用于知道关系的ID。
TYPE 它用于知道字符串表示中的一个关系的TYPE。

查找所有教学关系中开始节点

1
match (a)-[r:teach]->(b) return STARTNODE(r)

索引

在属性上创建索引能提高查询效率

1
CREATE INDEX ON :<label_name> (<property_name>)
1
DROP INDEX ON :<label_name> (<property_name>)

创建唯一约束

1
2
CREATE CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE
1
2
DROP CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE