GraphGists

让我们首先获取一些数据以从中检索结果

CREATE (matrix:Movie {title:"The Matrix",released:1997})
CREATE (cloudAtlas:Movie {title:"Cloud Atlas",released:2012})
CREATE (forrestGump:Movie {title:"Forrest Gump",released:1994})
CREATE (keanu:Person {name:"Keanu Reeves", born:1964})
CREATE (robert:Person {name:"Robert Zemeckis", born:1951})
CREATE (tom:Person {name:"Tom Hanks", born:1956})
CREATE (tom)-[:ACTED_IN {roles:["Forrest"]}]->(forrestGump)
CREATE (tom)-[:ACTED_IN {roles:['Zachry']} ]->(cloudAtlas)
CREATE (robert)-[:DIRECTED]->(forrestGump)

使用 UNION 组合语句

Cypher 语句通常非常紧凑。将节点之间的引用表示为可视化模式使其易于理解。

如果要组合两个具有相同结果结构的语句的结果,可以使用 UNION [ALL]

例如,如果要列出所有演员和导演,而不使用备用关系类型语法 ()-[:ACTED_IN|:DIRECTED]→(),可以执行以下操作

MATCH (actor:Person)-[r:ACTED_IN]->(movie:Movie)
RETURN actor.name AS name, type(r) AS acted_in, movie.title AS title
UNION
MATCH (director:Person)-[r:DIRECTED]->(movie:Movie)
RETURN director.name AS name, type(r) AS acted_in, movie.title AS title

使用 WITH 链式连接语句

在 Cypher 中,可以将语句片段链接在一起,就像在数据流管道中一样。每个片段都处理前一个片段的输出,其结果可以馈送到下一个片段。

使用 WITH 子句将各个部分组合在一起,并声明哪些数据从一个部分流向另一个部分。WITH 非常类似于 RETURN,区别在于它不会结束查询,而是准备输入以供下一部分使用。您可以使用与 RETURN 子句中相同的表达式、聚合、排序和分页。

唯一的区别是您**必须**为所有列设置别名,否则将无法访问它们。只有在 WITH 子句中声明的列可在后续查询部分中使用。

请参见下面的示例,其中我们收集某人出演的电影,然后过滤掉仅出现在一部电影中的电影。

MATCH (person:Person)-[:ACTED_IN]->(m:Movie)
WITH person, count(*) as appearances, collect(m.title) as movies
WHERE appearances > 1
RETURN person.name, appearances, movies

提示:如果要根据聚合值在 SQL 或类似语言中进行筛选,则需要使用 HAVING。这是一个专门用于筛选聚合信息的子句。在 Cypher 中,WHERE 可用于这两种情况。