Cypher多重聚合查询学习
2024-12-31 本文已影响0人
AI_Finance
以下解读这个查询所包含的知识点:
MATCH (n:Node)
WHERE NOT n.id IN $blacklist
OPTIONAL MATCH (n)-[r:RELATES_TO]->(m:Node)
WHERE NOT m.id IN $blacklist
RETURN
collect(DISTINCT {id: n.id, label: n.id, group: labels(n)[0]}) +
collect(DISTINCT {id: m.id, label: m.id, group: labels(m)[0]}) AS nodes,
collect(DISTINCT {from: startNode(r).id, to: endNode(r).id, weight: r.weight}) AS edges
LIMIT $limit请根据这个查询,帮我详细解读一下cypher语法相关知识
好的!让我来逐步详细解读这个 Cypher 查询,同时讲解相关的 Cypher 语法知识。
查询结构和功能拆解
1. MATCH (n:Node)
-
功能:
- 匹配所有带有
Node标签的节点。 -
n是一个变量,用于表示匹配到的节点。
- 匹配所有带有
-
语法知识:
-
MATCH是 Cypher 中的主要查询语句,用于匹配图中的节点或关系。 -
(:Label)表示匹配某个特定标签的节点,Node是标签名称。 - 如果只写
MATCH (n),则表示匹配图中的所有节点(不区分标签)。
-
2. WHERE NOT n.id IN $blacklist
-
功能:
- 过滤掉
n节点的id在黑名单$blacklist中的节点。 -
$blacklist是一个参数,可以从外部传递进来(通常由后端代码动态传入)。
- 过滤掉
-
语法知识:
-
WHERE是 Cypher 中的条件过滤语句,用于限制匹配的节点或关系。 -
NOT是逻辑运算符,表示条件取反。 -
IN是集合运算符,用于检查某个值是否存在于一个集合中。 -
$blacklist是参数化查询的占位符,目的是防止直接在查询中硬编码值,提高查询的安全性和灵活性。
-
3. OPTIONAL MATCH (n)-[r:RELATES_TO]->(m:Node)
-
功能:
- 匹配从节点
n出发,通过关系RELATES_TO连接的节点m。 - 如果没有匹配到关系或节点,
OPTIONAL MATCH会返回null,而不会完全排除该节点。
- 匹配从节点
-
语法知识:
-
(n)-[r:RELATES_TO]->(m:Node)表示一个有方向的关系:-
n是起点节点。 -
r是关系变量,RELATES_TO是关系的类型。 -
m是终点节点,带有Node标签。
-
-
OPTIONAL MATCH是 Cypher 的左连接(类似 SQL 的 LEFT JOIN),即使没有匹配到关系或节点,也会返回n,但r和m的值为null。 - 如果只需要无方向的关系,可以写作
(n)-[r]-(m)。
-
4. WHERE NOT m.id IN $blacklist
-
功能:
- 过滤掉
m节点的id在黑名单$blacklist中的节点。 - 如果
OPTIONAL MATCH中的m为null,这个条件不会影响结果。
- 过滤掉
-
语法知识:
-
WHERE可以在OPTIONAL MATCH后单独使用,作用于匹配到的节点或关系。 - 这里的过滤逻辑与第 2 步类似。
-
5. RETURN
-
功能:
- 定义查询的返回结果。
- 这里返回了两部分内容:
-
nodes:收集的节点信息。 -
edges:收集的边(关系)信息。
-
-
语法知识:
-
RETURN是 Cypher 查询的输出部分,用于定义查询结果。 - 可以返回节点、关系或属性的集合,也可以返回计算结果(如
count())。
-
6. collect(DISTINCT {id: n.id, label: n.id, group: labels(n)[0]})
-
功能:
- 收集所有节点
n的信息,并去重。 - 每个节点以
{id, label, group}的形式返回:-
id是节点的唯一标识。 -
label是节点的标签(这里直接用id作为显示标签)。 -
group是节点的第一个标签(如Node)。
-
- 收集所有节点
-
语法知识:
-
collect()是一个聚合函数,用于将多个值收集到一个列表中。 -
DISTINCT用于去重,确保列表中没有重复的值。 -
{id: n.id, label: n.id, group: labels(n)[0]}是一个映射(类似 JSON 对象),可以自定义返回的字段。 -
labels(n)是一个函数,返回节点n的所有标签;labels(n)[0]取第一个标签。
-
7. collect(DISTINCT {from: startNode(r).id, to: endNode(r).id, weight: r.weight})
-
功能:
- 收集所有关系
r的信息,并去重。 - 每个关系以
{from, to, weight}的形式返回:-
from是关系的起点节点 ID。 -
to是关系的终点节点 ID。 -
weight是关系的权重(假设RELATES_TO关系中包含weight属性)。
-
- 收集所有关系
-
语法知识:
-
startNode(r)和endNode(r)是函数,分别返回关系r的起点和终点节点。 -
r.weight是访问关系r的属性。
-
8. LIMIT $limit
-
功能:
- 限制返回的记录数量,最多返回
$limit条记录。
- 限制返回的记录数量,最多返回
-
语法知识:
-
LIMIT是 Cypher 中的限制语句,用于控制查询结果的大小。 -
$limit是参数化查询的占位符,通常由外部传入具体的值。
-
完整查询解读
这段查询的完整流程如下:
- 匹配所有带有
Node标签的节点n,并过滤掉黑名单中的节点。 - 尝试匹配从
n出发的RELATES_TO关系,以及关系的终点节点m。 - 对终点节点
m也进行黑名单过滤。 - 收集所有节点(包括
n和m)的信息,并去重。- 每个节点返回
{id, label, group}。
- 每个节点返回
- 收集所有关系
r的信息,并去重。- 每个关系返回
{from, to, weight}。
- 每个关系返回
- 限制返回的记录数量,最多返回
$limit条记录。
Cypher 语法知识补充
1. 图模式匹配
-
(a)-[r]->(b):表示有方向的关系,从a指向b。 -
(a)-[r]-(b):表示无方向的关系,可以是a到b或b到a。 -
(a)-[:RELATES_TO]->(b):只匹配RELATES_TO类型的关系。 -
(a)-[r:RELATES_TO|KNOWS]->(b):匹配多种类型的关系(RELATES_TO或KNOWS)。
2. 过滤条件
-
WHERE用于添加过滤条件,可以作用于节点、关系或属性。 - 常用运算符:
-
=:等于。 -
<、>、<=、>=:比较大小。 -
IN:检查是否在集合中。 -
NOT:取反。 -
AND、OR:逻辑运算。
-
3. 聚合函数
-
collect(expr):将表达式expr的结果收集到一个列表中。 -
DISTINCT:去重。 - 其他常见聚合函数:
-
count(expr):统计数量。 -
avg(expr):计算平均值。 -
sum(expr):计算总和。
-
4. 参数化查询
-
$param是参数化查询的占位符。 - 参数可以从外部传入(如 Python 的
tx.run()方法)。
通过上述解读,你应该对这段 Cypher 查询的功能和语法有了全面的了解。如果还有不清楚的地方,欢迎随时提问!