Neo4j官方入门实例介绍
2.4 官方入门实例介绍
本节的内容不必深入掌握,主要是给大家一个简单的认识,具体的 Cypher 语言在下一章会详细讲解。
为了方便用户入门, Neo4j Web 管理界面提供了一个官方入门实例 “电影关系图”,帮助初学者在自己电脑上一步步创建一个入门级别的图数据结构。本节将围绕这个“电影关系图”实例一步步讲解、分析其创建和查询等操作。
首先,打开 Neo4j Web 管理界面后,在引导实例区单击 Open Guides 链接就进入“电影关系图”实例引导界面了,如下图所示。
“电影关系图”实例将电影、电影导演、演员之间的复杂网状关系作为蓝本,使用 Neo4j 创建三者关系的图结构,虽然实例数据规模小但结构是相对完整的。
这个实例将指引读者学习以下入门操作:
- 创建图数据:将电影、演员、导演等图数据导入到Neo4j数据库中。
- 检索节点:检索特定电影和演员。
- 查询关系:发现相关的演员和导演。
- 查询关系路径:查询他们之间的关系路径。
2.4.1 创建图数据库
单击“电影关系图”实例引导页下方的右侧换页箭头可以看到一些实例代码,其中包含多个带有 CREATE 关键字的 Cypher 语句。单击代码块,代码块将自动填入到命令行输入区。单击运行命令按钮,图数据就创建完成了(每句的解析在下面)。
下面,对这些创建语句进行分析说明,先不必完全弄懂这些命令,只需要了解它们的目的即可,关于这些 Cypher 语句的具体学习,在后续章节会有详细介绍。
【程序2-1】创建电影节点
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
上面的 Cypher 语句使用 CREATE 指令创建了一个 Movie 节点,这个节点上带有三个属性{title:‘The Matrix’, released:1999, tagline:‘Welcome to the Real World’},分别表示这个电影的标题: The Matrix、发布时间: 1999、 宣传词: Welcome to the Real World。
上述 Cypher 语句运行后将会在数据库中创建一个 Movie 节点,在数据库中的存储形态如下图所示。
【程序2-2】创建人物节点
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
上面代码使用 CREATE 指令创建了一个 Person 节点,节点带有两个属性{name:‘Keanu Reeves’, born:1964}。
在后续的 6 行代码中都使用了同样的CREATE指令分别创建了人物: Carrie 、 Laurence 、 Hugo 、 LillyW 、 LanaW 和 JoelS 。
【程序2-3】创建演员、导演关系
CREATE(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),(Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix),(Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix),(Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix),(LillyW)-[:DIRECTED]->(TheMatrix),(LanaW)-[:DIRECTED]->(TheMatrix),(JoelS)-[:PRODUCED]->(TheMatrix)
上面代码中除了使用 CREATE 指令外,还使用了箭头运算符,如:(Keanu)-[:ACTED_IN {roles:[‘Neo’]}]->(TheMatrix),这一行的意思是创建一个演员参演电影的关系,演员 Keanu 以角色 roles:[‘Neo’] 参演 ACTED_ IN 到电影 TheMatrix 中。代码前 2~4 行都是创建演员参演电影关系的指令。
第 6 行指令:(LillyW)-[:DIRECTED]->(TheMatrix),意思是创建导演与电影的关系,即 LillyW 导演了 [:DIRECTED] 电影 TheMatrix 。
上面的指令运行完后,数据库中会有以下存储形态,如下图所示。
这样数据库中一个电影、演员、导演、制片商的关系就创建出来了。在后面的代码中用了同样的指令分别创建了电影: The Matrix Revolutions 、 The Devil’s Advocate 、 A Few Good Men 、 Top Gun 、 Jerry Maguire 等,然后又创建了与这些电影相关的演员、导演、制片商与他们之间的关系。
通过上述的创建指令就把“电影关系图”实例创建完成了。
2.4.2 检索节点
图数据结构创建完毕后,下面介绍检索节点的相关操作。
2.4.2.1 查找人员
【程序2-4】查找名为"Tom Hanks"的人物
MATCH (tom {name:"Tom Hanks"}) RETURN tom
上面语句使用 MATCH 指令查找匹配条件: {name:“Tom Hanks”}的节点,执行的结果如下图所示。
可以在结果显示区看到查询到的节点,注意在结果展示区单击节点图标,会查看到节点的属性。
2.4.2.2 查找电影节点
【程序2-5】查找名为"Cloud Atlas"的电影
MATCH (cloudAtlas {title:"Cloud Atlas"}) RETURN cloudAtlas
上面语句使用 MATCH 指令查找匹配条件:{title:“Cloud Atlas”}的节点,执行的结果如下图所示。
2.4.2.3 随机查找多个人物的人名
【程序2-6】随机查找 10 个人物的人名
MATCH (people:Person) RETURN people.name LIMIT 10
上面指令查找 10 个 Person 节点,然后返回每个节点的 name 属性,返回结果如下图所示。
在本次结果中,由于只返回 name 属性,所以就不用图形化的形式返回了。
2.4.2.4 查找多个电影
【程序2-7】查找 1990 年到 2000 年发行的电影的名称
MATCH (nineties:Movie) WHERE nineties.released > 1990 AND nineties.released < 2000 RETURN nineties.title
上面指令略微复杂,首先匹配 Movie 节点,然后使用 WHERE 子句查询电影的 released 属性值大于 1990 并且小于 2000 条件的节点,然后只返回匹配节点的 title 属性。返回结果为如下图所示。
2.4.3 查询关系
下面拓展 MATCH 指令的使用。
2.4.3.1 查找演员参演的电影
【程序2-8】查找“Tom Hanks”参演过的电影的名称
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies
上述指令首先匹配节点类型为 Person 、属性为{name:“Tom Hanks”}的节点,然后匹配此节点具有关系:ACTED_IN], 并且此关系指向某个电影节点的节点。返回结果如下图所示。
通过结果可以看到演员 Tom Hanks 参演过的所有电影。
【程序2-9】查找谁导演了电影“Cloud Atlas”
MATCH (cloudAttlas {title: "Cloud Atlas"})<-[:DIRECTED]-(directors) RETURN directors.name
上面指令首先匹配属性为{title: “Cloud Atlas”}的节点,然后匹配此节点具有关系[:DIRECTED]并且是被某个节点指向的节点,再返回匹配节点的 name 属性。返回结果如下图所示。
通过结果可以看到 Lily Wachowski 、 Lana Wachowski 、 Tom Tykwer 导演了电影 Cloud Atlas 。
【程序2-10】查找与Tom Hanks 一起出演过电影的人
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name
上面指令首先匹配节点类型为 Person 、属性为{name:“Tom Hanks”}的节点,然后匹配此节点通过[:ACTED_IN]关系指向的节点 m ,并且同时匹配某个节点 coActors 也通过[:ACTED_IN]关系指向的节点 m ,然后返回匹配节点 m 的 name 属性。返回结果如下图所示。
这样与 Tom Hanks 同时出演过电影的人的姓名就查出来了。
【程序2-11】查找与电影“Cloud Atlas”相关的所有人
MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) RETURN people.name, Type(relatedTo), relatedTo
上面指令首先匹配节点类型为 Person 的节点,然后匹配节点类型为 Movie 、节点属性为{title: “Cloud Atlas”}的节点,最后匹配他们两者之间存在某种关系(无论是导演还是演员关系)的情况,然后将人名、电影的关系类型、电影的关系同时返回。返回结果如下图所示。
通过结果可以看到返回了三列数据,这与 RETURN 语句后面的 people.name 、 Type(relatedTo) 、 relatedTo 相对应。
2.4.3.2 查询关系路径
您或许听说过“六度空间”理论,也就是说,世界上任何两个人,他们之间至多通过 6 条关系路径就可以相互联系到彼此。使用 Neo4j 的关系路径查询可以查找任意深度的关系路径,也就很轻松地能够实现人脉关系查询了。
【程序2-12】查找与演员“Kevin Bacon”存在 4 条及以内关系的任何演员和电影
MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood) RETURN DISTINCT hollywood
上面指令首先匹配节点类型为 Person 、属性为{name:“Kevin Bacon”}的节点,然后将关系深度限制为从 1 到 4 再进行遍历,最后返回匹配的所有节点。返回结果如下图所示。
通过结果可以看到演员 Kevin Bacon在 4 度关系以内的演员和电影网络是很庞大的。
【程序2-13】查找与演员“Kevin Bacon”与“Meg Ryan”之间的最短关系路径
MATCH p=shortestPath(
(bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN p
上面指令首先匹配节点类型为 Person 、 属性为{name:“Kevin Bacon”}的节点,再匹配节点类型为 Person 、属性为{name:“Meg Ryan”}的节点,两者用 [*] 关系操作符相连代表两者存在任意深度的关系,然后使用 shortestPath 方法返回两者在所有深度关系遍历路径中最短的一条。返回结果如下图所示。
通过结果可以看到演员 Meg Ryan 与 Tom Hanks 同参演过 Joe Versus the Volcano 电影,而 Tom Hanks 与 Kevin Bacon 同参演过 Apollo 13 电影,这就是他们两者之间的最短关系路径。
2.4.4 思考与练习
基于这个“电影关系图”实例,可以考虑一下其他的应用场景:要为 Tom Hanks 推荐新的合作伙伴,一个比较好的办法就是通过认识 Tom Hanks 的人的人脉来寻找新的合作伙伴。
对于 Tom Hanks 来说,这意味着:
第一步,先找到 Tom Hanks 还没有合作过的演员,但 Tom Hanks 的合作伙伴曾经与其合作过。
第二步,找到一个可以向他的潜在合作者介绍 Tom Hanks 的人。
【程序2-14】查找没有与“Tom Hanks”合作过的演员
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),(coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors)
WHERE NOT (tom)-[:ACTED_IN]->(m2)
RETURN cocoActors.name AS Recommended, count(*) AS Strength
ORDER BY Strength DESC
结果如下图所示。
【程序2-15】找人将“Tom Hanks”介绍给“Tom Cruise”
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors), (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cruise:Person {name:"Tom Cruise"})
RETURN tom, m, coActors, m2, cruise
结果如下图所示。
2.4.5 清空数据库
上面的数据在操作完后,有时候需要清理掉这些数据。下面的代码就可以做到。
【程序2-16】清空所有Person、Movie节点及其所有关系
MATCH (a:Person),(m:Movie)
OPTIONAL MATCH (a)-[r1]-(), (m)-[r2]-()
DELETE a, r1, m, r2
这样操作完成后,为了查询数据是否已经被清空了,可以运行以下命令先看数据库中是否还有任何数据。
【程序2-17】查询任意数据
MATCH (n) RETURN n
如果没有,就说明已经删除成功了。
也可以用下面的方法之间清空整个数据库。
【程序2-18】清空数据库
MATCH (n) DETACH DELETE n
Neo4j官方入门实例介绍相关推荐
- Dubbo官方入门实例
概览 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点: 自开源 ...
- myeclipse下hibernate入门实例介绍
说明:本例采用myeclipse+sqlserver2000 hibernate版本为3.0. 数据库驱动为:jtds-1.0.2. 1.配置myeclipse环境(eclipse-SDK-3.1 ...
- RapidJSON入门:手把手教入门实例介绍
RapidJSON优点 跨平台 编译器:Visual Studio.gcc.clang 等 架构:x86.x64.ARM 等 操作系统:Windows.Mac OS X.Linux.iOS.Andro ...
- Linux WAK介绍与入门实例
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为 强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分 ...
- neo4j入门实例(电影和演员的例子)
neo4j入门实例(电影和演员的例子) neo4j安装好后,在http://localhost:7474/browser/界面输入:play movie graph 就可以直接能看到电影的知识图谱例子 ...
- vue2+vuex+vue-router 快速入门(三) vue 实例介绍
vue 实例介绍 vue 实例分两种,一种为组件实例,另外一种为根实例.组件实例负责创建个性化组件.而根实例负责把组件渲染到指定的真实的 DOM 结构中.并且 vue 为我们提供了一种特殊的文件格式 ...
- HarmonyOS开发详解(二)——鸿蒙开发体系详解及入门实例演示运行
本篇文章的计划,先体系的介绍一下鸿蒙开发相关的体系内容,希望通过本篇内容构建对鸿蒙开发体系的了解,最后再来一个最简单入门例子.既是自我的学习,也希望对你了解鸿蒙开发的全貌有帮助. 这样安排而没有直接写 ...
- 基于php的微信公众平台开发入门实例
作者:zbtree 这篇文章主要介绍了基于php的微信公众平台开发入门,实例分析了微信公众平台从注册.配置方法及接口代码的实现技巧,深入浅出.希望可以帮助大家快速入门. CSDN学院开设了系列直播&l ...
- 第三章 Python Kivy 学习 -- Kivy官方入门教程Pong Game
系列文章目录 第一章 Python Kivy 学习 – Kivy介绍及环境安装 第二章 Python Kivy 学习 – Kivy项目开发原理(待编辑) 第三章 Python Kivy 学习 – Ki ...
最新文章
- java中random的头文件_JAVA中的Random()函數
- Taylor Swift - Red
- VTK:图片之ImageContinuousDilate3D
- hive性能优化指南
- C# WPF MVVM模式Prism框架下事件发布与订阅
- redis 学习笔记(1)-编译、启动、停止
- C# 彻底搞懂async/await
- 快速排序非递归算法c语言实现,数据结构与算法----3.5 非递归的快速排序方法
- Linux开启服务器问题(李蕾问题)
- linux mysql搭建禅道详细教程_linux安装禅道的步骤
- 同等质量下那种图片格式小_最实用的Window小工具合集,总有一款适合你!
- Java Swing Mysql实现的电影票订票管理系统源码附带视频指导运行教程
- python \uxxxx转中文,Python列表中的字典 \uxxxx转中文,
- 使用PowerShell 导出Exchange中的用户中用户信息到Office 365
- Ego的JavaWeb笔记
- 游侠客php,华东推荐徒步线路之轻户外经典线路——杭宣古道
- 灵感来了挡也挡不住,基于Redis解决业务场景中延迟队列
- 交换机开启DHCP Snooping
- android相关学习网站
- 华为linux笔记本i3和i7的区别,华为MateBook 13 i3版性能如何 华为MateBook 13 i3版笔记本上手体验...