做网站的软件下载,培训人员网站建设,app开发公司怎么选,成都公司网站开发目录 1、 图数据库Neo4j简介1.1 什么是图数据库1.2 能解决什么痛点1.3 对比关系型数据库1.4 什么是Neo4j1.5 Neo4j的构建元素 2. 环境搭建2.1 安装Neo4j Community Server2.2 docker 安装Neo4j Community Server2.3 Neo4j Desktop安装 3. Neo4j - CQL使用3.1 Neo4j - CQL简介3.… 目录 1、 图数据库Neo4j简介1.1 什么是图数据库1.2 能解决什么痛点1.3 对比关系型数据库1.4 什么是Neo4j1.5 Neo4j的构建元素 2. 环境搭建2.1 安装Neo4j Community Server2.2 docker 安装Neo4j Community Server2.3 Neo4j Desktop安装 3. Neo4j - CQL使用3.1 Neo4j - CQL简介3.2 常用命令CREATE创建MATCH查询RETURN返回WHERE子句DELETE删除REMOVE删除SET子句ORDER BY排序UNION子句LIMIT和SKIP子句NULL值IN操作符INDEX索引UNIQUE约束DISTINCT 3.3 常用函数3.4 neo4j-admin使用3.5 利用CQL构建西游关系图谱 1、 图数据库Neo4j简介
1.1 什么是图数据库
图数据库是基于图论实现的一种NoSQL数据库其数据结构是和查询方式是以图论为基础的图数据库主要用于存储更多的连接数据。 图论用多个节点代表事物用节点之间连线代表事务之间关系的图形。
1.2 能解决什么痛点
随着社交、电商、金融、零售、物联网等行业的快速发展现实社会织起了了一张庞大而复杂的关系网传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数据量呈几何级数增长 急需一种支持海量复杂数据关系运算的数据库图数据库应运而生。
使用场景
社交领域实现好友推荐等电商领域实现商品实时推荐等金融领域银行用图数据库做风控处理等………………
1.3 对比关系型数据库
美国心理学家米尔格伦提出的“六度空间“理论你和任何一个陌生人之间所间隔的人不会超过六个也就是说最多六个人你就能够认识任何一个陌生人。
关系型数据库做法一张用户表一张用户和用户之间的关系表每个人认识的没有一千也有八百想找出想要的数据每深入一层难度成几何增长但使用图数据库难度大大降低。在关系型数据库和图数据库(Neo4j)之间进行了实验在一个社交网络里找到最大深度为5的 朋友的朋友他们的数据集包括100万人每人约有50个朋友。
实验结果如下
1.4 什么是Neo4j
Neo4j是一个开源的NoSQL图形数据库2003 年开始开发使用 scala和java 语言2007年开始发布。是世界上最先进的图数据库之一提供原生的图数据存储检索和处理采用属性图模型Property graph model极大的完善和丰富图数据模型专属查询语言 Cypher直观高效
Neo4j的特性
SQL就像简单的查询语言Neo4j CQL它遵循属性图数据模型它通过使用Apache Lucence支持索引它支持UNIQUE约束它包含一个用于执行CQL命令的UINeo4j数据浏览器它支持完整的ACID原子性一致性隔离性和持久性规则它采用原生图形库与本地GPE图形处理引擎它支持查询的数据导出到JSON和XLS格式 它提供了REST API可以被任何编程语言如JavaSpringScala等访问它提供了可以通过任何UI MVC框架如Node JS访问的Java脚本 它支持两种Java APICypher API和Native Java API来开发Java应用程序
Neo4j的优点
它很容易表示连接的数据检索/遍历/导航更多的连接数据是非常容易和快速的它非常容易地表示半结构化数据Neo4j CQL查询语言命令是人性化的可读格式非常容易学习使用简单而强大的数据模型它不需要复杂的连接来检索连接的/相关的数据因为它很容易检索它的相邻节点或关系细节没有 连接或索引
1.5 Neo4j的构建元素
Neo4j图数据库主要有以下构建元素
节点属性关系标签数据浏览器
节点
节点Node)是图数据库中的一个基本元素用来表示一个实体记录就像关系数据库中的一条记录一样。在Neo4j中节点可以包含多个属性(Property)和多个标签(Label)。节点是主要的数据元素节点通过关系连接到其他节点节点可以具有一个或多个属性即存储为键/值对的属性节点有一个或多个标签用于描述其在图表中的作用
属性
属性Property是用于描述图节点和关系的键值对。其中Key是一个字符串值可以通过使用任何 Neo4j数据类型来表示属性是命名值其中名称或键是字符串属性可以被索引和约束可以从多个属性创建复合索引
关系 关系Relationship同样是图数据库的基本元素。当数据库中已经存在节点后需要将节点连接起来 构成图。关系就是用来连接两个节点关系也称为图论的边(Edge) ,其始端和末端都必须是节点关系不 能指向空也不能从空发起。关系和节点一样可以包含多个属性但关系只能有一个类型(Type) - 关系连接两个节点
关系是方向性的节点可以有多个甚至递归的关系关系可以有一个或多个属性即存储为键/值对的属性
基于方向性Neo4j关系被分为两种主要类型单向关系和双向关系
标签 标签Label将一个公共名称与一组节点或关系相关联节点或关系可以包含一个或多个标签。 我们可以为现有节点或关系创建新标签我们可以从现有节点或关系中删除标签。
标签用于将节点分组
一个节点可以具有多个标签对标签进行索引以加速在图中查找节点本机标签索引针对速度进行了优化
Neo4j Browser 一旦我们安装Neo4j我们就可以访问Neo4j数据浏览器 http://localhost:7474/browser/
个人理解
标签类似MySQL中的表节点类似MySQL中的每行数据对象属性类似MySQL中的每个字段关系类似MySQL中关联表中的数据
2. 环境搭建
2.1 安装Neo4j Community Server
注意 neo4j 4.3及以上版本对应的java版本是jdk11 jdk8可以下载Neo4j Community Edition 3.5.28 下载https://pan.baidu.com/s/1lvn55ZSUknaicVNdMblPEQ 提取码8a54 文档https://neo4j.com/docs/operations-manual/3.5/ 进入到bin目录执行 neo4j console 在浏览器中访问http://localhost:7474 使用用户名neo4j和默认密码neo4j进行连接然后会提示更改密码。
2.2 docker 安装Neo4j Community Server
注意需要开放以下端口
7474 for HTTP7473 for HTTPS7687 for Bolt
拉取镜像
docker pull neo4j:3.5.22-community运行镜像
docker run -d -p 7474:7474 -p 7687:7687 --name neo4j \
-e NEO4J_AUTHneo4j/123456 \
-v /usr/local/soft/neo4j/data:/data \
-v /usr/local/soft/neo4j/logs:/logs \
-v /usr/local/soft/neo4j/conf:/var/lib/neo4j/conf \
-v /usr/local/soft/neo4j/import:/var/lib/neo4j/import \
neo4j:3.5.22-community2.3 Neo4j Desktop安装
下载地址https://neo4j.com/download-center/ 启动后可以选择安装本地neo4j数据库或者连接远程neo4j数据库。
3. Neo4j - CQL使用
3.1 Neo4j - CQL简介
Neo4j的Cypher语言是为处理图形数据而构建的CQL代表Cypher查询语言。像Oracle数据库具有查询 语言SQLNeo4j具有CQL作为查询语言。
它是Neo4j图形数据库的查询语言。它是一种声明性模式匹配语言 它遵循SQL语法。它的语法是非常简单且人性化、可读的格式。
3.2 常用命令
官方英文文档https://neo4j.com/docs/cypher-manual/3.5/clauses/ 中文命令文档https://www.w3cschool.cn/neo4j/neo4j_cql_match_command.html
CREATE创建
create语句是创建模型语句用来创建数据模型
创建节点
#创建带标签和属性的节点并返回节点
create (n:person {name:如来}) return n创建关系
#使用新节点创建关系
CREATE (n:person {name:杨戬})-[r:师傅]-(m:person {name:玉鼎真人}) return type(r);
#使用已知节点创建带属性的关系
create (n:person {name:沙僧}) return n;
create (n:person {name:唐僧}) return n;match (n:person {name:沙僧}),(m:person{name:唐僧})
create (n)-[r:师傅{relation:师傅}]-(m)
return r
#检索关系节点的详细信息
match (n:person)-[r]-(m:person) return n,m创建全路径
create p(:person{name:蛟魔王})-[:义兄]-(:person{name:牛魔王})-[:义兄]- (:person {name:鹏魔王}) return pMATCH查询
Neo4j CQL MATCH命令用于
从数据库获取有关节点和属性的数据从数据库获取有关节点关系和属性的数据
MATCH (n:person) RETURN n LIMIT 25RETURN返回
Neo4j CQL RETURN子句用于
检索节点的某些属性检索节点的所有属性检索节点和关联关系的某些属性检索节点和关联关系的所有属性
MATCH (n:person) RETURN id(n),n.name,n.tail,n.relationWHERE子句
像SQL一样Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。
MATCH (n:person) where n.name牛魔王 or n.name唐僧 RETURN n #创建关系
match (n:person),(m:person)
where n.name唐僧 and m.name如来
create (n)-[r:BOSS]-(m)
return n.name,type(r),m.nameDELETE删除
Neo4j使用CQL DELETE子句
删除节点。删除节点及相关节点和关系。
# 删除节点 前提节点不存在关系
MATCH (n:person{name:如来}) delete n # 删除关系
MATCH (n:person{name:如来})-[r]- (m) delete r return type(r)
MATCH (n:person{name:如来})-[r]-(m) delete r return type(r)MATCH (n:person{name:如来}) delete n
# 删除整个标签内容
match (n:person) detach delete nREMOVE删除
有时基于客户端要求我们需要向现有节点或关系添加或删除属性。我们使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。
删除节点或关系的标签删除节点或关系的属性
#创建多个节点
create (a:person {name:test111,age:20,sex:男}),
(b:person {name:test222,age:30,sex:女}),
(c:person {name:test333,age:40,sex:男})
return a,b,c
#删除属性
MATCH (n:person {name:test111}) remove n.age return n #删除标签
match (m:person {name:test222}) remove m:person return mSET子句
有时根据我们的客户端要求我们需要向现有节点或关系添加新属性。要做到这一点Neo4j CQL提 供了一个SET子句。
向现有节点或关系添加新属性添加或更新属性值
MATCH (n:person {name:test111}) set n.age32 return nORDER BY排序
Neo4j CQL在MATCH命令中提供了“ORDER BY”子句对MATCH查询返回的结果进行排序。 我们可以按升序或降序对行进行排序。默认情况下它按升序对行进行排序。 如果我们要按降序对它们 进行排序我们需要使用DESC子句。
#升序
MATCH (n:person) RETURN id(n),n.name order by id(n) asc
#降序
MATCH (n:person) RETURN id(n),n.name order by id(n) descUNION子句
与SQL一样Neo4j CQL有两个子句将两个不同的结果合并成一组结果
UNION它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。 限制结果列类型和来自两组结果的名称必须匹配这意味着列名称应该相同列的数据类型应该相同。UNION ALL它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。 限制结果列类型并从两个结果集的名字必须匹配这意味着列名称应该是相同的列的数据类型应该 是相同的。
MATCH (n:person) RETURN n.name as name
UNION
MATCH (m:person) RETURN m.name as name MATCH (n:person) RETURN n.name as name
UNION all
MATCH (m:person) RETURN m.name as nameLIMIT和SKIP子句
Neo4j CQL已提供LIMIT子句和 SKIP 来过滤或限制查询返回的行数。 LIMIT返回前几行SKIP忽略前几行。
# 前两行
MATCH (n:person) RETURN n.name limit 2
# 忽略前两行
MATCH (n:person) RETURN n.name SKIP 2NULL值
Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。 当我们创建一个具有现有节点标签名称但未指定其属性值的节点时它将创建一个具有NULL属性值的新节点。
match (n: person) where n.label is null return id(n),n.name,n.tail,n.labelIN操作符
与SQL一样Neo4j CQL提供了一个IN运算符以便为CQL命令提供值的集合。
match (n: person) where n.name in[沙僧,唐僧] return id(n),n.name,n.tail,n.labelINDEX索引
Neo4j SQL支持节点或关系属性上的索引以提高应用程序的性能。 我们可以为具有相同标签名称的所有节点的属性创建索引。 我们可以在MATCH或WHERE或IN运算符上使用这些索引列来改进CQL Command的执行。 Neo4J索引操作
Create Index 创建索引Drop Index 丢弃索引
# 创建索引
create index on :person (name)
# 删除索引
drop index on : person (name)UNIQUE约束
在Neo4j数据库中CQL CREATE命令始终创建新的节点或关系这意味着即使您使用相同的值它也会 插入一个新行。 根据我们对某些节点或关系的应用需求我们必须避免这种重复。像SQL一样Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束 UNIQUE约束的优点
避免重复记录。强制执行数据完整性规则
#创建唯一约束
create constraint on (n:person) assert n.name is unique#删除唯一约束
drop constraint on (n:person) assert n.name is uniqueDISTINCT
这个函数的用法就像SQL中的distinct关键字返回的是所有不同值。
match (n:person) return distinct(n.name)3.3 常用函数
字符串函数 与SQL一样Neo4J CQL提供了一组String函数用于在CQL查询中获取所需的结果。
MATCH (e) RETURN id(e),e.name,substring(e.name,0,2)AGGREGATION聚合 和SQL一样Neo4j CQL提供了一些在RETURN子句中使用的聚合函数。 它类似于SQL中的GROUP BY 子句。 我们可以使用MATCH命令中的RETURN 聚合函数来处理一组节点并返回一些聚合值。
MATCH (e) RETURN count(e) 关系函数 Neo4j CQL提供了一组关系函数以在获取开始节点结束节点等细节时知道关系的细节。
match (a)-[r] -(b) return id(r),type(r)3.4 neo4j-admin使用
数据库备份 对Neo4j数据进行备份、还原、迁移的操作时要关闭neo4j
cd %NEO4J_HOME%/bin
#关闭
neo4j neo4j stop
#备份
neo4j-admin dump --databasegraph.db --to/neo4j/backup/graph_backup.dump数据库恢复 还原、迁移之前 要关闭neo4j服务。
#数据导入
neo4j-admin load --from/neo4j/backup/graph_backup.dump --databasegraph.db – force
#重启服务
neo4j start3.5 利用CQL构建西游关系图谱
远程文件地址文件放任意位置配置Nginx之后能访问到就行
#导入西游人物数据
load csv from http://124.223.79.77/neo4j/import/西游人物.csv as line create (:西游人物 {name:line[0]})
#导入西游关系数据
load csv from http://124.223.79.77/neo4j/import/西游关系.csv as line
create (:西游关系 {from:line[0],to:line[1],relation:line[3]})
#将两者之间的数据进行关联
match (a:西游人物),(b:西游关系),(c:西游人物)
where a.nameb.from and c.nameb.to
create (a)-[:人物关系{relation:b.relation}]-(c)
return a#清空人物关系数据
match (a:西游人物)-[r]-(b) delete r return type(r)本地文件地址文件放Neo4j的import目录下
#导入西游人物数据
load csv from file:///西游人物.csv as line create (:西游人物 {name:line[0]})
#导入西游关系数据
load csv from file:///西游关系.csv as line
create (:西游关系 {from:line[0],to:line[1],relation:line[3]})
#将两者之间的数据进行关联
match (a:西游人物),(b:西游关系),(c:西游人物)
where a.nameb.from and c.nameb.to
create (a)-[:人物关系{relation:b.relation}]-(c)
return a#清空人物关系数据
match (a:西游人物)-[r]-(b) delete r return type(r)部分进阶语法 https://www.jianshu.com/p/5022b413ec3a https://blog.csdn.net/liucy007/article/details/120967186
#shortestPath函数返回最短的Path
match pshortestPath(
(a:西游人物 {name:秦琼})-[*]-(b:西游人物 {name:孙悟空})
)
return length(p),nodes(p)
#查看节点层级数据
match (a:西游人物{name:唐僧})-[r:人物关系*1..4]-(b) return a,b,r
match (a:西游人物{name:唐僧})-[r:人物关系*1..4]-(b) return a,b,r集成到spring boot 开源示例 https://gitee.com/JasonYangMeng/springdata-neo4j.git
附件 文档中包含的附件获取方式https://www.yuque.com/liaozk/hkmkrq/traam3ag3iy67gl7