
python构建知识图谱_NLP第20课:Neo4j从⼊门到构建⼀个简
单知识图谱
Neo4j对于⼤多数⼈来说,可能是⽐较陌⽣的。其实,Neo4j是⼀个图形数据库,就像传统的关系数据库中的Oracel和MySQL⼀样,⽤
来持久化数据。Neo4j是最近⼏年发展起来的新技术,属于NoSQL数据库中的⼀种。
本⽂主要从Neo4j为什么被⽤来做知识图谱,Neo4j的简单安装,在Neo4j浏览器中创建节点和关系,Neo4j的Python接⼝操作以及
⽤Neo4j构建⼀个简单的农业知识图谱五个⽅⾯来讲。
Neo4j为什么被⽤来做知识图谱
从第19课《知识挖掘与知识图谱概述》中,我们已经明⽩,知识图谱是⼀种基于图的数据结构,由节点和边组成。其中节点即实体,由⼀
个全局唯⼀的ID标⽰,关系(也称属性)⽤于连接两个节点。通俗地讲,知识图谱就是把所有不同种类的信息连接在⼀起⽽得到⼀个关系⽹
络,提供了从“关系”的⾓度去分析问题的能⼒。
⽽Neo4j作为⼀种经过特别优化的图形数据库,有以下优势:
数据存储:不像传统数据库整条记录来存储数据,Neo4j以图的结构存储,可以存储图的节点、属性和边。属性、节点都是分开存储的,属
性与节点的关系构成边,这将⼤⼤有助于提⾼数据库的性能。
数据读写:在Neo4j中,存储节点时使⽤了Index-freeAdjacency技术,即每个节点都有指向其邻居节点的指针,可以让我们在时间复
杂度为O(1)的情况下找到邻居节点。另外,按照官⽅的说法,在Neo4j中边是最重要的,是First-classEntities,所以单独存储,更有
利于在图遍历时提⾼速度,也可以很⽅便地以任何⽅向进⾏遍历。
资源丰富:Neo4j作为较早的⼀批图形数据库之⼀,其⽂档和各种技术博客较多。
同类对⽐:Flockdb安装过程中依赖太多,安装复杂;Orientdb,Arangodb与Neo4j做对⽐,从易⽤性来说都差不多,但是从稳定性来
说,neo4j是最好的。
综合上述以及因素,我认为Neo4j是做知识图谱⽐较简单、灵活、易⽤的图形数据库。
Neo4j的简单安装
Neo4j是基于Java的图形数据库,运⾏Neo4j需要启动JVM进程,因此必须安装JavaSE的JDK。从Oracle官⽅⽹站下载JavaSE
JDK,选择版本JDK8以上版本即可。
下⾯简单介绍下Neo4j在Linux和Windows的安装过程。⾸先去官⽹下载对应版本。解压之后,Neo4j应⽤程序有如下主要的⽬录结
构:
bin⽬录:⽤于存储Neo4j的可执⾏程序;
conf⽬录:⽤于控制Neo4j启动的配置⽂件;
data⽬录:⽤于存储核⼼数据库⽂件;
plugins⽬录:⽤于存储Neo4j的插件。
Linux系统下的安装
通过tar解压命令解压到⼀个⽬录下:
然后进⼊Neo4j解压⽬录:
cd/usr/local/neo4j/neo4j-community-3.1.0
通过启动命令,可以实现启动、控制台、停⽌服务:
bin/neo4jstart/console/stop(启动/控制台/停⽌)
通过cypher-shell命令,可以进⼊命令⾏:
bin/cypher-shell
在Neo4j浏览器中创建节点和关系
下⾯,我们简单编写Cypher命令,Cypher命令可以通过Neo4j教程学习,在浏览器中通过Neo4j创建两个节点和两个关系。
在$命令⾏中,编写Cypher脚本代码,点击Play按钮完成创建,依次执⾏下⾯的语句:
CREATE(n:Person{name:'Andres',title:'Developer'})returnn;
作⽤是创建⼀个Person,并包含属性名字和职称。
enterimagedescriptionhere
下⾯这条语句也创建了⼀个Person对象,属性中只是名字和职称不⼀样。
CREATE(n:Person{name:'Vic',title:'Developer'})returnn;
紧接着,通过下⾯两⾏命令进⾏两个Person的关系匹配:
match(n:Person{name:"Vic"}),(m:Person{name:"Andres"})create(n)-[r:Friend]->(m)returnr;
match(n:Person{name:"Vic"}),(m:Person{name:"Andres"})create(n)
最后,在创建完两个节点和关系之后,查看数据库中的图形:
match(n)re人像摄影 turnn;
如下图,返回两个Person节点,以及其关系⽹,两个Person之间组成Friend关系:
enterimagedescriptionhere
Neo4j的Python操作
既然Neo4j作为⼀个图库数据库,那我们在项⽬中使⽤的时候,必然不能通过上⾯那种⽅式完成任务,⼀般都要通过代码来完成数据的持
久化操作。其中,对于Java编程者来说,可通过SpringDataNeo4j达到这⼀⽬的。
⽽对于Python开发者来说,Py2neo库也可以完成对Neo4j的操作,操作过程如下。
⾸先安装Py2neo。Py2neo的安装过程⾮常简单,在命令⾏通过下⾯命令即可安装成功。
pipinstallpy2neo
安装好之后,我们来看⼀下简单的图关系构建,看下⾯代码:
portNode,Relationship
a=Node("Person",name="Alice")
b=Node("Person",name="Bob")
ab=Relationship(a,"KNOWS",b)
第⼀⾏代码,⾸先引⼊Node和Relationship对象,紧接着,创建a和b节点对象,最后⼀⾏匹配a和b之间的⼯作雇佣关系。接着来
看看ab对象的内容是什么:
print(ab)
通过print打印出ab的内容:
(Alice)-[:KNOWS{}]->(Bob)
通过这样,就完成了Alice和Bob之间的⼯作关系,如果有多组关系将构建成Person之间的⼀个关系⽹。
了解更多Py2neo的使⽤⽅法,建议查看官⽅⽂档。
⽤Neo4j构建⼀个简单的农业知识图谱
我们来看⼀个基于开源语料的简单农业知识图谱,由于过程⽐较繁杂,数据和知识图谱数据预处理过程这⾥不再赘述,下⾯,我们重点看基
于Neo4j来创建知识图谱的过程。
整个过程主要包含以下步骤:
环境准备
语料准备
语料加载
知识图谱查询展⽰
Neo4j环境准备。
根据上⾯对Neo4j环境的介绍,这⾥默认你已经搭建好Neo4j的环境,并能正常访问,如果没有环境,请⾃⾏搭建好Neo4j的可⽤环
境。
本次提供的语料是已经处理好的数据,包含6个csv⽂件,⽂件内容和描述如下。
:⽂件⼤⼩2M,内容是通过互动百科页⾯得到的部分实体的属性,包含字段:Entity、AttributeName、Attribute,分别
表⽰实体、属性名称、属性值。⽂件前5⾏结构如下:
Entity,AttributeName,Attribute
密度板,别名,纤维板
葡萄蔓枯病,主要为害部位,枝蔓
坎德拉,性别,男
坎德拉,国籍,法国
坎德拉,场上位置,后卫
hudong_:⽂件⼤⼩94.6M,内容是已经爬好的农业实体的百科页⾯的结构化数据,包含字段:title、url、image、
openTypeList、detail、baInfoKeyList、baInfoValueList,分别表⽰名称、百科URL地址、图⽚、分类类型、详情、关键字、依
据来源。⽂件前2⾏结构如下:
"title","url","image","openTypeList","detail","baInfoKeyList","baInfoValueList"
"菊糖","/wiki/菊
糖","/72/85/27227_","健康科学##分⼦⽣物学##化学品##有机
物##科学##⾃然科学##药品##药学名词##药物中⽂名称列表","[药理作⽤]诊断试剂⼈体内不含菊糖,静注后,不被机体分解、结合、利
⽤和破坏,经肾⼩球滤过,通过测定⾎中和尿中的菊糖含量,可以准慰问信格式 确计算肾⼩球的滤过率。菊糖⼴泛存在于植物组织中,约有3.6万种植物
中含有菊糖,尤其是菊芋、菊苣块根中含有丰富的菊糖[6,8]。菊芋(Jerusalemartichoke)⼜名洋姜,多年⽣草本植物,在我国栽种⼴泛,其适应
性⼴、耐贫瘠、产量⾼、易种植,⼀般亩产菊芋块茎为2000~4000kg,菊芋块茎除⽔分外,还含有15%~20%的菊糖,是加⼯⽣产菊糖及其
制品的良好原料。","中⽂名:","菊糖"
"密度板","/wiki/密度
板","/64/31/23941_","居家##巧克⼒包装##应⽤科学##建筑材
料##珠宝盒##礼品盒##科学##糖果盒##红酒盒##装修##装饰材料##隔断##⾸饰盒","密度板(英⽂:MediumDensityFiberboard
(MDF))也称纤维板,是以⽊质纤维或其他植物纤维为原料,施加脲醛树脂历史三分榜 或其他适⽤的胶粘剂制成的⼈造板材。按其密度的不同,分为⾼
密度板、中密度板、低密度板。密度板由于质软耐冲击,也容易再加⼯,在国外是制作家私的⼀种良好材料,但由于国家关于⾼密度板的标
准⽐国际标准低数倍,所以,密度板在中国的使⽤质量还有待提⾼。","中⽂名:##全称:##别名:##主要材料:##分类:##优点:","密
度板##中密度板纤维板##纤维板##以⽊质纤维或其他植物纤维##⾼密度板、中密度板、低密度板##表⾯光滑平整、材质细密性能稳定"
hudong_:⽂件⼤⼩41M,内容结构和hudong_⽂件保持⼀致,只是增加数据量,作为hudong_数据
的补充。
new_:⽂件⼤⼩2.28M,内容是节点名称和标签,包含字段:title、lable,分别表⽰节点名称、标签,⽂件前5⾏结构如下:
title,lable
药物治疗,newNode
膳⾷纤维,newNode
BovenMerwede,newNode
亚美尼亚苏维埃百科全书,newNode
wikidata_:⽂件⼤⼩1.83M,内容是实体和关系,包含字段HudongItem1、relation、HudongItem2,分别表⽰实体1、
关系、实体2,⽂件前5⾏结构如下:
HudongItem1,relation,HudongItem2
菊糖,instanceof,化合物
菊糖,instanceof,多糖
⽡尔,instanceof,河流
菊糖,subclassof,⾷物
⽡尔,originofthewatercour,莱茵河
wikidata_:⼤⼩7.18M,内容结构和wikidata_⼀致,作为wikidata_数据的补充。
语料加载。
语料加载,利⽤Neo4j的功能进⾏加载,具体操作过程如下。
⾸先,依次执⾏以下命令:
//将hudong_导⼊
LOADCSVWITHHEADERSFROM"file:///hudong_"ASline
CREATE
(p:HudongItem{title:,image:,detail:,url:,openTypeList:peList,baInfoKeyList:fo
执⾏成功之后,控制台显⽰成功:
enterimagedescriptionhere
上⾯这张图,表⽰数据加载成功,并显⽰加载的数据条数和耗费的时间。
//新增了hudong_
LOADCSVWITHHEADERSFROM"file:///hudong_"ASline
CREATE
(p:HudongItem{title:,image:,detail:,url:,openTypeList:peList,baIn摆布的近义词 foKeyList:fo
//创建索引
CREATECONSTRAINTON(c:HudongItem)
SUNIQUE
以上命令的意思是,将hudong_和hudong_导⼊Neo4j作为结点,然后对titile属性添加UNIQUE(唯⼀约束/索
引)。
注意:如果导⼊的时候出现Neo4jJVM内存溢出错误,可以在导⼊前,先把Neo4j下的conf/中的
l_size和_size调⼤点。导⼊完成后再把值改回去即可。
下⾯继续执⾏数据导⼊命令:
//导⼊新的节点
LOADCSVWITHHEADERSFROM"file:///new_"ASline
CREATE(:NewNode{title:})
//添加索引
CREATECONSTRAINTON(c:NewNode)
SUNIQUE
//导⼊hudongItem和新加⼊节点之间的关系
LOADCSVWITHHEADERSFROM"file:///wikidata_"ASline
MATCH(entity1:HudongItem{title:Item}),(entity2:NewNode{title:e})
CREATE(entity1)-[:RELATION{type:on}]->(entity2)
LOADCSVWITHHEADERSFROM"file:///wikidata_"ASline
MATCH(entity1:HudongItem{title:Item1}),(entity2:HudongItem{title:Item2})
CREATE(entity1)-[:RELATION{type:on}]->(entity2)
执⾏完这些命令后,我们导⼊new_新节点,并对titile属性添加UNIQUE(唯⼀约束/索引),导⼊wikidata_和
wikidata_,并给节点之间创建关系。
紧接着,继续导⼊实体属性,并创建实体之间的关系:
LOADCSVWITHHEADERSFROM"file:///"ASline
MATCH(entity1:HudongItem{title:}),(entity2:HudongItem{title:ute})
CREATE(entity1)-[:RELATION{type:uteName}]->(entity2);
LOADCSVWITHHEADERSFROM"file:///"ASline
MATCH(entity1:HudongItem{title:}),(entity2:NewNode{title:ute})
CREATE(entity1)-[:RELATION{type:uteName}]->(entity2);
LOADCSVWITHHEADERSFROM"file:///"ASline
MATCH(entity1:NewNode{title:}),(entity2:NewNode{title:ute})
CREATE(entity1)-[:RELATION{type:uteName}]->(entity2);
LOADCSVWITHHEADERSFROM"file:///"ASline
MATCH(entity1:NewNode{title:}),(entity2:HudongItem{title:ute})
CREATE(entity1)-[:RELATION{type:uteName}]->(entity2)
这⾥新袁羊肉 注意,建索引的时候带了label,因此只有使⽤label时才会使⽤索引,这⾥我们的实体有两个label,所以⼀共做2*2=4次。当然也
可以建⽴全局索引,即对于不同的label使⽤同⼀个索引。
以上过程,我们就完成了语料加载,并创建了实体之间的关系和属性匹配素鸡的做法怎么做好吃 ,下⾯我们来看看Neo4j图谱关系展⽰。
知识图谱查询展⽰
最后通过cypher语句查询来看看农业图谱展⽰。
⾸先,展⽰HudongItem实体,执⾏如下命令:
MATCH(n:HudongItem)RETURNnLIMIT25
对HudongItem实体进⾏查询,返回结果的25条数据,结果如下图:
enterimagedescriptionhere
接着,展⽰NewNode实体,执⾏如下命令:
MATCH(n:NewNode)RETURNnLIMIT25
对NewNode实体进⾏查询,返回结果的25条数据,结果如下图:
enterimagedescriptionhere
之后,展⽰RELATION直接的关系,执⾏如下命令:
MATCHp=()-[r:RELATION]->()RETURNpLIMIT25
展⽰实体属性关系,结果如下图:
enterimagedescriptionhere
总结
本节内容到此结束,回顾下整篇⽂章,主要讲了以下内容:
解释了Neo4j被⽤来做知识图谱的原因;
Neo4j的简单安装以及在Neo4j浏览器中创建节点和关系;
Neo4j的Python接⼝操作及使⽤;
从五个⽅⾯讲解了如何使⽤Neo4j构建⼀个简单的农业知识图谱。
最后,强调⼀句,知识图谱未来会通过⾃然语⾔处理技术和搜索技术结合应⽤会越来越⼴,⼯业界所出的地位也会越来越重要。
参考⽂献及推荐阅读
本文发布于:2023-03-18 13:30:47,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1679117447124296.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:neo4j官网.doc
本文 PDF 下载地址:neo4j官网.pdf
| 留言与评论(共有 0 条评论) |