首页 > 编程笔记 > MySQL笔记 阅读:12

Cypher WITH语句的用法(附带实例)

WITH 语句允许多个语句被连接在一起,将上一个子语句的部分变量传递到下一个子语句中。

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" │

相关文章