Neo4j的介绍及使用
- 1. Neo4j简介
- 1.1 特点
- 2. Neo4j的安装
- 2.1 桌面版Neo4j的使用
- 2.2 Neo4j的语法
- 2.2.1 建立节点
- 2.2.2 建立关系
- 2.2.3 构建图谱
- 2.2.4 Neo4j从外部导入文件
- 3. 问题及解决
最近在整理项目执行过程中遇到的一些问题,其中对利用neo4j构建知识图谱投入了较多的精力,希望这篇博客能对大家提供一点帮助,这也算是本人的处女作了(捂脸)
1. Neo4j简介
Neo4j是一个开源图形数据库,它将结构化数据存储在网络上,具有成熟数据库的所有特性,可以被看作是一个高性能的图引擎。
1.1 特点
Neo4j是用java语言开发的NOSQL图形数据库,支持可配置的隔离级别和大规模、可测试的事务恢复,在一台机器上可以处理数十亿节点/关系/属性的图,还可以扩展到多台机器并行运行。在关系数据库中,频繁的数据查询会导致大量的表连接,对性能产生影响,Neo4j围绕图进行数据建模及其特别的存储方式使得很好地解决了传统RDBMS在查询时出现的性能衰退问题。
2. Neo4j的安装
Neo4j分为桌面版(Desktop)和社区服务版(Community),本人两个版本均已下载,但在运行时只使用其中一个就好。具体下载过程参考Windows 10 64位系统下Neo4j安装教程,这篇博客进行了较为详细的介绍,本文重点介绍桌面版的使用。
(桌面版下载链接:Neo4j Desktop.exe)
安装完成后需要激活码才能启动,在下载界面已经提供,如下
eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Ii4rQC4rIiwibWl4cGFuZWxJZCI6IjE3OTk3M2RmNjRlNmFmLTA1N2YyMzdhOGI3N2ZjLTIzNjMxNjMtMTQ0MDAwLTE3OTk3M2RmNjRmM2QzIiwibWl4cGFuZWxQcm9qZWN0SWQiOiI0YmZiMjQxNGFiOTczYzc0MWI2ZjA2N2JmMDZkNTU3NSIsIm9yZyI6Ii4qIiwicHViIjoibmVvNGouY29tIiwicmVnIjoiICIsInN1YiI6Im5lbzRqLWRlc2t0b3AiLCJleHAiOjE2ODAxNjI0OTQsInZlciI6IioiLCJpc3MiOiJuZW80ai5jb20iLCJuYmYiOjE2NDg2MjY0OTQsImlhdCI6MTY0ODYyNjQ5NCwianRpIjoiNXZDak9qaDBCIn0.nNc_NgKMWtBpgqKzKJk3PrYitfZZBIy2vKtdsm_teAWBUJXaJoHr_HmesBrZ0HtgLr5jBFGnF9iPB2QsprIJEVbhFhZzE7QBUWjpnNj1KPkrZ-NkDDh8uqpkchnXkwyWOae2oI08ftMx5W_NxoJI7tinEXw05yZ5EGSBF3vX8qydBNtuSDlxoPcGtNy8OzOIFgXL3ywUOAIKmmzxOTG4xtlVvFYYmQbqq5vFkPslh-PnNfS1y1VICcxovBSnYymfpxp_SUmWKYTNHXaFybcZLQVP4m77u9rkv-9KmAtIk06ZH5mdB_b-YApMyXGeb6u_G2DhBX5a83YZ0SnkKN1BPA
2.1 桌面版Neo4j的使用
双击Neo4j Desktop.exe运行程序,进入后会发现有一个初始的项目空间,可以在此基础上添加数据库、文件、插件等。
或者是新建一个工作项目,再创建/导入数据库进行操作。
Poem Database是博主原先创建的数据库,用以项目测试。创建数据库时用户可以自定义名称,还需要输入密码(请记住你的密码,在后续登录时候需要输入)。
创建完成后点击start即可开启数据库。
启动会数据库处于活跃状态,点击open按钮即可进入。
进入后可以在代码栏中输入语句,点击执行,数据库就会产生相应改动。
2.2 Neo4j的语法
首先是初始化,良好的操作习惯从头开始。
MATCH (n) DETACH DELETE n
执行该语句会删除以往的痕迹,确保图形界面的整洁。
2.2.1 建立节点
在建立实体间的关系前我们需要先创建节点,节点的类型名是可以自己定义的,不同类型的节点在Neo4j上会呈现不同颜色。
CREATE (t1:Title {title:'《静夜思》'})CREATE (t2:Title {title:'《赠汪伦》'})RETURN t1,t2
return语句要放在末尾,否则会提示出错。我们不妨创建更多节点:
CREATE (t1:Title {title: "《静夜思》"})CREATE (t2:Title {title: "《赠汪伦》"})CREATE (t3:Title {title: "《望岳》"})CREATE (a1:Author {name: "李白"})CREATE (a2:Author {name: "杜甫"})CREATE (d1:Dynasty {dynasty: "唐朝"})CREATE (s1:Style {style: "思乡"})CREATE (s2:Style {style: "送别"})CREATE (s3:Style {style: "壮志"})CREATE (f1:Form {form: "诗"})RETURN t1,t2,t3,a1,a2,d1,s1,s2,s3,f1
2.2.2 建立关系
有了节点我们接下来就可以建立它们的联系了,同样的,关系类型可以由我们自己定义,同一关系类型初次声明后,再次调用时可以不再声明。
CREATE (t1)-[r1:poetry_author]->(a1)CREATE (t2)-[:poetry_author]->(a1)CREATE (t3)-[:poetry_author]->(a2)CREATE (a1)-[r2:lie_in]->(d1)CREATE (a2)-[:lie_in]->(d1)
需要注意的是,这里的箭头指向,从左到右表示是从a到b的关系。例如t1–>a1,代表《静夜思》的作者是李白。尝试创建更多关系,丰满我们的图谱。
CREATE (t1)-[r6:belongs_to]->(s1)CREATE (t2)-[:belongs_to]->(s2)CREATE (t3)-[:belongs_to]->(s3)CREATE (t1)-[r7:is_from]->(f1)CREATE (t2)-[:is_from]->(f1)CREATE (t3)-[:is_from]->(f1)
创建节点和关系是我们构建知识图谱的基础步骤,当数据量庞大时我们可以通过相关语句对这些节点和关系进行查询。
MATCH(n:Title)-[r]-() RETURN n,r//查询Title类型的所有节点和相关联系
MATCH(n:Person)-[r]-() DELETE n,r//删除Title类型的所有节点和相关联系
2.2.3 构建图谱
我们整合一下代码,构造一个简单的图谱。
CREATE (t1:Title {title: "《静夜思》"})CREATE (t2:Title {title: "《赠汪伦》"})CREATE (t3:Title {title: "《望岳》"})CREATE (a1:Author {name: "李白"})CREATE (a2:Author {name: "杜甫"})CREATE (d1:Dynasty {dynasty: "唐朝"})CREATE (c1:Content {content: "床前明月光,疑是地上霜。举头望明月,低头思故乡。"})CREATE (c2:Content {content: "李白乘舟将欲行,忽闻岸上踏歌声。桃花潭水深千尺,不及汪伦送我情。"})CREATE (c3:Content {content: "岱宗夫如何?齐鲁青未了。造化钟神秀,阴阳割昏晓。荡胸生曾(层)云,决眦入归鸟。会当凌绝顶,一览众山小。"})CREATE (b1:Background {background: "《静夜思》创作于唐玄宗开元十四年(726),当时李白二十六岁,在扬州(今属江苏)旅舍。"})CREATE (b2:Background {background: "《赠汪伦》是唐代大诗人李白于泾县(今安徽皖南地区)游历桃花潭时写给当地好友汪伦的一首留别诗。"})CREATE (b3:Background {background: "《望岳》是唐代诗人杜甫创作的五言古诗。"})CREATE (A1:Appreciation {appreciate: "此诗描写了秋日夜晚,旅居在外的诗人于屋内抬头望月而思念家乡的感受。"})CREATE (A2:Appreciation {appreciate: "此诗前两句描绘李白乘舟欲行时,汪伦踏歌赶来送行的情景,朴素自然地表达出汪伦对李白那种朴实、真诚的情感;后两句先用“深千尺”赞美桃花潭水的深湛,紧接“不及”两字笔锋一转,用衬托的手法,把无形的情谊化为有形的千尺潭水,生动形象地表达了汪伦对李白那份真挚深厚的友情。"})CREATE (A3:Appreciation {appreciate: "这首诗通过描绘泰山雄伟磅礴的景象,热情赞美了泰山高大巍峨的气势和神奇秀丽的景色,流露出了对祖国山河的热爱之情,表达了诗人不怕困难、敢攀顶峰、俯视一切的雄心和气概,以及卓然独立、兼济天下的豪情壮志。"})CREATE (s1:Style {style: "思乡"})CREATE (s2:Style {style: "送别"})CREATE (s3:Style {style: "壮志"})CREATE (f1:Form {form: "诗"})CREATE (t1)-[r1:poetry_author]->(a1)CREATE (t2)-[:poetry_author]->(a1)CREATE (t3)-[:poetry_author]->(a2)CREATE (a1)-[r2:lie_in]->(d1)CREATE (a2)-[:lie_in]->(d1)CREATE (c1)-[r3:content_poetry]->(t1)CREATE (c2)-[:content_poetry]->(t2)CREATE (c3)-[:content_poetry]->(t3)CREATE (A1)-[r4:apprec_content]->(c1)CREATE (A2)-[:apprec_content]->(c2)CREATE (A3)-[:apprec_content]->(c3)CREATE (b1)-[r5:create_back]->(t1)CREATE (b2)-[:create_back]->(t2)CREATE (b3)-[:create_back]->(t3)CREATE (t1)-[r6:belongs_to]->(s1)CREATE (t2)-[:belongs_to]->(s2)CREATE (t3)-[:belongs_to]->(s3)CREATE (t1)-[r7:is_from]->(f1)CREATE (t2)-[:is_from]->(f1)CREATE (t3)-[:is_from]->(f1)RETURN t1,t2,t3,a1,a2,d1,c1,c2,c3,b1,b2,b3,A1,A2,A3,s1,s2,s3,f1
点击执行效果如下:
可以看到我们创建的节点和关系都很好地对应了。当然这只是一个简单的小图谱,面对海量的数据时我们就需要通过导入文件来构造图谱了。
2.2.4 Neo4j从外部导入文件
Neo4j支持从外部导入csv / json格式的文件,这就为我们构建数据库提供了极大的便利。在导入前我们需要先下载apoc插件,桌面版的便捷之处在于可以直接install,不需要自己去找对应的版本。
下载安装插件后,我们需要去修改配置文件neo4j.conf使之生效,点击Configuration可以直接去到配置文件的目录下。
添加一行:
apoc.import.file.enabled=true
修改完成后记得重启数据库。
将需要导入的csv或json文件拖入import文件夹中,才可使用file:///
字样( neo4j默认的设置是把文件导入的根目录限制在neo4j根目录的import文件夹下,这是一种安全措施,可防止数据库访问标准导入目录之外的文件。)
项目用例:
在数据库中执行导入语句,这里需要根据文件的具体情况定义节点和关系。
CALL apoc.load.json("file:///唐诗三百首.json") YIELD value as data// 创建Title节点MERGE (p:PERSON{name:data.form})SET p.type=data.tags//创建POEM节点MERGE (b:POEM{name:data.poem})SET b.type=data.paragraphs//建立主语->宾语关系MERGE (p)-[:poetry_author{type:data.author}]->(b)
最后执行就可以看到完整的知识图谱啦!
3. 问题及解决
在桌面版启动数据库的时候碰到一个问题:
Database failed to start: Database process terminated, see logs… Check the logs
原因:普通用户没有写入文件的权限
解决办法:以管理员身份重新运行neo4j读取不到导入的文件或显示路径错误
原因:Neo4j桌面版更新版本会自动将工作路径更改到C盘,从而引发路径错误
解决办法:这里参考了其他博主的一些做法,如果有更优的解决方式请不吝赐教。修改配置文件neo4j.conf,使得neo4j可以在任何位置导入文件,在语句dbms.directories.import=import 前添加 #(有损数据库的安全性,不建议这样操作
)
下次打算写一下NLU的内容,希望这篇博客对大家有所帮助!