Neo4j入门实战,以三国英雄关系为例入门Neo4j知识图谱

  • 前言
  • 一、Neo4J简介
    • 对比关系型数据库:
    • 对比其他NoSQL数据库
  • 二、Neo4J下载安装
    • 方法1:安装Neo4j Community Server
    • 安装方法2:直接按照带服务端的客户端
  • 三:Neo4j Cypher 语言
    • Neo4j数据模型
      • 节点
      • 属性
      • 关系
      • 标签
    • Cypher 语言
    • CQL命令实战

前言

今天,我们一起来学习知识图谱中的Neo4J。首先,什么是知识图谱?先摘一段百度百科:

Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注.

Neo是一个网络——面向网络的数据库——也就是说,它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络上而不是表中。网络(从数学角度叫做图)是一个灵活的数据结构,可以应用更加敏捷和快速的开发模式。

简单说来,知识图谱就是通过不同知识的关联性形成一个网状的知识结构,而这个知识结构,恰好就是人工智能AI的基石。当前AI领域热门的计算机图像、语音识别甚至是NLP,其实都是AI的感知能力,真正AI的认知能力,就要靠知识图谱。

知识图谱目前的应用主要在搜索智能问答推荐系统等方面。知识图谱的建设,一般包括数据获取实体识别关系抽取数据存储图谱应用都几个方面。

本文,从Neo4j的数据存储来学习如何使用

一、Neo4J简介

官网: https://neo4j.com/
知识图谱由于其数据包含实体、属性、关系等,常见的关系型数据库诸如MySQL之类不能很好的体现数据的这些特点,因此知识图谱数据的存储一般是采用图数据库(Graph Databases)。而Neo4j是其中最为常见的图数据库。

对比关系型数据库:

关系型数据库(RDBMS) 图数据库
节点
列和数据 属性和数据
约束 关系

对比其他NoSQL数据库

NoSQL数据库大致可以分为四类:

  • 键值(key/value)数据库
  • 列存储数据库
  • 文档型数据库
  • 图数据库
分类 数据模型 优势 劣势 举例
键值数据库 哈希表 查找速度快 数据无结构化,通常只被当作字符串或者二进制数据 Redis
列存储数据库 列式数据存储 查找速度快;支持分布横向扩展;数据压缩率高 功能相对受限 HBase
文档型数据库 键值对扩展 数据结构要求不严格;表结构可变;不需要预先定义表结构 查询性能不高,缺乏统一的查询语法 MongoDB
图数据库 节点和关系组成的图 利用图结构相关算法(最短路径、节点度关系查找等) 可能需要对整个图做计算,不利于图数据分布存储 Neo4j、JanusGraph

二、Neo4J下载安装

方法1:安装Neo4j Community Server

Neo4j和MySQL类似,我们也需要安装一个服务端程序,再安装一个客户端程序,客户端程序不安装直接使用命令行操作也可以。接下来先安装服务端程序。
首先在 https://neo4j.com/download-center// 下载Neo4J。Neo4J分为社区版和企业版,企业版在横向扩展、权限控制、运行性能、HA等方面都比社区版好,适合正式的生产环境,普通的学习和开发采用免费社区版就好。
注意: neo4j最新版对应的java版本是jdk11

jdk8可以下载Neo4j Community Edition 3.5.28

官方文档:https://neo4j.com/docs/operations-manual/3.5/
解压到新目录(注意:目录名称不要有中文),比如: D:\neo4j\

# 将Neo4j作为控制台应用程序运行
<NEO4J_HOME>\bin\neo4j console
# 将Neo4j作为服务使用进行安装
<NEO4J_HOME>\bin\neo4j install-service

进入到bin目录,执行
neo4j console: 直接启动 neo4j 服务,
此外,还有其他几个命令:

install-service | uninstall-ser update-service : 安装/卸载/更新 neo4j 服务
start/stop/restart/status: 启动/停止/重启/状态
-V 输出更多信息

启动成功之后就可以在浏览器进行访问了,默认端口号是7474,ip改为服务器地址。
http://localhost:7474
访问成功应该是下图这个页面,能访问到说明正常启动,输入默认用户名neo4j和密码neo4j进行连接。

连接成功后如下图所示:

这个界面很友好,英文好的同学可以根据官方向导开始学习了。而像我这种英文渣渣就只能一步步慢慢摸索了。

安装方法2:直接按照带服务端的客户端

对于初学者来说大多数还都是在Windows系统上进行入门学习,所以我们可以直接下载Windows的客户端运行使用。

这里可以直接下载最新版客户端版本

安装客户端后可以自行选择任何neo4j server版本进行安装,都是界面化操作,安装好server之后可以直接一键启动,启动成功后也可以使用浏览器http://localhost:7474进行连接,也可以使用客户端连接,很方便。

基础工作完成之后,我们开始命令CQL语句的学习。

三:Neo4j Cypher 语言

到这里还是先学习一下Neo4j的数据模型再写CQL吧。

Neo4j数据模型

Neo4j是一个表示关系连接的图数据库,既然是图,那么必然有节点,和连接两个节点之间的关系组成。每个节点相当于一个实体,每个实体都有构成它的属性。
比如刘备和关羽,刘备和关羽都是一个个的实体,都可以称作为一个节点,他们有一个共同的标签:都是人,。他们之间的关系为:兄弟,刘备的属性是仁义、大耳贼、汉皇后裔等等。关羽的属性有:勇猛、忠义等等。

在Neo4j中,数据模型的主要构建块是:

  • 节点
  • 关系
  • 属性
  • 标签

节点

节点(Node)是图数据库中的一个基本元素,用来表示一个实体记录,就像关系数据库中的一条记录一 样。在Neo4j中节点可以包含多个属性(Property)和多个标签(Label)。

  • 节点是主要的数据元素,节点通过关系连接到其他节点
  • 节点可以具有一个或多个属性(即,存储为键/值对的属性)
  • 节点有一个或多个标签,用于描述其在图表中的作用

属性

属性(Property)是用于描述图节点和关系的键值对。其中Key是一个字符串,值可以通过使用任何 Neo4j数据类型来表示

  • 属性是命名值,其中名称(或键)是字符串
  • 属性可以被索引和约束 可以从多个属性创建复合索引

关系

关系(Relationship)同样是图数据库的基本元素。
当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也称为图论的(Edge) ,其始端和末端都必须是节点,关系不 能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type)

  • 关系连接两个节点
  • 关系是方向性的
  • 节点可以有多个甚至递归的关系
  • 关系可以有一个或多个属性(即存储为键/值对的属性)

基于方向性,Neo4j关系被分为两种主要类型:

  • 单向关系
  • 双向关系

标签

标签(Label)将一个公共名称与一组节点或关系相关联, 节点或关系可以包含一个或多个标签。 我们可以为现有节点或关系创建新标签, 我们可以从现有节点或关系中删除标签。

  • 标签用于将节点分组
  • 一个节点可以具有多个标签
  • 对标签进行索引以加速在图中查找节点
  • 本机标签索引针对速度进行了优化

Cypher 语言

Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言。像Oracle数据库具有查询 语言SQL,Neo4j具有CQL作为查询语言。

  • 它是Neo4j图形数据库的查询语言。
  • 它是一种声明性模式匹配语言
  • 它遵循SQL语法。
  • 它的语法是非常简单且人性化可读的格式。
CQL命令 用法
CREATE 创建节点,关系和属性
MATCH 检索有关节点,关系和属性数据
RETURN 返回查询结果
WHERE 提供条件过滤检索数据
DELETE 删除节点和关系
REMOVE 删除节点和关系的属性
ORDER BY 排序检索数据
SET 添加或更新标签

官方文档命令说明:https://neo4j.com/docs/cypher-manual/3.5/clauses/

CQL命令实战

直接看Cypher的语法会非常枯燥,本文通过一个实际的案例来一步一步学习如何使用Cypher来操作Neo4J。

  • 1、创建节点
#创建简单节点
create (n)
#创建多个节点
create (n),(m)
#创建带标签和属性的人物节点并返回节点
create (n:Person {name:'刘备'}) return n

CREATE是创建操作,n是节点,Person是标签,代表节点的类型。花括号{}代表节点的属性,属性类似Python的字典。这条语句的含义就是创建一个标签为Person的节点,该节点具有一个name属性,属性值是刘备。return n 就是返回当前节点的值

如图所示,在Neo4J的界面上可以看到创建成功的节点。

我们继续来创建三国更多的人物节点,并分别命名:

create (country:shu { name:'刘备'});
create (country:shu { name:'关羽'});
create (country:shu { name:'张飞'});
create (country:shu { name:'诸葛亮'});
create (country:shu { name:'张苞'});
create (country:shu { name:'关平'});
create (country:shu { name:'关兴'});
create (country:shu { name:'韩遂'});
create (country:shu { name:'黄承彦'});
create (country:shu { name:'黄月英'});
create (country:shu { name:'黄忠'});
create (country:shu { name:'姜维'});
create (country:shu { name:'刘禅'});
create (country:shu { name:'刘启'});
create (country:shu { name:'刘胜'});
create (country:shu { name:'刘协'});
create (country:shu { name:'马超'});
create (country:shu { name:'马良'});
create (country:shu { name:'马谡'});
create (country:shu { name:'马腾'});
create (country:shu { name:'孟获'});
create (country:shu { name:'糜芳'});
create (country:shu { name:'糜夫人'});
create (country:shu { name:'庞统'});
create (country:shu { name:'孙尚香'});
create (country:shu { name:'魏延'});
create (country:shu { name:'赵云'});
create (country:shu { name:'诸葛瑾'});create (country:wei { name:'曹操'});
create (country:wei { name:'曹植'});
create (country:wei { name:'曹丕'});create (country:wu { name:'孙策'});
create (country:wu { name:'孙权'});
create (country:wu { name:'周瑜'});

查看刚创建的这些节点信息

match(n) return n

这里,MATCH是匹配操作,而小括号()代表一个节点 node(可理解为括号类似一个圆形),括号里面的n为 标识符
这里为便于直观感受先使用基本的查询语句,后面再详细讲解。

Neo4J贴心地使用不用的颜色来表示不同类型的节点。

  • 接下来创建关系
MATCH (a:shu {name:'刘备'}), (b:shu {name:'关羽'})
MERGE (a)-[:大哥]->(b)

这里的方括号[]即为关系,大哥为关系的类型。注意这里的箭头–>是有方向的,表示是从a到b的关系。 如图,刘备和关羽之间建立了大哥关系,

再使用这个命令查看我们刚才创建的关系,通过Neo4J的可视化很明显的可以看出:

match(n) return n

  • 关系也可以增加属性
MATCH (a:shu {name:'刘备'}), (b:shu {name:'张飞'})
MERGE (a)-[:大哥  {since:"桃园结义"}]->(b)

在关系中,同样的使用花括号{}来增加关系的属性,也是类似Python的字典,这里给大哥关系增加了since属性,属性值为“桃园结义”,表示他们建立兄弟关系的时间。

-接下来增加更多的关系

match (p1:shu {name:'刘备'}),(p2:shu{name:'关羽'}) create (p1)- [r:rel {relation:'结义兄弟'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'张飞'}) create (p1)- [r:rel {relation:'结义兄弟'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'马超'}) create (p1)- [r:rel {relation:'主公'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'庞统'}) create (p1)- [r:rel {relation:'主公'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'黄忠'}) create (p1)- [r:rel {relation:'主公'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'赵云'}) create (p1)- [r:rel {relation:'主公'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'魏延'}) create (p1)- [r:rel {relation:'主公'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'法正'}) create (p1)- [r:rel {relation:'主公'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'糜芳'}) create (p1)- [r:rel {relation:'主公'}]->(p2);
match (p1:shu {name:'甘夫人'}),(p2:shu{name:'刘备'}) create (p1)- [r:rel {relation:'妻'}]->(p2);
match (p1:shu {name:'糜夫人'}),(p2:shu{name:'刘备'}) create (p1)- [r:rel {relation:'次妻'}]->(p2);
match (p1:shu {name:'孙尚香'}),(p2:shu{name:'刘备'}) create (p1)- [r:rel {relation:'妻'}]->(p2);
match (p1:shu {name:'关羽'}),(p2:shu{name:'关兴'}) create (p1)- [r:rel {relation:'父子'}]->(p2);
match (p1:shu {name:'关平'}),(p2:shu{name:'关羽'}) create (p1)- [r:rel {relation:'义子'}]->(p2);
match (p1:shu {name:'张飞'}),(p2:shu{name:'张苞'}) create (p1)- [r:rel {relation:'父子'}]->(p2);
match (p1:shu {name:'马腾'}),(p2:shu{name:'马超'}) create (p1)- [r:rel {relation:'父子'}]->(p2);
match (p1:shu {name:'马腾'}),(p2:shu{name:'韩遂'}) create (p1)- [r:rel {relation:'异性兄弟'}]->(p2);
match (p1:shu {name:'马谡'}),(p2:shu{name:'马良'}) create (p1)- [r:rel {relation:'弟弟'}]->(p2);
match (p1:shu {name:'糜芳'}),(p2:shu{name:'糜夫人'}) create (p1)- [r:rel {relation:'兄妹'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'诸葛亮'}) create (p1)- [r:rel {relation:'主公'}]->(p2);
match (p1:shu {name:'黄月英'}),(p2:shu{name:'诸葛亮'}) create (p1)- [r:rel {relation:'妻'}]->(p2);
match (p1:shu {name:'黄承彦'}),(p2:shu{name:'黄月英'}) create (p1)- [r:rel {relation:'父女'}]->(p2);
match (p1:shu {name:'姜维'}),(p2:shu{name:'诸葛亮'}) create (p1)- [r:rel {relation:'弟子'}]->(p2);
match (p1:shu {name:'诸葛亮'}),(p2:shu{name:'诸葛瑾'}) create (p1)- [r:rel {relation:'兄弟'}]->(p2);
match (p1:shu {name:'诸葛亮'}),(p2:shu{name:'诸葛瞻'}) create (p1)- [r:rel {relation:'父子'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'刘禅'}) create (p1)- [r:rel {relation:'父子'}]->(p2);
match (p1:shu {name:'甘夫人'}),(p2:shu{name:'刘禅'}) create (p1)- [r:rel {relation:'母子'}]->(p2);
match (p1:shu {name:'刘禅'}),(p2:shu{name:'姜维'}) create (p1)- [r:rel {relation:'主公'}]->(p2);
match (p1:shu {name:'诸葛瞻'}),(p2:shu{name:'刘禅'}) create (p1)- [r:rel {relation:'女婿'}]->(p2);
match (p1:shu {name:'刘备'}),(p2:shu{name:'刘胜'}) create (p1)- [r:rel {relation:'后代'}]->(p2);
match (p1:shu {name:'刘胜'}),(p2:shu{name:'刘启'}) create (p1)- [r:rel {relation:'父子'}]->(p2);
match (p1:shu {name:'刘启'}),(p2:shu{name:'刘辩'}) create (p1)- [r:rel {relation:'宗亲'}]->(p2);
match (p1:shu {name:'刘辩'}),(p2:shu{name:'刘协'}) create (p1)- [r:rel {relation:'让位'}]->(p2);MATCH (p1:wei {name:'曹植'}), (p2:wei {name:'曹操'}) MERGE (p1)-[:儿子]->(p2);
MATCH (p1:wei {name:'曹丕'}), (p2:wei {name:'曹操'}) MERGE (p1)-[:儿子]->(p2);
MATCH (p1:wei {name:'曹操'}), (p2:wei {name:'曹丕'}) MERGE (p1)-[:父亲]->(p2);
MATCH (p1:wei {name:'曹操'}), (p2:wei {name:'曹植'}) MERGE (p1)-[:父亲]->(p2);MATCH (p1:wu {name:'孙策'}), (p2:wu {name:'孙权'}) MERGE (p1)-[:弟弟  {type:"亲情"}]->(p2);
MATCH (p1:wu {name:'孙权'}), (p2:wu {name:'孙策'}) MERGE (p1)-[:哥哥  {type:"亲情"}]->(p2)
MATCH (p1:wu {name:'周瑜'}), (p2:wu {name:'孙策'}) MERGE (p1)-[:主公  {type:"主从"}]->(p2);

将上面生成的节点和关系语句在neo4j中执行,就可以了。然后查询,就可以看到效果图了,
有点图谱的意思了吧?

篇幅太长了,剩下的详细查询方法,更新,删除,等另起一篇文章写。
拜拜~

Neo4j入门实战,以三国英雄关系为例入门Neo4j知识图谱相关推荐

  1. Pyhton操作Neo4j图数据库实践(南北朝隋唐历史北朝主要人物知识图谱)

    独孤信"第一岳父"之称很形象,他有三个女儿做了三个朝代皇后,以及杨坚.杨广.李渊等人关系.本文试着使用图数据库(neo4j)表达这段南北朝隋唐历史北朝主要人物知识图谱. 1. Ne ...

  2. 英雄联盟云顶之弈知识图谱构建

    文章目录 **英雄联盟云顶之弈知识图谱创建** 1.白板建模 1.1云顶之奕是什么? 1.2白板建模 2.数据收集处理 3.图谱创建 4.查询分析 4.5装备图谱 5.总结反思 英雄联盟云顶之弈知识图 ...

  3. Neo4j 实战篇(一)基于Py2Neo构建电影知识图谱

    运行环境 windows11 JDK 8 anaconda3 python 3.9 Neo4j 3.5.32 python jupyter库 py2neo Visual Studio Code 202 ...

  4. 远程监督关系抽取漫谈:结合知识图谱和图神经网络

    远程监督关系抽取是一种用知识图谱去对齐朴素文本的标注方法,属于半监督学习算法,自然而然提取特征的时候就会出现很多噪声.比如两个实体之间还有别的关系或者是没有关系,这样的训练数据会对关系抽取器产生影响. ...

  5. 图谱实战 | 华农夏静波:深层语义知识图谱在药物重定位中的应用

    转载公众号 | DataFunSummit 分享嘉宾:夏静波 华中农业大学 副教授 编辑整理:王金华 电科32所 出品平台:DataFunTalk 导读:自新冠病毒肺炎疫情发生以来,由于传统药物研发周 ...

  6. 知识图谱应用实战案例100篇(一)-阿里巴巴超大规模知识图谱预训练实践:商品分类

    基于电子商务平台上亿级的庞大商品库,电子商务交易得以不断增长. 为了更好地支持日常业务,需要将这些海量的商品以一种更优的方式进行描述.存储和计算,并且需要支持融合不同来源的数据,建立实体之间的语义连接 ...

  7. [知识图谱实战篇] 七.HTML+D3实现关系图谱搜索功能

    前面作者讲解了很多知识图谱原理知识,包括知识图谱相关技术.Neo4j绘制关系图谱等,但仍缺少一个系统全面的实例.为了加深自己对知识图谱构建的认识,为后续创建贵州旅游知识图谱打下基础,作者深入学习了张宏 ...

  8. MATLAB App Designer入门实战(一)

    最近也是在研究MATLAB App Designer,开这样的一个系列主要是为了记录我在研究App Designer时遇到的一部分问题的解决,和一部分有趣的想法,每一篇文章会展示如何将一个项目mlap ...

  9. MATLAB App Designer入门实战(三)

    这期文章中的问题虽然比较少,但是综合性较强. 系列文章目录: MATLAB 手把手带你制作第一个APP designer程序(电子词典) MATLAB App Designer入门实战(一) MATL ...

最新文章

  1. TCP/IP详解--TCP/IP中三次握手 四次握手状态分析
  2. SQL_MODE设置
  3. 我张哥做的这ARM开发板,真酸爽!
  4. Spring Boot application.properties 常用配置
  5. LeetCode 198 打家劫舍
  6. 万人攻防大战:淘宝优惠活动,沦为黑产盛宴
  7. Android性能优化典范第一季
  8. xtrabackup备份mysql_xtrabackup备份mysql
  9. Java中swing使用ImageIcon类添加图片
  10. AIDA64 Business Edition(系统检测)多国语言绿色特别
  11. 基于K均值聚类算法的图像分割(Matlab)
  12. android 拍照水印日期,胶片日期水印app安卓版-胶片日期水印手机版预约v1.0-发卡屋...
  13. dat图片 电脑端微信_微信电脑图片dat转为jpg
  14. arduino智能跟随小车
  15. 华为高清会议摄像机预置位的使用方法
  16. agc004E Salvage Robots
  17. 在博客和Markdown和Python中自由添加emoji!包括博客标题和Python打印!
  18. Android实现新闻列表
  19. vue 308 Permanent Redirect (from disk cache)问题
  20. kafka topic 操作

热门文章

  1. 别小看“Spring过滤器”,这些知识点你必须得掌握
  2. CG100-18款全新英朗,里程数据恢复成功!
  3. terminus rz上传_Terminus和FluentTerminal是Windows的第三方OSS控制台替代品世界的开始
  4. 【新】刀具管理系统 上线~~
  5. 好心情医生建议:精神病人要做好这4点
  6. 想问问有没有大佬做过四旋翼飞行器的巡航功能的 ! 急!!!!!!!
  7. 考研数学05-12年真题总结
  8. FontForge不识别,WINDOWS报错:mstmc.ttf真的是字体文件吗?
  9. #364 – 日历控件日期多选(Allowing a User to Select Multiple Dates in a Calendar Control)
  10. 宝能汽车版图再扩张:斥资30亿建电池厂