图数据库——Neo4j


不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵!

学习网站:W3Cschool Neo4j 教程

图数据库——Neo4j

Neo4j的下载

  1. 先在cmd界面中输入java -version命令判断是否存在Java JDK,不存在则先下载。

  2. 官网中下载Neo4j压缩包。(https://neo4j.com/download-center/)

在这里插入图片描述
:我下载的是3.5.30版本,Windows 系统下的。

  1. 将下载的压缩包解压 ,得到一个文件夹

在这里插入图片描述

  1. 配置系统环境变量

在这里插入图片描述
然后在Path中加入%NEO4J_HOME%\bin

  1. 启动Neo4j
  • bin目录进入cmd界面

在这里插入图片描述

  • 输入neo4j.bat console命令,出现下述语句,成功。

在这里插入图片描述

  • 在浏览器中输入http://localhost:7474/browser/网址,进入界面。

在这里插入图片描述
:第一次进入需要用户名和密码,初始的都是neo4j,进入后需要改密码。

Neo4j CQL

CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQLNeo4j具有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命令

  1. 创建没有属性的节点
  2. 使用属性创建节点
  3. 在没有属性的节点之间创建关系
  4. 使用属性创建节点之间的关系
  5. 为节点或关系创建单个或多个标签
  • 创建没有属性的节点(复制粘贴把<>和里面的内容删除才是正确的)
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命令

  1. 从数据库获取有关节点和属性的数据
  2. 从数据库获取有关节点,关系和属性的数据
  • 检索没有属性的节点
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命令

  1. 检索节点的某些属性
  2. 检索节点的所有属性
  3. 检索节点和关联关系的某些属性
  4. 检索节点和关联关系的所有属性
  • 检索节点属性
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中可以用不同的方式创建关系:

  1. 创建两个现有节点之间的关系

  2. 一次创建两个节点和它们之间的关系

  3. 使用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命令

  1. 删除节点
  2. 删除节点及相关节点和关系
  • 语法
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命令

  1. 删除节点或关系的标签
  2. 删除节点或关系的属性
  • 语法
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子句

  1. 向现有节点或关系添加新属性
  2. 添加或更新属性值
  • 语法
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>
  • 返回雇员节点和雇主节点的empidname
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>
  • 返回雇员节点和雇主节点的empidname
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命令

  1. 创建节点,关系和属性
  2. 从数据库检索数据
MERGE = CREATE + MATCH

MERGE命令是CREATE命令和MATCH命令的组合。采用它进行检索时,如果有存在结果,直接返回;如果没有结果,则它创建新的节点或关系并返回结果。

  • 语法
MERGE (<node-name>:<label-name>
{
   <Property1-name>:<Pro<rty1-Value>
   .....
   <Propertyn-name>:<Propertyn-Value>
})

MERGE命令和CREATE命令的区别

  1. CREATE命令只向数据库中新增节点,无论这个节点是否存在。
  2. 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>]
  • 查找empid13的雇员节点
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>)
  • 返回客户节点和信用卡节点之间关系的IDTYPE
match (c) - [r:DO_SHOPPING_WITH] - (cd) 
return ID(r),TYPE(r)

总结

  1. 图数据库对于具有关联的数据查询具有优势。
  2. 图数据库比关系型数据库更适合知识图谱的搭建。
  3. 学完以上知识,可以基本使用Neo4j图数据库了。

猜你喜欢

转载自blog.csdn.net/qq_46546793/article/details/121908271