教程:Cypher 入门

介绍

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

流行文化连接

电影图 是一个小型图应用程序,包含演员和导演,他们通过合作的电影相互关联。

如果您在学习本教程时运行查询和 Cypher 代码以创建数据,则会有所帮助。

本教程将向您展示如何

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

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

  3. 查询:在图中查找模式。

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

创建电影图

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

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

    2. 在 Neo4j 桌面中创建一个新的数据库

      1. 创建一个新项目。

      2. 将数据库添加到项目中。

      3. 启动数据库。

  2. 打开 Neo4j 浏览器。

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

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

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

  3. 单击 Cypher 代码块,将其带到查询窗格中,然后单击“播放”按钮。

这是加载电影图后在 Neo4j 浏览器中应该看到的内容

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

如果要查看返回数据的表格视图,请单击左侧的表格图标

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

如果您需要帮助

: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

这是此查询的结果

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

查找 1990 年代上映的电影…​

这是一个查询,我们为选择要检索的 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 浏览器中有一个设置,结果节点将被连接

这是表格视图

谁执导了“云图”?

这是一个查询,我们希望返回与云图 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 数据库。