美文网首页
Cypher多重聚合查询学习

Cypher多重聚合查询学习

作者: AI_Finance | 来源:发表于2024-12-31 06:00 被阅读0次

以下解读这个查询所包含的知识点:

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,但 rm 的值为 null
    • 如果只需要无方向的关系,可以写作 (n)-[r]-(m)

4. WHERE NOT m.id IN $blacklist

  • 功能
    • 过滤掉 m 节点的 id 在黑名单 $blacklist 中的节点。
    • 如果 OPTIONAL MATCH 中的 mnull,这个条件不会影响结果。
  • 语法知识
    • 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 是参数化查询的占位符,通常由外部传入具体的值。

完整查询解读

这段查询的完整流程如下:

  1. 匹配所有带有 Node 标签的节点 n,并过滤掉黑名单中的节点。
  2. 尝试匹配从 n 出发的 RELATES_TO 关系,以及关系的终点节点 m
  3. 对终点节点 m 也进行黑名单过滤。
  4. 收集所有节点(包括 nm)的信息,并去重。
    • 每个节点返回 {id, label, group}
  5. 收集所有关系 r 的信息,并去重。
    • 每个关系返回 {from, to, weight}
  6. 限制返回的记录数量,最多返回 $limit 条记录。

Cypher 语法知识补充

1. 图模式匹配

  • (a)-[r]->(b):表示有方向的关系,从 a 指向 b
  • (a)-[r]-(b):表示无方向的关系,可以是 abba
  • (a)-[:RELATES_TO]->(b):只匹配 RELATES_TO 类型的关系。
  • (a)-[r:RELATES_TO|KNOWS]->(b):匹配多种类型的关系(RELATES_TOKNOWS)。

2. 过滤条件

  • WHERE 用于添加过滤条件,可以作用于节点、关系或属性。
  • 常用运算符:
    • =:等于。
    • <><=>=:比较大小。
    • IN:检查是否在集合中。
    • NOT:取反。
    • ANDOR:逻辑运算。

3. 聚合函数

  • collect(expr):将表达式 expr 的结果收集到一个列表中。
  • DISTINCT:去重。
  • 其他常见聚合函数:
    • count(expr):统计数量。
    • avg(expr):计算平均值。
    • sum(expr):计算总和。

4. 参数化查询

  • $param 是参数化查询的占位符。
  • 参数可以从外部传入(如 Python 的 tx.run() 方法)。

通过上述解读,你应该对这段 Cypher 查询的功能和语法有了全面的了解。如果还有不清楚的地方,欢迎随时提问!

相关文章

网友评论

      本文标题:Cypher多重聚合查询学习

      本文链接:https://www.haomeiwen.com/subject/vgrpejtx.html