目录
不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵!
学习网站: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.NoCQL数据类型用法1boolean用于表示布尔文字:true,false2byte用于表示8位整数3short用于表示16位整数4int用于表示32位整数5long用于表示64位整数6float用于表示32位浮点数7double用于表示64位浮点数8char用于表示16位字符9String用于表示字符串
Neo4j CQL命令
结尾的
;
可有可无。
CREATE命令
- 创建没有属性的节点
- 使用属性创建节点
- 在没有属性的节点之间创建关系
- 使用属性创建节点之间的关系
-
为节点或关系创建单个或多个标签
-
创建没有属性的节点(复制粘贴把<>和里面的内容删除才是正确的)
create (emp:Employee) return emp
create (dept:Dept) return dept
- 创建具有属性的节点
CREATE (
:
{
:
........
:
}
)
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
(
:
)
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
.,
........
.
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 (:),(:)
CREATE
()-
[:
{}]
->()
RETURN
//创建客户节点和信用卡节点之间无属性的关系
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 (:)
CREATE (g:GooglePlusProfile) return g
- 为节点创建多个标签
CREATE (::.....:)
CREATE (m:Movie:Cinema:Film:Picture) return m
- 为关系创建单个标签
CREATE (:)-
[:]
->(:)
CREATE (p1:Profile1)-[r1:LIKES]->(p2:Profile2) return p1,p2,r1
WHERE子句
作用: 提供match查询的条件,过滤查询结果
。
- 简单
WHERE
语法
WHERE
- 复杂
WHERE
语法
WHERE
- 条件语法
以员工数据为例进行学习
- 检索所有员工信息
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 (:),(:) //查找到这两个节点
WHERE //查找过滤条件
CREATE ()-
[:
{}] //创建两个节点间的关系
->()
- 利用
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
- 删除节点
MATCH (emp: Employee) where emp.name = "KK" delete emp
- 删除节点和关系
DELETE ,,
MATCH (c:Customer)-[r]->(cd:Card)
DELETE cd,c,r
注:关系中的第二个 -
符号,是不是箭头都行,可以是 -
,也可以是 ->
。
REMOVE命令
- 删除节点或关系的标签
-
删除节点或关系的属性
-
语法
REMOVE
- 属性名语法
.,
.,
....
.
以书本节点的属性为例子,进行学习
- 创建一本书
CREATE (book:Book {id:122,title:"Neo4j Tutorial",pages:340,price:250})
RETURN book
- 删除价格属性
MATCH (book { id:122 }) //找到书
REMOVE book.price //去掉价格
RETURN book //返回
- 删除标签
REMOVE
:,
....
:
MATCH (m:Movie)
REMOVE m:Picture
return m
REMOVE和DELETE命令的区别
DELETE
操作用于删除节点和关联关系。REMOVE
操作用于删除标签和属性。
SET子句
- 向现有节点或关系添加新属性
-
添加或更新属性值
-
语法
SET
.,
.,
....
.
以书本节点为例进行学习
- 修改书本标题
MATCH (book:Book)
SET book.title = 'superstar'
RETURN book
- 添加书本价格
MATCH (book:Book)
SET book.price = '25'
RETURN book
ORDER BY排序
作用: 对返回结果进行排序
。
- 语法
ORDER BY [DESC]
- 属性名语法
.,
.,
....
.
- 将员工按名字升序排列
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
作用:它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。 简单来说,就是将两个结果的所有内容合并输出,若是有重复,输出一个。
限制:结果列类型和来自两组结果的名称必须匹配,这意味着 列名称应该相同,列的数据类型应该相同
。
- 语法
UNION
- 返回雇员节点和雇主节点的
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
的使用限制一样。
- 语法
UNION ALL
- 返回雇员节点和雇主节点的
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
- 返回n条记录(n为可变数)
MATCH (emp:Employee)
RETURN emp
LIMIT n
注: 若n小于数据总条数,则返回前面的n条数据。
SKIP子句
作用:过滤或限制查询返回的行数,它修整了CQL查询结果集 顶部
的结果。
- 语法
SKIP
- 跳过n条记录,返回后面的所有记录(n为可变数)
MATCH (emp:Employee)
RETURN emp
SKIP n
注: n只有小于数据总条数时,才会返回数据。
MERGE命令
- 创建节点,关系和属性
- 从数据库检索数据
MERGE = CREATE + MATCH
注: MERGE命令是CREATE命令和MATCH命令的组合。采用它进行检索时,如果有存在结果,直接返回;如果没有结果,则它创建新的节点或关系并返回结果。
- 语法
MERGE (:
{
:
.....
:
})
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[]
- 查找
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.功能描述1UPPER它用于将所有字母更改为大写字母。2LOWER它用于将所有字母改为小写字母。3SUBSTRING它用于获取给定String的子字符串。4REPLACE它用于替换一个字符串的子字符串。
UPPER
- 语法
UPPER ()
- 将雇员节点的姓名输出大写表示
MATCH (e:Employee)
RETURN e.empid,UPPER(e.name),e.salary,e.deptno
LOWER
- 语法
LOWER ()
- 将雇员节点的姓名输出小写表示
MATCH (e:Employee)
RETURN e.empid,LOWER(e.name),e.salary,e.deptno
SUBSTRING
- 语法
SUBSTRING(, ,)
- 返回雇员节点的名字,从第
i
个开始,长度为n
MATCH (e:Employee)
RETURN e.empid,SUBSTRING(e.name,i,n),e.salary,e.deptno
REPLACE
- 语法
REPALCE(,,)
- 将名字为
OPEN
的雇员节点的名字修改为LJK
match (e:Employee)
return e.empid,REPLACE(e.name,"OPEN","LJK"),e.salary,e.deptno
AGGREGATION聚合
S.No.聚集功能描述1COUNT它返回由MATCH命令返回的行数。2MAX它从MATCH命令返回的一组行返回最大值。3MIN它返回由MATCH命令返回的一组行的最小值。4SUM它返回由MATCH命令返回的所有行的求和值。5AVG它返回由MATCH命令返回的所有行的平均值。
COUNT
- 语法
COUNT()
- 返回雇员节点数目
MATCH (e:Employee) RETURN COUNT(*)
MAX & MIN
- 语法
MAX( )
MIN( )
- 返回雇员中最大工资和最小工资
MATCH (e:Employee)
RETURN MAX(e.salary),MIN(e.salary)
SUM & AVG
- 语法
AVG( )
SUM( )
- 返回雇员的平均工资和所有工资总和
MATCH (e:Employee)
RETURN SUM(e.salary),AVG(e.salary)
关系函数
S.No.功能描述1STARTNODE它用于知道关系的开始节点。2ENDNODE它用于知道关系的结束节点。3ID它用于知道关系的ID。4TYPE它用于知道字符串表示中的一个关系的TYPE。
STARTNODE & ENDNODE
- 语法
STARTNODE ()
ENDNODE ()
- 找到客户节点和信用卡节点之间关系的开始节点
MATCH (c) - [r:DO_SHOPPING_WITH] -> (cd)
RETURN STARTNODE(r)
- 找到客户节点和信用卡节点之间关系的结束节点
MATCH (c) - [r:DO_SHOPPING_WITH] -> (cd)
RETURN ENDNODE(r)
ID & TYPE
- 语法
ID ()
TYPE ()
- 返回客户节点和信用卡节点之间关系的
ID
和TYPE
match (c) - [r:DO_SHOPPING_WITH] - (cd)
return ID(r),TYPE(r)
总结
- 图数据库对于具有关联的数据查询具有优势。
- 图数据库比关系型数据库更适合知识图谱的搭建。
- 学完以上知识,可以基本使用
Neo4j
图数据库了。
Original: https://blog.csdn.net/qq_46546793/article/details/121908271
Author: 小叮当不懒
Title: 图数据库——Neo4j
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/557773/
转载文章受原作者版权保护。转载请注明原作者出处!