环境
介绍
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语句
sql 代码:CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)
label-name 表示标签名称,node-name表示节点名称。节点名称其实只在这个语句中有效。创建语句不一定需要属性和节点名称,只要有标签名称就可以创建了。
例如:创建一个姓名叫张三,年龄40岁的教师。
sql 代码:create(:teacher{name:"张三",age:40})
这样就能看到一个张三的教师节点了。
同样可以再创建一个叫李四的45岁教师。
match和return语句
sql 代码:MATCH
(
<node-name>:<label-name>
)
RETURN
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>
match语句一般和return语句一起使用。
例如:查询一下教师
match(t:teacher) return t
或者查询具体的属性
sql 代码:match(t:teacher) return t.name,t.age
创建多标签节点
例如创建一个名叫王五的55岁教师,同时他也是校长。
sql 代码:create(t:teacher:principal{name:"王五",age:55})
创建节点和关系
sql 代码:CREATE (<node1-name>:<label1-name>)-
[<relationship-name>:<relationship-label-name>]
->(<node2-name>:<label2-name>)
例如:创建一个名叫赵六的42岁教师,他教一个名叫钱七的12岁学生。
注意关系是有方向的。
create(t:teacher{name:"赵六",age:42})-[r:teach]->(s:student{name:"钱七",age:12})
创建已有节点的关系
例如:张三也开始教钱七了
sql 代码:match(a:teacher{name:"张三"}),(b:student{name:"钱七"}) create (a)-[r:teach]->(b)
创建新节点和已有节点的关系
例如:李四开始教一个名叫周八的14岁学生
sql 代码:match(a:teacher{name:"李四"}) create (a)-[r:teach]->(b:student{name:"周八",age:14})
where语句
用以过滤内容,例如查询教师张三
sql 代码:match (a:teacher) where a.name="张三" return a
where可以设置多个条件,例如查询教师张三和李四
sql 代码:match (a:teacher) where a.name="张三" or a.name="李四" return a
像这样查询不同节点标签也是可以的
sql 代码:MATCH (t:teacher),(s:student)
WHERE t.name = "张三" AND s.name= "钱七"
return t,s
delete语句
删除李四与周八的关系
sql 代码:match (t:teacher{name:"李四"})-[r:teach]->(s:student{name:"周八"}) delete r
删除节点也是一样的,可以删除李四和周八
sql 代码:match (t:teacher{name:"李四"}),(s:student{name:"周八"}) delete t,s
set语句
set语句用于新增/更新属性或者标签
新增属性
sql 代码:match(t:teacher{name:"王五"}) set t.level = "A"
新增标签
sql 代码:match(t:teacher{name:"王五"}) set t:father
remove语句
remove语句用于删除属性或者标签
删除属性
match(t:teacher{name:"王五"}) remove t.level
删除标签
sql 代码:match(t:teacher{name:"王五"}) remove t:father
order by
查询教师的年龄,按照年龄排序
sql 代码:match(t:teacher) return t.name order by t.age
skip 和limit
跳过记录条数和查询记录条数
sql 代码:match(t:teacher) return t.name order by t.age skip 1 limit 2
UNION
合并结果
sql 代码: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命令返回的所有行的平均值。 |
例如查询教师的平均年龄
sql 代码:match(t:teacher) return avg(t.age)
函数 | 描述 |
---|---|
STARTNODE | 它用于知道关系的开始节点。 |
ENDNODE | 它用于知道关系的结束节点。 |
ID | 它用于知道关系的ID。 |
TYPE | 它用于知道字符串表示中的一个关系的TYPE。 |
查找所有教学关系中开始节点
sql 代码:match (a)-[r:teach]->(b) return STARTNODE(r)
索引
在属性上创建索引能提高查询效率
sql 代码:CREATE INDEX ON :<label_name> (<property_name>)
sql 代码:DROP INDEX ON :<label_name> (<property_name>)
创建唯一约束
sql 代码:CREATE CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE
sql 代码:DROP CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE