如何编写大型语句
让我们首先获取一些数据以从中检索结果
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
可用于这两种情况。
此页面是否有帮助?