2.4 官方入门实例介绍

本节的内容不必深入掌握,主要是给大家一个简单的认识,具体的 Cypher 语言在下一章会详细讲解。

为了方便用户入门, Neo4j Web 管理界面提供了一个官方入门实例 “电影关系图”,帮助初学者在自己电脑上一步步创建一个入门级别的图数据结构。本节将围绕这个“电影关系图”实例一步步讲解、分析其创建和查询等操作。

首先,打开 Neo4j Web 管理界面后,在引导实例区单击 Open Guides 链接就进入“电影关系图”实例引导界面了,如下图所示。


“电影关系图”实例将电影、电影导演、演员之间的复杂网状关系作为蓝本,使用 Neo4j 创建三者关系的图结构,虽然实例数据规模小但结构是相对完整的。

这个实例将指引读者学习以下入门操作:

  1. 创建图数据:将电影、演员、导演等图数据导入到Neo4j数据库中。
  2. 检索节点:检索特定电影和演员。
  3. 查询关系:发现相关的演员和导演。
  4. 查询关系路径:查询他们之间的关系路径。

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官方入门实例介绍相关推荐

  1. Dubbo官方入门实例

    概览 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点:             自开源 ...

  2. myeclipse下hibernate入门实例介绍

    说明:本例采用myeclipse+sqlserver2000  hibernate版本为3.0.  数据库驱动为:jtds-1.0.2. 1.配置myeclipse环境(eclipse-SDK-3.1 ...

  3. RapidJSON入门:手把手教入门实例介绍

    RapidJSON优点 跨平台 编译器:Visual Studio.gcc.clang 等 架构:x86.x64.ARM 等 操作系统:Windows.Mac OS X.Linux.iOS.Andro ...

  4. Linux WAK介绍与入门实例

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为 强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分 ...

  5. neo4j入门实例(电影和演员的例子)

    neo4j入门实例(电影和演员的例子) neo4j安装好后,在http://localhost:7474/browser/界面输入:play movie graph 就可以直接能看到电影的知识图谱例子 ...

  6. vue2+vuex+vue-router 快速入门(三) vue 实例介绍

    vue 实例介绍 vue 实例分两种,一种为组件实例,另外一种为根实例.组件实例负责创建个性化组件.而根实例负责把组件渲染到指定的真实的 DOM 结构中.并且 vue 为我们提供了一种特殊的文件格式  ...

  7. HarmonyOS开发详解(二)——鸿蒙开发体系详解及入门实例演示运行

    本篇文章的计划,先体系的介绍一下鸿蒙开发相关的体系内容,希望通过本篇内容构建对鸿蒙开发体系的了解,最后再来一个最简单入门例子.既是自我的学习,也希望对你了解鸿蒙开发的全貌有帮助. 这样安排而没有直接写 ...

  8. 基于php的微信公众平台开发入门实例

    作者:zbtree 这篇文章主要介绍了基于php的微信公众平台开发入门,实例分析了微信公众平台从注册.配置方法及接口代码的实现技巧,深入浅出.希望可以帮助大家快速入门. CSDN学院开设了系列直播&l ...

  9. 第三章 Python Kivy 学习 -- Kivy官方入门教程Pong Game

    系列文章目录 第一章 Python Kivy 学习 – Kivy介绍及环境安装 第二章 Python Kivy 学习 – Kivy项目开发原理(待编辑) 第三章 Python Kivy 学习 – Ki ...

最新文章

  1. java中random的头文件_JAVA中的Random()函數
  2. Taylor Swift - Red
  3. VTK:图片之ImageContinuousDilate3D
  4. hive性能优化指南
  5. C# WPF MVVM模式Prism框架下事件发布与订阅
  6. redis 学习笔记(1)-编译、启动、停止
  7. C# 彻底搞懂async/await
  8. 快速排序非递归算法c语言实现,数据结构与算法----3.5 非递归的快速排序方法
  9. Linux开启服务器问题(李蕾问题)
  10. linux mysql搭建禅道详细教程_linux安装禅道的步骤
  11. 同等质量下那种图片格式小_最实用的Window小工具合集,总有一款适合你!
  12. Java Swing Mysql实现的电影票订票管理系统源码附带视频指导运行教程
  13. python \uxxxx转中文,Python列表中的字典 \uxxxx转中文,
  14. 使用PowerShell 导出Exchange中的用户中用户信息到Office 365
  15. Ego的JavaWeb笔记
  16. 游侠客php,华东推荐徒步线路之轻户外经典线路——杭宣古道
  17. 灵感来了挡也挡不住,基于Redis解决业务场景中延迟队列
  18. 交换机开启DHCP Snooping
  19. android相关学习网站
  20. 华为linux笔记本i3和i7的区别,华为MateBook 13 i3版性能如何 华为MateBook 13 i3版笔记本上手体验...

热门文章

  1. Google Earth Engine(gee)中的Image
  2. 怎样在win10上搭建自己的web服务器(详细)
  3. svn revert详解
  4. android jni 发送短信,android5.0以上版本如何直接发送短信?
  5. 原码、补码、反码、移码的介绍与比较
  6. mysql的datetime使用_​MySQL日期数据类型datetime的使用方法
  7. bat脚本删除文件夹
  8. apk反编译重新打包时遇到小问题
  9. 人工智能自动代码生成1---前言
  10. 使用 Learn2Compress 定制移动端机器学习模型