知识图谱(1)知识存储与检索

目录

  • Neo4j在win系统安装
  • Neo4j基础语法
    • 知识图谱创建
    • 知识图谱查询
    • 知识图谱属性增减
  • python与neo4j

Neo4j在win系统安装

图数据库(graph database)是一种特殊的数据库,用于存储丰富的关系数据,neo4j是目前最流行的图数据库,支持完整的事务。在属性图中图由顶点,边,和属性组成,顶点和边都可以设置属性,顶点也称作节点,边称作关系,每个节点和关系都可以有一个或多个属性。neo4j创建的图是用顶点和边构成的有向图,查询语言为cypher。
fig0

一般的关系数据库只对单个Join操作进行优化查询,多重Join操作查询的性能会显著下降,图数据库适合查询关系数据,由于图遍历的局部性,不管图中有多少节点和关系,根据遍历规则,Neo4j只访问与遍历相关的节点,不受总数据集大小的影响,遍历的节点越多,遍历速度越慢,但这种速度是线性的变慢。


在关系数据库中,Join操作用于将多个表中的数据合并在一起,以创建一个包含多个表的结果集。


首先安装JDK,需要创建Oracle账号才能下载JDK:https://www.cnblogs.com/huzixia/p/10402200.html

在cmd中测试java是否安装成功:

C:\Users\Administrator>java -version
java version "1.8.0_381"
Java(TM) SE Runtime Environment (build 1.8.0_381-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.381-b09, mixed mode)

然后下载Neo4j Desktop,下载的同时保存Neo4j Desktop Activation Key用于安装激活:https://neo4j.com/deployment-center/

安装成功并激活后打开Neo4j Desktop,新建一个Project,并在其中添加DBMS,比如名称为Graph DBMS,先start再open该数据库。在数据库中创建节点:

create(n:技术论坛{name:'CSDN'})

上面语句的语法为:

CREATE (<node-name>:<label-name>)CREATE (<node-name>:<label-name>{    <Property1-name>:<Property1-Value>........<Propertyn-name>:<Propertyn-Value>}
)

创建后,neo4j会为节点自动添加属性<id>,然后再创建一个节点:

create(n:课程{name:'知识图谱'})

再创建关系,比如 技术论坛 开设 课程:

match(a:技术论坛),(b:课程)create(a)-[r:开设]->(b)

Neo4j基础语法

知识图谱创建

下面通过手动创建一个简单的电影知识图谱来熟悉neo4j,该图谱包括:创建电影节点,创建导演节点,创建演员节点,创建电影和导演的关系,创建电影和演员的关系。

电影信息为:
fig1

首先创建Movie DBMS,进入数据库创建一个电影:

create(n:film{name:'肖申克的救赎',type:'犯罪',score:'9.7'})

也可以同时创建多个电影,注意此时需要不指定node-name,让系统自动添加不同的node-name:

create(:film{name:'霸王别姬',type:'剧情',score:'9.6'}),
(:film{name:'⾟德勒的名单',type:'历史',score:'9.5'}),
(:film{name:'盗梦空间',type:'剧情',score:'9.3'}),
(:film{name:'星际穿越',type:'剧情',score:'9.3'}),
(:film{name:'荆轲刺秦王',type:'历史',score:'8.2'}),
(:film{name:'绿里奇迹',type:'剧情',score:'8.9'})

fig2
然后同时创建多个导演:

create(:director{name:'弗兰克·德拉邦特'}),
(:director{name:'陈凯歌'}),
(:director{name:'史蒂⽂·斯⽪尔伯格'}),
(:director{name:'克⾥斯托弗·诺兰'})

fig3
同时创建多个演员:

create (:actor {name:'蒂姆·罗宾斯'}), 
(:actor {name:'张国荣'}), 
(:actor {name:'连姆·尼森'}), 
(:actor {name:'⻢修·⻨康纳'}), 
(:actor {name:'张丰毅'})

然后创建关系,电影 肖申克的救赎 和导演 弗兰克·德拉邦特 的关系:

MATCH(a:director),(b:film) 
WHERE a.name='弗兰克·德拉邦特' AND b.name='肖申克的救赎' 
CREATE(a)-[r:direct]->(b)

创建电影和演员的关系:

MATCH(a:actor),(b:film) 
WHERE a.name='张国荣' AND b.name='霸王别姬' 
CREATE(a)-[r:play]->(b)

创建电影和演员的关系:

MATCH(a:actor),(b:film) 
WHERE a.name='蒂姆·罗宾斯' AND b.name='肖申克的救赎' 
CREATE(a)-[r:play]->(b)

创建电影和演员的关系:

MATCH(a:actor),(b:film) 
WHERE a.name='张丰毅' AND (b.name='霸王别姬' or b.name='荆轲刺秦王') 
CREATE(a)-[r:play]->(b)

fig4

知识图谱查询

然后是知识图谱的检索,即查询关系与节点:查询某个电影,查询某个类别下的所有节点,查询两个节点之间的关系,通过函数type获取关系的类型。

比如查询某个电影:

MATCH(a:film) 
WHERE a.name='霸王别姬' 
RETURN a

查询某个类别下的所有节点:

MATCH(a:director) 
RETURN a

查询两个节点之间的关系:

MATCH (:director {name:'弗兰克·德拉邦特'})-[r]->(:film{name:'肖申克的救赎'}) 
RETURN r
# 返回如下:
╒═════════╕
│r        │
╞═════════╡
│[:direct]│
└─────────┘

通过函数type获取关系的类型:

MATCH ()-[r]->(:film{name:'肖申克的救赎'}) 
RETURN type(r)
# 返回如下:
╒════════╕
│type(r) │
╞════════╡
│"direct"│
├────────┤
│"play"  │
└────────┘

知识图谱属性增减

增加节点属性:

MATCH(n:film) WHERE n.name='盗梦空间' SET n.language='english' 

删除节点属性:

MATCH(n:film) WHERE n.name='盗梦空间' REMOVE n.language

python与neo4j

需要安装py2neo:

pip install py2neo

这里以红楼梦构造知识图谱,创建RedChamber数据库,在创建时记住数据库密码,然后打开logs看到:Remote interface available at http://localhost:7474/,之后我们就可以用py2neo连接该数据库,username统一为neo4j。

通过py2neo连接数据库:

import py2neo
from py2neo import Graph,Node,Relationship,NodeMatcher
# username默认neo4j,密码为数据库创建时的密码,name为数据库中的graph name
g = Graph('http://localhost:7474',user='neo4j',password='12341234',name='neo4j')

这里使用的信息来自http://www.openkg.cn/home,DreamOfRedChamber.csv内容为(见我的资源):
fig5
读取该信息:

import pandas as pd
df = pd.read_csv('DreamOfRedChamber.csv')

构建知识图谱:

from tqdm import tqdm
for i, row in tqdm(df.iterrows()):print(row['head'],row['tail'],row['relation'],row['label'])start_node = Node("Person",name=row['head'])g.create(start_node)end_node = Node("Person",name=row['tail'])g.create(end_node)relation = Relationship(start_node,row['label'],end_node)g.create(relation)

来到 http://localhost:7474/browser/查询所有人物:

MATCH(a:Person) 
RETURN a

fig6
放大后可以更清晰看到关系:
fig7
我们可以用py2neo运行neo4j的命令:

g.run("match(p:Person {name:'林黛玉'})-[k:丫鬟]-(r)return p,k,r")

fig8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/90120.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT Creator工具介绍及使用

一、QT的基本概念 QT主要用于图形化界面的开发&#xff0c; QT是基于C编写的一套界面相关的类库&#xff0c;如进程线程库&#xff0c;网络编程的库&#xff0c;数据库操作的库&#xff0c;文件操作的库等。 如何使用这个类库&#xff1a;类库实例化对象(构造函数) --> 学习…

前端:横向滚动条,拖动进行左右滚动(含隐藏滚动条)

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

universal robot 机械臂 官方基本教程

https://academy.universal-robots.cn/modules/e-Series-core-track/Chinese/module3/story_html5.html?courseId2166&languageChinese 教程1 控制箱内部 包含&#xff1a; 主机板&#xff0c;SD卡&#xff0c;和安全控制板 安全控制板负责所有控制信息&#xff0c;包括…

Android JNI系列详解之CMake编译工具的使用

一、CMake工具的介绍 如图所示&#xff0c;CMake工具的主要作用是&#xff0c;将C/C编写的native源文件编译打包生成库文件&#xff08;包含动态库或者静态库文件&#xff09;&#xff0c;集成到Android中使用。 二、CMake编译工具的使用 使用主要是配置两个文件&#xff1a;CM…

nodepad++ 插件的安装

nodepad 插件的安装 一、插件安装二、安装插件&#xff1a;Json Viewer nodepad 有 插件管理功能&#xff0c;其中有格式化json以及可以将json作为树查看的插件&#xff1a; Json Viewer 一、插件安装 1、首先下载最新的notepad 64位【https://notepad-plus.en.softonic.com…

echart 图表添加数据分析功能,(右上控制选择)

echart 图表添加数据分析功能,可区域选择数据,右上按钮,控制echart行为 chart.on(globalcursortaken, onGlobalcursortaken); //绑定事件chart.off("brushSelected");//解绑事件处理函数chart.on(brushSelected, renderBrushed);getBarDev2(eIndex, eTimeArr, eSerie…

最新ChatGPT程序源码+AI系统+详细图文部署教程/支持GPT4.0/支持Midjourney绘画/Prompt知识库

一、AI系统 如何搭建部署人工智能源码、AI创作系统、ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01;SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 1.1 程序核心功能 程序已支持ChatGPT3.5/GPT-4提问、AI绘画、Mi…

流媒体弱网优化之路(BBR应用)——GCC与BBR的算法思想分析

流媒体弱网优化之路(WebRTC)——GCC与BBR的算法思想分析 —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&#xff0c;提供每个环节关键参数调节接口并实现一个json全配置&…

Blender 3D建模要点

3d模型可以为场景的仿真模拟带来真实感,它还有助于更轻松地识别场景中的所有内容。 例如,如果场景中的所有对象都是简单的形状,如立方体和圆形,则很难在仿真中区分对象。 1,碰撞形状与视觉形状 像立方体和球体这样的简单形状,通常被称为“基本体”,通常用作碰撞块。 与…

912.排序数组

目录 一、题目 二、代码 一、题目 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:void _MergeSort(vector<int>&data,vector<int>&tmp,int begin,int end){if(begin>end)return;//结束条件int mid (beg…

windows安装Scala

Windows安装Scala 下载地址&#xff1a;https://downloads.lightbend.com/scala/2.11.11/scala-2.11.11.zip 解压完成之后 配置环境变量

接口幂等性设计的最佳实现

一、什么是幂等 二、为什么需要幂等 三、接口超时了&#xff0c;到底如何处理&#xff1f; 四、如何设计幂等 全局的唯一性ID 幂等设计的基本流程 五、实现幂等的8种方案 selectinsert主键/唯一索引冲突 直接insert 主键/唯一索引冲突 状态机幂等 抽取防重表 token令牌 悲观锁…