Neo4j语法

Neo4j语法
逐暗者环境
介绍
neo4j是基于Java语言编写图形数据库。图是一组节点和连接这些节点的关系。图形数据库也被称为图形数据库管理系统或GDBMS。
Neo4j的是一种流行的图形数据库。 其他的图形数据库是Oracle NoSQL数据库,OrientDB,HypherGraphDB,GraphBase,InfiniteGraph,AllegroGraph。
安装
- 既然是基于java语言编写的,那就需要安装JRE/JDK ,目前最新版需要java 12,否则会报jvm版本不支持高版本编译的class
- 从官网下载最新版 Neo4j 社区版(Community)
- 解压就可以了
使用
启动:找到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 | CREATE ( |
label-name 表示标签名称,node-name表示节点名称。节点名称其实只在这个语句中有效。创建语句不一定需要属性和节点名称,只要有标签名称就可以创建了。
例如:创建一个姓名叫张三,年龄40岁的教师。
1 | create(:teacher{name:"张三",age:40}) |
这样就能看到一个张三的教师节点了。
同样可以再创建一个叫李四的45岁教师。
match和return语句
1 | MATCH |
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 | CREATE (<node1-name>:<label1-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 | MATCH (t:teacher),(s:student) |
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 | CREATE CONSTRAINT ON (<label_name>) |
1 | DROP CONSTRAINT ON (<label_name>) |