WITH 子句
WITH 主要用于进一步投影或聚合当前数据。接下来我们将从这两个方面介绍相关用法。
聚合
聚合类似于 SQL 中的 GROUP BY 操作,它按属性对当前数据进行分组,并对每个组的数据执行相应的聚合函数操作。NeuG 目前支持主流的聚合函数,包括:
- COUNT
- COUNT_STAR
- COLLECT
- SUM
- MIN
- MAX
- AVG
我们将在 聚合函数章节 中详细介绍这些函数。
按单一属性聚合
MATCH (a) WITH label(a) AS label, count(a.name) AS cnt RETURN label, cnt;按多个属性聚合
MATCH (a)-[b:KNOWS]->(c) WITH label(a) AS a_label, label(c) AS c_label, count(b) AS cnt RETURN a_label, c_label, cnt;应用多个聚合函数
MATCH (a)-[b:KNOWS]->(c) WITH label(a) AS a_label, label(c) AS c_label, count(b) AS cnt, sum(b.weight) AS weights RETURN a_label, c_label, cnt, weights;基于聚合结果进行过滤
MATCH (a:Person) WITH label(a) AS label, count(a.name) AS cnt WHERE cnt > 2 RETURN label, cnt;投影
WITH 的另一个常见用法是按列进一步投影当前结果,相当于 SQL 中的 Column Pruning,只输出后续查询需要的列。
投影节点数据
MATCH (a:Person {name: 'marko'})-[:KNOWS]->(b:Person)
WITH b
MATCH (b)-[:CREATED]->(c)
RETURN c.name;节点/边数据投影
MATCH (a:Person {name: 'marko'})-[k:KNOWS]->(b:Person)
WITH b, k
MATCH (b)-[:CREATED]->(c)
RETURN k.weight, c.name;属性投影
MATCH (a:Person {name: 'marko'})-[:KNOWS]->(b:Person)
WITH a, b.age AS b_age
MATCH (a)-[:CREATED]->(c)
WHERE b_age > 20
RETURN c.name;对第一个 Match 生成的 b 数据的属性进行投影,通过 Filter 过滤这些属性,最后输出所有满足条件的 c.name;
Last updated on