Cypher 是一种专为图形设计的查询语言。
()
表示。(:Person)
.(:Person)--(:Movie)
.<
或 >
表示,例如(:Person)-→(:Movie)
。[
和 ]
,例如[:ACTED_IN]
{name: 'Tom Hanks'}
.// example Cypher pattern
(m:Movie {title: 'Cloud Atlas'})<-[:ACTED_IN]-(p:Person)
此模式中的两种节点类型是 Movie 和 Person。 Person 节点与 Movie 节点具有ACTED_IN关系。 此模式中的特定 Movie 节点按 title 属性进行筛选,其值为 Cloud Atlas。 所以这个模式代表了图中所有在电影 Cloud Atlas 中表演的人。
Cypher 的工作原理是匹配数据中的模式。 我们使用关键字MATCH
从图表中检索数据。 您可以将MATCH
子句视为类似于 SQL 语句中的 FROM 子句。
例如,如果我们要在图形中查找 Person,我们将采用MATCH
标签为:Person
- 且前缀为冒号:
的单个节点的模式 。
MATCH (:Person)
// incomplete MATCH clause because we need to return something
假设我们想从图中检索所有 Person 节点。我们可以通过在冒号前放置一个值来分配一个变量p
。 让我们使用变量p
。现在,它表示从图形中检索到的所有 Person 节点,我们可以使用RETURN
子句返回它们。
MATCH (p:Person)
RETURN p
我们可以使用大括号来指定 name 和 Tom Hanks 的键/值对作为过滤器。 由于 Tom Hanks 是一个字符串,我们需要将其放在单引号或双引号内。{..}
// 在我们的 Cypher 语句中,我们可以使用点表示法访问属性。 例如,要使用 name 属性值 property key 返回其 property key 。p.name
MATCH (p:Person {name: 'Tom Hanks'})
RETURN p
// RETURN p.born 返回年份
筛选查询的另一种方法是使用WHERE
子句,而不是使用大括号内联指定属性值。
此查询返回与上一个查询相同的数据。
MATCH (p:Person)
WHERE p.name = 'Tom Hanks'
RETURN p.born
此查询返回两个姓名及其关联的出生年份。
MATCH (p:Person)
WHERE p.name = 'Tom Hanks' OR p.name = 'Rita Wilson'
RETURN p.name, p.born
MATCH (p:Person {name: "?????"})
RETURN p.?????
我们可以扩展MATCH
子句中的模式,以遍历具有 ACTED_IN 类型的所有关系到任何节点。 我们的域模型显示,ACTED_IN关系从 Person 节点向外方向发展,因此我们可以在模式中添加方向。 我们通常将其称为遍历。
我们的数据模型规定该关系另一端的节点将是 Movie 节点,因此我们不一定需要在节点中指定 :Movie 标签 - 而是使用变量 m。
MATCH (p:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(m)
RETURN m.title
如果我们的图表具有不同的标签,例如 Television 和 Movie 节点,则此查询将返回 Tom Hanks作的所有 Television 和 Movie 节点。 也就是说,如果我们在图表中ACTED_IN关系的末尾有多种类型的节点,我们可以确保只返回电影。
MATCH (p:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(m:Movie)
RETURN m.title
由于我们的图表仅包含具有传入 ACTED_IN 关系的 Movie 节点,因此此查询返回与上一个查询完全相同的结果。
您可以使用以下查询来查找谁指导了 Cloud Atlas:
//MATCH (m:Movie {title: "Cloud Atlas"})<-[:?????]-(p:?????)
//RETURN p.?????
MATCH (m:Movie {title: "Cloud Atlas"} )<-[:DIRECTED]-(p:Person)
RETURN p.name
您可以使用以下查询查找 Emil 被列为表演的 Movie 的标题。
//MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
//RETURN m.title
MATCH (p:Person {name: "Emil Eifrem"})-[:ACTED_IN]->(m:Movie)
RETURN m.title
例如,此查询检索 Person 节点和 Movie 节点,其中的人员在 2008 年或 2009 年上映的电影中出演:
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WHERE m.released = 2008 OR m.released = 2009
RETURN p, m
您已经看到了这种类型的查询。它返回在电影 The Matrix 中表演的所有人员的姓名。
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WHERE m.title='The Matrix'
RETURN p.name
此查询的替代方法是以下查询,我们在其中测试WHERE
子句中的节点标签: