Cypher WITH语句的用法(附带实例)
WITH 语句允许多个语句被连接在一起,将上一个子语句的部分变量传递到下一个子语句中。
WITH 语句常见的用法是与 MATCH 语句同时出现,作用是限制传递给下一个子语句中的变量数量。WITH 语句也可以与 ORDER BY 语句和 LIMIT 语句组合,实现获取前 N 名的功能。
WITH 语句的另一个作用是对聚合值进行筛选,具体案例见如下代码。
1) 先删除图中的所有节点和关系,代码如下:
2) 然后创建节点,代码如下:

图 1 节点和关系所构成的图(WITH 语句)
下面从 name 属性值为 Anders 的节点开始,找到所有匹配的节点,按名称降序排列并得到排名第一的节点结果,之后找到连接到顶部结果的所有节点,并返回这些节点的 name 属性值。代码如下:
WITH 语句常见的用法是与 MATCH 语句同时出现,作用是限制传递给下一个子语句中的变量数量。WITH 语句也可以与 ORDER BY 语句和 LIMIT 语句组合,实现获取前 N 名的功能。
WITH 语句的另一个作用是对聚合值进行筛选,具体案例见如下代码。
1) 先删除图中的所有节点和关系,代码如下:
MATCH (n) DETACH DELETE n上述代码会删除所有的节点及关系,读者在使用过程中一定要谨慎。
2) 然后创建节点,代码如下:
CREATE (A{name:"Anders"}) CREATE (B{name:"Bossman"}) CREATE (C{name:"Caesar"}) CREATE (D{name:"David"}) CREATE (G{name:"George"})最后创建关系,代码如下:
MATCH (A{name:"Anders"}),(B{name:"Bossman"}),(C{name:"Caesar"}),(D{name:"David"}), (G{name:"George"}) CREATE (A) - [:KNOWS] -> (B) CREATE (A) - [:BLOCKS] -> (C) CREATE (B) - [:KNOWS] -> (G) CREATE (B) - [:BLOCKS] -> (D) CREATE (C) - [:KNOWS] -> (G) CREATE (D) - [:KNOWS] -> (A)节点和关系所构成的图如下图所示:

图 1 节点和关系所构成的图(WITH 语句)
WITH语句对聚合函数结果进行过滤
聚合的结果必须通过 WITH 语句才能进行筛选,下面演示 WITH 语句是如何对聚合结果进行筛选的,实现查询并返回 name 属性值为 David 的节点。david 节点至少有一个外向关系的节点,并返回该节点的 name 属性值,代码如下:MATCH (david { name: 'David' })--(otherPerson)-->() WITH otherPerson, count(*) AS foaf WHERE foaf > 1 RETURN otherPerson.name返回值如下:
│"otherPerson.name"│ │"Anders" │
WITH语句对返回结果进行排序
对返回结果进行排序,collect() 函数的作用是将排序后的结果封装为一个列表,代码如下:MATCH (n) WITH n ORDER BY n.name DESC LIMIT 3 RETURN collect(n.name)返回值如下:
│"collect(n.name)" │ │["George","David","Caesar"]│
WITH语句路径搜索限制
WITH 语句可以用于路径匹配,并对路径数量进行限制,之后使用这些路径完成有限搜索。下面从 name 属性值为 Anders 的节点开始,找到所有匹配的节点,按名称降序排列并得到排名第一的节点结果,之后找到连接到顶部结果的所有节点,并返回这些节点的 name 属性值。代码如下:
MATCH (n { name: 'Anders' })--(m) WITH m ORDER BY m.name DESC LIMIT 1 MATCH (m)--(o) RETURN o.name返回值如下:
│"o.name" │ │"Bossman"│ │"Anders" │