教程:Cypher 入门

引言

本教程解释了 Cypher®(Neo4j 的查询语言)的基本概念,包括如何创建和查询图。完成本教程后,您应该能够阅读和理解 Cypher 查询。

流行文化关联

电影图谱是一个迷你图应用程序,包含通过合作电影相互关联的演员和导演。

在您按照本教程操作时,运行查询和 Cypher 代码来创建数据会有所帮助。

本教程将向您展示如何

  1. 创建:将电影数据插入到图谱中。

  2. 查找:检索单个电影和演员。

  3. 查询:查找图谱中的模式。

  4. 解决:回答关于图谱的一些问题。

创建电影图谱

  1. 创建并启动一个新的 Neo4j 数据库。

    1. https://sandbox.neo4j.com 创建一个空白沙盒或...

    2. 在 Neo4j Desktop 中创建一个新数据库

      1. 创建一个新项目。

      2. 向项目添加数据库。

      3. 启动数据库。

  2. 打开 Neo4j Browser。

  3. 设置浏览器以允许多语句

  1. 在查询面板中输入 :guide movie-graph,然后点击右侧的“播放”按钮。查询面板下方会打开一个新窗口,显示浏览器指南。

  2. 转到浏览器指南的第 2 页。

  3. 点击 Cypher 代码块,它将进入查询面板,然后点击“播放”按钮。

加载电影图谱后,您在 Neo4j Browser 中应看到以下内容

这是返回数据中部分数据的图视图。

如果您想查看返回数据的表格视图,请点击左侧的表格图标

您查看结果的方式也取决于返回的数据。如果查询返回节点,则可以将数据视为图。如果查询返回属性值,则只能将数据视为表格。

如果您需要帮助

:help cypher

当您在查询面板中运行 Cypher 代码时,它总是在查询面板下方创建一个新的结果面板。

查找演员和电影

接下来,您将学习如何查询单个节点。

  1. 查看每个查询示例

  2. 点击播放按钮运行查询

  3. 注意语法模式

  4. 尝试查找其他电影或演员

如果您需要语法帮助

:help MATCH:help WHERE:help RETURN

查找名为“汤姆·汉克斯”的人...​

将此代码复制并粘贴到查询面板中执行

MATCH (tom:Person)
WHERE tom.name = "Tom Hanks"
RETURN tom

图结果应如下所示

您还可以通过表格视图查看节点的属性

查找名为“云图”的电影...​

在这里,我们以不同的方式过滤查询,我们在节点规范中指定值,而不是使用 WHERE 子句。

将此代码复制并粘贴到查询面板中执行

MATCH (cloudAtlas:Movie {title: "Cloud Atlas"})
RETURN cloudAtlas

这是此查询的结果

这是表格视图

查找 10 个人...​

接下来,我们想在图谱中找到 10 个人的名字。此代码查找图谱中所有 Person 节点,但只返回其中 10 个的 name 属性值。

将此代码复制并粘贴到查询面板中执行

MATCH (people:Person)
RETURN people.name LIMIT 10

这是此查询的结果

对于此查询,返回的是属性值,您只能将结果视为表格。

查找 20 世纪 90 年代上映的电影...​

这是一个查询,我们指定了一个值范围来选择要检索的 Movie 节点。然后我们返回这些 Movie 节点的标题。

将此代码复制并粘贴到查询面板中执行

MATCH (nineties:Movie)
WHERE nineties.released > 1990 AND nineties.released < 2000
RETURN nineties.title

这是此查询的结果

查找图谱中的模式

到目前为止,您已经查询了图谱中的节点。接下来,您将获得检索相关节点的经验。

您将执行 Cypher 代码来查找图谱中的模式。

  1. 演员是出演电影的人。

  2. 导演是执导电影的人。

  3. 还存在哪些其他关系?

列出所有汤姆·汉克斯电影...​

这是一个查询,我们想返回演员汤姆·汉克斯的 Person 节点,同时我们还想返回所有与汤姆·汉克斯有 ACTED_IN 关系的 Movie 节点。也就是说,汤姆·汉克斯出演过的所有电影。

将此代码复制并粘贴到查询面板中执行

MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies)
RETURN tom,tomHanksMovies

这是此查询的结果

请注意,在这里我们还看到了汤姆·汉克斯节点和 Movie 节点之间的 DIRECTED 关系。这是因为我们的 Neo4j Browser 中有一个设置,使得结果节点将被连接

这是表格视图

谁执导了《云图》?

这是一个查询,我们想返回与《云图》 Movie 节点有 DIRECTED 关系的节点。它将返回执导该电影的人员姓名。

将此代码复制并粘贴到查询面板中执行

MATCH (cloudAtlas:Movie {title: "Cloud Atlas"})<-[:DIRECTED]-(directors)
RETURN directors.name

这是此查询的结果

汤姆·汉克斯的合作演员...​

接下来,我们想查找汤姆·汉克斯出演过的所有电影,并针对每部检索到的电影,找出在该电影中出演过的人。

将此代码复制并粘贴到查询面板中执行

MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors)
RETURN tom, m, coActors

这是此查询的结果

这是表格视图

这是一个查询,我们想返回有关与《云图》电影之间关系的信息。我们找到相关的节点,然后返回人物姓名、关系类型以及该关系的属性。

将此代码复制并粘贴到查询面板中执行

MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"})
RETURN people.name, type(relatedTo), relatedTo

这是此查询的结果

回答关于图谱的一些问题

您听说过经典的“凯文·培根六度理论”吗?也就是说,在图谱中找到所有距离凯文·培根最多 6 跳的人。这只是一个最短路径查询,称为“培根路径”。要执行这种类型的查询,您需要指定

距离凯文·培根最多三跳的电影和演员

在我们的第一个查询中,我们想在图谱中找到所有距离凯文·培根最多 3 跳的电影和/或人物。

将此代码复制并粘贴到查询面板中执行

MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..3]-(hollywood)
RETURN DISTINCT bacon, hollywood

这是此查询的结果

查找通往梅格·瑞恩的培根路径

图谱中凯文·培根和梅格·瑞恩之间的最短路径是什么?在此 Cypher 查询中,我们返回的路径包括节点和关系。

将此代码复制并粘贴到查询面板中执行

MATCH p=shortestPath(
  (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN p

在执行查询之前,您会看到一个警告,提示“*”关系可能需要很长时间才能执行。我们的电影图谱很小,所以您可以忽略此警告。

这是此查询的结果

清理

实验完成后,您可以移除电影数据集。

  1. 如果存在关系,节点无法被删除。

  2. 同时删除节点和关系。

这将移除图谱中的所有节点和关系!

将此代码复制并粘贴到查询面板中执行

MATCH (n)
DETACH DELETE n

这是此查询的结果

请注意,尽管左侧面板中的数据库信息显示图谱中没有节点或关系,但属性键名仍然存在。

验证电影图谱数据已删除

如果您执行此查询以检索图谱中的所有节点并返回计数,您应该会看到返回值为 0。

将此代码复制并粘贴到查询面板中执行

MATCH (n)
RETURN count(*)

这是此查询的结果

恭喜! 您已学会如何使用 Cypher 查询 Neo4j 数据库。

© . All rights reserved.