Neo4j的介绍及使用
最近在整理项目执行过程中遇到的一些问题,其中对利用neo4j构建知识图谱投入了较多的精力,希望这篇博客能对大家提供一点帮助,这也算是本人的处女作了(捂脸)
Neo4j是一个开源图形数据库,它将结构化数据存储在网络上,具有成熟数据库的所有特性,可以被看作是一个高性能的图引擎。
Neo4j是用java语言开发的NOSQL图形数据库,支持可配置的隔离级别和大规模、可测试的事务恢复,在一台机器上可以处理数十亿节点/关系/属性的图,还可以扩展到多台机器并行运行。在关系数据库中,频繁的数据查询会导致大量的表连接,对性能产生影响,Neo4j围绕图进行数据建模及其特别的存储方式使得很好地解决了传统RDBMS在查询时出现的性能衰退问题。
Neo4j分为桌面版(Desktop)和社区服务版(Community),本人两个版本均已下载,但在运行时只使用其中一个就好。具体下载过程参考Windows 10 64位系统下Neo4j安装教程,这篇博客进行了较为详细的介绍,本文重点介绍桌面版的使用。
(桌面版下载链接:Neo4j Desktop.exe)
安装完成后需要激活码才能启动,在下载界面已经提供,如下
eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Ii4rQC4rIiwibWl4cGFuZWxJZCI6IjE3OTk3M2RmNjRlNmFmLTA1N2YyMzdhOGI3N2ZjLTIzNjMxNjMtMTQ0MDAwLTE3OTk3M2RmNjRmM2QzIiwibWl4cGFuZWxQcm9qZWN0SWQiOiI0YmZiMjQxNGFiOTczYzc0MWI2ZjA2N2JmMDZkNTU3NSIsIm9yZyI6Ii4qIiwicHViIjoibmVvNGouY29tIiwicmVnIjoiICIsInN1YiI6Im5lbzRqLWRlc2t0b3AiLCJleHAiOjE2ODAxNjI0OTQsInZlciI6IioiLCJpc3MiOiJuZW80ai5jb20iLCJuYmYiOjE2NDg2MjY0OTQsImlhdCI6MTY0ODYyNjQ5NCwianRpIjoiNXZDak9qaDBCIn0.nNc_NgKMWtBpgqKzKJk3PrYitfZZBIy2vKtdsm_teAWBUJXaJoHr_HmesBrZ0HtgLr5jBFGnF9iPB2QsprIJEVbhFhZzE7QBUWjpnNj1KPkrZ-NkDDh8uqpkchnXkwyWOae2oI08ftMx5W_NxoJI7tinEXw05yZ5EGSBF3vX8qydBNtuSDlxoPcGtNy8OzOIFgXL3ywUOAIKmmzxOTG4xtlVvFYYmQbqq5vFkPslh-PnNfS1y1VICcxovBSnYymfpxp_SUmWKYTNHXaFybcZLQVP4m77u9rkv-9KmAtIk06ZH5mdB_b-YApMyXGeb6u_G2DhBX5a83YZ0SnkKN1BPA
双击Neo4j Desktop.exe运行程序,进入后会发现有一个初始的项目空间,可以在此基础上添加数据库、文件、插件等。

或者是新建一个工作项目,再创建/导入数据库进行操作。


Poem Database是博主原先创建的数据库,用以项目测试。创建数据库时用户可以自定义名称,还需要输入密码(请记住你的密码,在后续登录时候需要输入)。

创建完成后点击start即可开启数据库。

启动会数据库处于活跃状态,点击open按钮即可进入。

进入后可以在代码栏中输入语句,点击执行,数据库就会产生相应改动。

首先是初始化,良好的操作习惯从头开始。
MATCH (n) DETACH DELETE n
执行该语句会删除以往的痕迹,确保图形界面的整洁。
在建立实体间的关系前我们需要先创建节点,节点的类型名是可以自己定义的,不同类型的节点在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
有了节点我们接下来就可以建立它们的联系了,同样的,关系类型可以由我们自己定义,同一关系类型初次声明后,再次调用时可以不再声明。
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类型的所有节点和相关联系
我们整合一下代码,构造一个简单的图谱。
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
点击执行效果如下:


可以看到我们创建的节点和关系都很好地对应了。当然这只是一个简单的小图谱,面对海量的数据时我们就需要通过导入文件来构造图谱了。
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)
最后执行就可以看到完整的知识图谱啦!
在桌面版启动数据库的时候碰到一个问题:
Database failed to start: Database process terminated, see logs… Check the logs
原因:普通用户没有写入文件的权限
解决办法:以管理员身份重新运行neo4j
读取不到导入的文件或显示路径错误
原因:Neo4j桌面版更新版本会自动将工作路径更改到C盘,从而引发路径错误
解决办法:这里参考了其他博主的一些做法,如果有更优的解决方式请不吝赐教。修改配置文件neo4j.conf,使得neo4j可以在任何位置导入文件,在语句dbms.directories.import=import 前添加 #(有损数据库的安全性,不建议这样操作)

下次打算写一下NLU的内容,希望这篇博客对大家有所帮助!
在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo
我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto
Ruby语言是否可以用于创建全新的移动操作系统或桌面操作系统,即是否可以用于系统编程? 最佳答案 嗯,现在有一些操作系统使用比C更高级的语言。基本上,ruby解释器本身需要用一些低级的东西来编写,并且需要一些引导加载代码将功能齐全的ruby解释器作为独立内核加载到内存中。一旦ruby解释器被引导并以内核模式(或innerrings之一)运行,就没有什么可以阻止您在其上构建整个操作系统。不幸的是,它可能会很慢。每个操作系统功能的垃圾收集可能会相当引人注目。ruby解释器将负责任务调度和网络堆栈等基本事情,使用垃圾收集框架会大大
这个问题在这里已经有了答案:Unabletoinstallgem-Failedtobuildgemnativeextension-cannotloadsuchfile--mkmf(LoadError)(17个答案)关闭9年前。嘿,我正在尝试在一台新的ubuntu机器上安装rails。我安装了ruby和rvm,但出现“无法构建gemnative扩展”错误。这是什么意思?$sudogeminstallrails-v3.2.9(没有sudo表示我没有权限)然后它会输出很多“获取”命令,最终会出现这个错误:Buildingnativeextensions.Thiscouldtakeawhi
我尝试了一些关于rubyonrails中openid利用率的搜索。然而,尽管出现了一组选项,例如omniauth、authlogic等,但这些gem通常用于构建接受openid身份验证的站点。换句话说,它们用于openid消费者设置。我也想构建自己的openid服务器。AssuggestedhereinOpenIdsite我发现了像Masquerade和local-openid这样的东西,不幸的是,它们不是非常活跃的项目,下载量很少。自建openidprovider服务器有没有其他设施可以推荐?非常感谢!!干杯,叶 最佳答案 虽
我正在尝试构建一个纯粹使用Ruby的聊天应用程序。有一个similarquestion较早发布,但我有不同的相关查询。我看过thisexample(与之前发布类似问题的人所提到的相同)。示例中的代码似乎对我不起作用。在终端上运行ruby脚本,并连接到url:http://localhost:1234在我的浏览器中,我无限期地遇到“正在从本地主机传输数据...”消息。此处的1234是所提供示例中使用的端口号。我无法弄清楚我运行失败的原因是什么。可能是我需要在执行脚本时在命令行中指定一些东西,或者我应该通过其他地方(可能是浏览器)开始聊天(输入输出)。我无法弄清楚到底该做什么。你能帮我
我想使用googlecharts创建一个如下所示的图表:GoogleChart.pie_400x200('TacoBell'=>0,'Mediterranean'=>2,'Shivas'=>5)给定一个对象Results(name,count)。如何为GoogleCharts的结构创建一个对象,如上所示?谢谢 最佳答案 从您在评论中列为@results的结果对象开始,以下应该有效:GoogleChart.pie_400x200(@results.map{|r|{r[:title]=>r[:percentage]}})