目录
不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵!
学习网站:W3Cschool Neo4j 教程
图数据库——Neo4j
Neo4j的下载
-
先在
cmd
界面中输入java -version
命令判断是否存在Java JDK
,不存在则先下载。 -
官网中下载Neo4j压缩包。(https://neo4j.com/download-center/)
注:我下载的是3.5.30版本,Windows 系统下的。
- 将下载的压缩包解压 ,得到一个文件夹
- 配置系统环境变量
然后在Path
中加入%NEO4J_HOME%\bin
。
- 启动Neo4j
- 在
bin
目录进入cmd
界面
- 输入
neo4j.bat console
命令,出现下述语句,成功。
- 在浏览器中输入
http://localhost:7474/browser/
网址,进入界面。
注:第一次进入需要用户名和密码,初始的都是neo4j,进入后需要改密码。
Neo4j CQL
CQL
代表Cypher
查询语言。 像Oracle
数据库具有查询语言SQL
,Neo4j
具有CQL
作为查询语言。
- 它是
Neo4j
图形数据库的查询语言。 - 它是一种声明性模式匹配语言
- 它遵循
SQL
语法。 - 它的语法是非常简单且人性化、可读的格式。
Neo4j CQL
以命令来执行数据库操作。Neo4j CQL
支持多个子句像在哪里,顺序等,以非常简单的方式编写非常复杂的查询。NNeo4j CQL
支持一些功能,如字符串,Aggregation.In
加入他们,它还支持一些关系功能。
Neo4j CQL数据类型
这些数据类型与Java
语言类似。 它们用于定义节点或关系的属性。
Neo4j CQL
支持以下数据类型:
S.No | CQL数据类型 | 用法 |
---|---|---|
1 | boolean | 用于表示布尔文字:true,false |
2 | byte | 用于表示8位整数 |
3 | short | 用于表示16位整数 |
4 | int | 用于表示32位整数 |
5 | long | 用于表示64位整数 |
6 | float | 用于表示32位浮点数 |
7 | double | 用于表示64位浮点数 |
8 | char | 用于表示16位字符 |
9 | String | 用于表示字符串 |
Neo4j CQL命令
结尾的
;
可有可无。
CREATE命令
- 创建没有属性的节点
- 使用属性创建节点
- 在没有属性的节点之间创建关系
- 使用属性创建节点之间的关系
- 为节点或关系创建单个或多个标签
- 创建没有属性的节点(复制粘贴把<>和里面的内容删除才是正确的)
create (emp<node-name>:Employee<label-name>) return emp
create (dept:Dept) return dept
- 创建具有属性的节点
CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)
CREATE (dept:Dept
{
deptno:10,
dname:"Accounting",
location:"Hyderabad"
})
return dept
CREATE (emp:Employee
{
id:123,
name:"Lokesh",
sal:35000,
deptno:10
})
return emp
MATCH命令
- 从数据库获取有关节点和属性的数据
- 从数据库获取有关节点,关系和属性的数据
- 检索没有属性的节点
MATCH
(
<node-name>:<label-name>
)
MATCH (dept:Dept)
MATCH (dept:Dept) 使用后报错了,Match命令,必须有返回,需要和return命令一起使用,不可单独使用。
MATCH (dept:Dept) return dept
没有报错,出现两个节点,正确!
- 查找全部节点
match (n) return n
- 检索有属性的节点
match (emp:Employee
{
id:123,
name:"Lokesh"
}) return emp
MATCH (emp:Employee)
WHERE emp.name = "Lokesh"
RETURN emp
match (dept:Dept
{
location:"Hyderabad"
}) return dept;
RETURN命令
- 检索节点的某些属性
- 检索节点的所有属性
- 检索节点和关联关系的某些属性
- 检索节点和关联关系的所有属性
- 检索节点属性
RETURN
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>
RETURN dept.deptno
报错了!说明return命令不能单独使用,要和match或者create命令一起使用。
match (dept:Dept) return dept.deptno
两个数据,一个null,一个10,正确!
MATCH & RETURN命令
- 查看节点属性
MATCH (dept: Dept)
RETURN dept.deptno,dept.dname,dept.location
- 查看节点
MATCH (dept: Dept)
RETURN dept
CREATE & MATCH & RETURN命令
以客户节点和信用卡节点为例进行学习。
- 创建客户节点
CREATE (c:Customer{id:"1001",name:"KG",dob:"2000/02/05"}) return c;
- 创建信用卡节点
CREATE (cd:Card
{id:"5001",number:"1234567890",cvv:"888",expiredate:"20/17"}
) return cd
- 查看信用卡节点和客户节点的详细信息
MATCH (c:Customer)
RETURN c.id,c.name,c.dob
MATCH (cd:Card)
RETURN cd.id,cd.number,cd.cvv,cd.expiredate
关系基础
根据属性图模型,关系应该是定向
的。 否则,Neo4j
将抛出一个错误消息。
Neo4j
关系的类型:
- 单向关系
- 双向关系
创建关系场景:
- 在两个现有节点之间创建无属性的关系
- 在两个现有节点之间创建有属性的关系
- 在两个新节点之间创建无属性的关系
- 在两个新节点之间创建有属性的关系
- 在具有WHERE子句的两个退出节点之间创建/不使用属性的关系
创建关系
创建客户节点和信用卡节点之间的关系
- 在两个现有节点之间创建无属性的关系
//创建关系语句格式
MATCH (<node1-label-name>:<nodel-name>),(<node2-label-name>:<node2-name>)
CREATE
(<node1-label-name>)-
[<relationship-label-name>:<relationship-name>
{<define-properties-list>}]
->(<node2-label-name>)
RETURN <relationship-label-name>
//创建客户节点和信用卡节点之间无属性的关系
match (c:Customer),(cd:Card)
create (c) - [r:DO_SHOPPING_WITH] -> (cd)
return r
- 在两个现有节点之间创建有属性的关系
//创建客户节点和信用卡节点之间有属性的关系
MATCH (c:Customer),(cd:Card)
CREATE (c)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cd)
RETURN r
//创建信用卡节点和客户节点之间有属性的关系
MATCH (cd:Card),(c:Customer)
CREATE (cd)-[r:ASSOCIATED_WITH{sale:50000}]->(c)
RETURN r
- 查看关系的详细信息
MATCH (c)-[r:DO_SHOPPING_WITH ]->(cd)
RETURN r //查看客户节点到信用卡节点之间的关系
- 查看关系的节点的详细信息
//查看这个关系的两边节点的详细信息
MATCH (c)-[r:DO_SHOPPING_WITH]->(cd)
RETURN c,cd
创建标签
标签,简单理解,就是类型。就好比Java
中的自定义类,标签名,就是类型名。
- 为节点创建单个标签
CREATE (<node-name>:<label-name>)
CREATE (g:GooglePlusProfile) return g
- 为节点创建多个标签
CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)
CREATE (m:Movie:Cinema:Film:Picture) return m
- 为关系创建单个标签
CREATE (<node1-name>:<label1-name>)-
[<relationship-name>:<relationship-label-name>]
->(<node2-name>:<label2-name>)
CREATE (p1:Profile1)-[r1:LIKES]->(p2:Profile2) return p1,p2,r1
WHERE子句
作用:提供match查询的条件,过滤查询结果
。
- 简单
WHERE
语法
WHERE <condition>
- 复杂
WHERE
语法
WHERE <condition> <boolean-operator> <condition>
- 条件语法
<property-name> <comparison-operator> <value>
以员工数据为例进行学习
- 检索所有员工信息
match (emp:Employee) return emp.empid,emp.name,emp.salary,emp.deptno;
- 根据员工姓名进行检索
MATCH (emp:Employee)
WHERE emp.name = 'KK' OR emp.name = 'JK'
RETURN emp
使用WHERE子句创建关系
在Neo4j
中可以用不同的方式创建关系:
-
创建两个现有节点之间的关系
-
一次创建两个节点和它们之间的关系
-
使用WHERE子句创建两个现有节点之间的关系(当小节重点)
- 语法
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) //查找到这两个节点
WHERE <condition> //查找过滤条件
CREATE (<node1-label-name>)-
[<relationship-label-name>:<relationship-name>
{<relationship-properties>}] //创建两个节点间的关系
->(<node2-label-name>)
- 利用
WHERE
子句创建客户节点和信用卡节点之间的关系
MATCH (c:Customer),(cd:Card) //找到两个节点
WHERE c.id = "1001" AND cd.id= "5001" //具体的两个
CREATE (c)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cd) //创建有属性的关系
RETURN r //返回
DELETE命令
- 删除节点
- 删除节点及相关节点和关系
- 语法
DELETE <node-name-list>
- 删除节点
MATCH (emp: Employee) where emp.name = "KK" delete emp
- 删除节点和关系
DELETE <node1-name>,<node2-name>,<relationship-name>
MATCH (c:Customer)-[r]->(cd:Card)
DELETE cd,c,r
注:关系中的第二个-
符号,是不是箭头都行,可以是-
,也可以是->
。
REMOVE命令
- 删除节点或关系的标签
- 删除节点或关系的属性
- 语法
REMOVE <property-name-list>
- 属性名语法
<node-name>.<property1-name>,
<node-name>.<property2-name>,
....
<node-name>.<propertyn-name>
以书本节点的属性为例子,进行学习
- 创建一本书
CREATE (book:Book {id:122,title:"Neo4j Tutorial",pages:340,price:250})
RETURN book
- 删除价格属性
MATCH (book { id:122 }) //找到书
REMOVE book.price //去掉价格
RETURN book //返回
- 删除标签
REMOVE <label-name-list>
<node-name>:<label2-name>,
....
<node-name>:<labeln-name>
MATCH (m:Movie)
REMOVE m:Picture
return m
REMOVE和DELETE命令的区别
DELETE
操作用于删除节点和关联关系。REMOVE
操作用于删除标签和属性。
SET子句
- 向现有节点或关系添加新属性
- 添加或更新属性值
- 语法
SET <property-name-list>
<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>
以书本节点为例进行学习
- 修改书本标题
MATCH (book:Book)
SET book.title = 'superstar'
RETURN book
- 添加书本价格
MATCH (book:Book)
SET book.price = '25'
RETURN book
ORDER BY排序
作用:对返回结果进行排序
。
- 语法
ORDER BY <property-name-list> [DESC]
- 属性名语法
<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>
- 将员工按名字升序排列
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name
- 将员工按名字倒序排列
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name DESC
UNION子句
UNION
作用:它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。简单来说,就是将两个结果的所有内容合并输出,若是有重复,输出一个。
限制:结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同
。
- 语法
<MATCH Command1>
UNION
<MATCH Command2>
- 返回雇员节点和雇主节点的
empid
和name
MATCH (emp:Employee) RETURN emp.empid,emp.name
UNION
MATCH (e:Employer) RETURN e.empid,e.name
注:这个会报错,因为合并的两个节点要有相同的列名。这里的属性名相同,但是前缀不同,因此会报错。所以需要采用
AS
子句加一些别名。
MATCH (emp:Employee) RETURN emp.empid as empid,emp.name as name
UNION
MATCH (e:Employer) RETURN e.empid as empid,e.name as name
UNION ALL
作用:它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。简单来说,就是将两个结果的所有内容合并输出,无论是否重复,全部输出
。
限制:和NUION
的使用限制一样。
- 语法
<MATCH Command1>
UNION ALL
<MATCH Command2>
- 返回雇员节点和雇主节点的
empid
和name
MATCH (emp:Employee) RETURN emp.empid as empid,emp.name as name
UNION ALL
MATCH (e:Employer) RETURN e.empid as empid,e.name as name
LIMIT和SKIP子句
LIMIT子句
作用:过滤或限制查询返回的行数,它修剪CQL查询结果集底部
的结果。
- 语法
LIMIT <number>
- 返回n条记录(n为可变数)
MATCH (emp:Employee)
RETURN emp
LIMIT n
注:若n小于数据总条数,则返回前面的n条数据。
SKIP子句
作用:过滤或限制查询返回的行数,它修整了CQL查询结果集顶部
的结果。
- 语法
SKIP <number>
- 跳过n条记录,返回后面的所有记录(n为可变数)
MATCH (emp:Employee)
RETURN emp
SKIP n
注:n只有小于数据总条数时,才会返回数据。
MERGE命令
- 创建节点,关系和属性
- 从数据库检索数据
MERGE = CREATE + MATCH
注:MERGE命令是CREATE命令和MATCH命令的组合。采用它进行检索时,如果有存在结果,直接返回;如果没有结果,则它创建新的节点或关系并返回结果。
- 语法
MERGE (<node-name>:<label-name>
{
<Property1-name>:<Pro<rty1-Value>
.....
<Propertyn-name>:<Propertyn-Value>
})
MERGE命令和CREATE命令的区别
CREATE
命令只向数据库中新增节点,无论这个节点是否存在。MERGE
命令从数据库中检索这个节点,如果存在,则不新建这个节点;如果不存在,再创建这个节点,并将其返回。
NULL值
NULL
值:节点或关系的属性的缺失值或未定义值。
当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。
- 创建一个属性值为
NULL
的雇主节点
create (e:Employer) return e
- 检索所有雇主节点
MATCH (e:Employer)
RETURN e.empid,e.name
发现存在一个所有属性值都为
NULL
的节点。
- 检索
name
不为空的雇主节点
MATCH (e:Employer)
WHERE e.name is not null
RETURN e.empid,e.name
- 检索
name
为空的雇主节点
MATCH (e:Employer)
WHERE e.name is null
RETURN e.empid,e.name
IN操作符
作用:为CQL
命令提供值的集合。
- 语法
IN[<Collection-of-values>]
- 查找
empid
为1
和3
的雇员节点
MATCH (emp:Employee)
where emp.empid in ["1","3"]
RETURN emp.empid,emp.name,emp.salary,emp.deptno
Neo4j CQL函数
字符串函数
S.No. | 功能 | 描述 |
---|---|---|
1 | UPPER | 它用于将所有字母更改为大写字母。 |
2 | LOWER | 它用于将所有字母改为小写字母。 |
3 | SUBSTRING | 它用于获取给定String的子字符串。 |
4 | REPLACE | 它用于替换一个字符串的子字符串。 |
UPPER
- 语法
UPPER (<input-string>)
- 将雇员节点的姓名输出大写表示
MATCH (e:Employee)
RETURN e.empid,UPPER(e.name),e.salary,e.deptno
LOWER
- 语法
LOWER (<input-string>)
- 将雇员节点的姓名输出小写表示
MATCH (e:Employee)
RETURN e.empid,LOWER(e.name),e.salary,e.deptno
SUBSTRING
- 语法
SUBSTRING(<input-string>,<startIndex> ,<endIndex>)
- 返回雇员节点的名字,从第
i
个开始,长度为n
MATCH (e:Employee)
RETURN e.empid,SUBSTRING(e.name,i,n),e.salary,e.deptno
REPLACE
- 语法
REPALCE(<input-string>,<from-string>,<to-string>)
- 将名字为
OPEN
的雇员节点的名字修改为LJK
match (e:Employee)
return e.empid,REPLACE(e.name,"OPEN","LJK"),e.salary,e.deptno
AGGREGATION聚合
S.No. | 聚集功能 | 描述 |
---|---|---|
1 | COUNT | 它返回由MATCH命令返回的行数。 |
2 | MAX | 它从MATCH命令返回的一组行返回最大值。 |
3 | MIN | 它返回由MATCH命令返回的一组行的最小值。 |
4 | SUM | 它返回由MATCH命令返回的所有行的求和值。 |
5 | AVG | 它返回由MATCH命令返回的所有行的平均值。 |
COUNT
- 语法
COUNT(<value>)
- 返回雇员节点数目
MATCH (e:Employee) RETURN COUNT(*)
MAX & MIN
- 语法
MAX(<property-name> )
MIN(<property-name> )
- 返回雇员中最大工资和最小工资
MATCH (e:Employee)
RETURN MAX(e.salary),MIN(e.salary)
SUM & AVG
- 语法
AVG(<property-name> )
SUM(<property-name> )
- 返回雇员的平均工资和所有工资总和
MATCH (e:Employee)
RETURN SUM(e.salary),AVG(e.salary)
关系函数
S.No. | 功能 | 描述 |
---|---|---|
1 | STARTNODE | 它用于知道关系的开始节点。 |
2 | ENDNODE | 它用于知道关系的结束节点。 |
3 | ID | 它用于知道关系的ID。 |
4 | TYPE | 它用于知道字符串表示中的一个关系的TYPE。 |
STARTNODE & ENDNODE
- 语法
STARTNODE (<relationship-label-name>)
ENDNODE (<relationship-label-name>)
- 找到客户节点和信用卡节点之间关系的开始节点
MATCH (c) - [r:DO_SHOPPING_WITH] -> (cd)
RETURN STARTNODE(r)
- 找到客户节点和信用卡节点之间关系的结束节点
MATCH (c) - [r:DO_SHOPPING_WITH] -> (cd)
RETURN ENDNODE(r)
ID & TYPE
- 语法
ID (<relationship-label-name>)
TYPE (<relationship-label-name>)
- 返回客户节点和信用卡节点之间关系的
ID
和TYPE
match (c) - [r:DO_SHOPPING_WITH] - (cd)
return ID(r),TYPE(r)
总结
- 图数据库对于具有关联的数据查询具有优势。
- 图数据库比关系型数据库更适合知识图谱的搭建。
- 学完以上知识,可以基本使用
Neo4j
图数据库了。