You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Cypher查询Neo4j中NODE节点的各类边计数(单行输出)

问题描述

现有Neo4j图数据,节点均带有NODE标签,边类型为A、B、C且均为双向。需求为查询所有NODE节点,返回每个节点对应的A、B、C类型边的计数,要求单行展示每个节点的所有边计数。当前使用的Cypher查询会将不同边类型的计数分多行返回,需后处理,现需直接得到单行输出的方案。

示例图数据

(n0:NODE) -[:A]- (n1:NODE)
(n0:NODE) -[:A]- (n2:NODE)
(n0:NODE) -[:B]- (n3:NODE)
(n1:NODE) -[:B]- (n2:NODE)
(n4:NODE) // 无任何边

期望输出

Node, count(A), count(B), count(C) 
n0,   2,        1,        0
n1,   1,        1,        0
n2,   1,        1,        0
n3,   0,        1,        0 
n4,   0,        0,        0

当前使用的Cypher查询(分多行返回结果)

MATCH (n:NODE) -[r]- ()
WHERE 
    type(r) in ["A", "B", "C"]
RETURN 
    id(n) as nid,
    type(r) as rtype, 
    count(r) as cnt
解决方案

可以通过条件聚合结合OPTIONAL MATCH实现单行输出,确保所有节点(包括无关联边的节点)都被返回,且每种边类型的计数在同一行展示:

MATCH (n:NODE)
OPTIONAL MATCH (n)-[r]-()
WHERE type(r) IN ["A", "B", "C"]
RETURN
  id(n) AS Node,
  count(CASE WHEN type(r) = 'A' THEN r END) AS `count(A)`,
  count(CASE WHEN type(r) = 'B' THEN r END) AS `count(B)`,
  count(CASE WHEN type(r) = 'C' THEN r END) AS `count(C)`
ORDER BY Node

逻辑说明

  1. MATCH (n:NODE):先获取所有NODE节点,确保无关联边的节点(如示例中的n4)也被纳入结果
  2. OPTIONAL MATCH (n)-[r]-():匹配节点的所有符合类型的边,若无对应边则r为null
  3. count(CASE ...):对每种边类型单独计数,当边类型匹配时返回该边对象,否则返回null;count函数会忽略null值,因此无对应边时计数为0
  4. ORDER BY Node:按节点ID排序,与示例输出顺序一致

执行上述查询后,将直接得到与期望格式一致的单行结果,无需额外后处理。

内容的提问来源于stack exchange,提问作者Zaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:36:26