1.15 WITH
WITH语句将分段的查询部分连接在一起,查询结果从一部分以管道形式传递给另外一部分作为开始点。
使用WITH可以在将结果传递到后续查询之前对结果进行操作。操作可以是改变结果的形式或者数量。WITH的一个常见用法就是限制传递给其他MATCH语句的结果数。通过结合ORDER BY和LIMIT,可获取排在前面的X个结果。
1.15.1 过滤聚合函数结果
聚合的结果必须要通过WITH语句传递才能进行过滤。
MATCH (david { name: 'Tom Hanks' })--()--(otherPerson) WITH otherPerson, count(*) AS foaf WHERE foaf > 1 RETURN otherPerson |
1.15.2 在collect前对结果排序
可以在将结果传递给collect函数之前对结果进行排序,这样就可以返回排过序的列表。
MATCH (n) WITH n ORDER BY n.name DESC LIMIT 3 RETURN collect(n.name) |
1.15.3 限制路径搜索的分支
可以限制匹配路径的数量,然后以这些路径为基础再做任何类似的有限制条件的搜索。
MATCH (n { name: 'Tom Hanks' })--(m) WITH m ORDER BY m.name DESC LIMIT 1 MATCH (m)--(o) RETURN o.name |
1.16 FOREACH
FOREACH语句用于循环遍历结果集列表,然后做一些操作。
列表(lists)和路径(paths)是Cypher中的关键概念。可以使用FOREACH来更新其中的数据。它可以在路径或者聚合的列表的每个元素上执行更新命令。FOREACH括号中的变量是与外部分开的,这意味着FOREACH中创建的变量不能用于该语句之外。
在FOREACH括号内,可以执行任何的更新命令,包括CREATE,CREATE UNIQUE,DELETE和FOREACH。如果希望对列表中的每个元素执行额外的MATCH命令,使用UNWIND命令更合适。
1.16.1 标记路径上的所有节点
这个查询将设置路径上所有节点的marked属性为true值。
MATCH p = (root { name: 'root' })-[r]-(A) FOREACH (n IN nodes(p)| SET n.marked = < |