如何用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
逻辑说明
MATCH (n:NODE):先获取所有NODE节点,确保无关联边的节点(如示例中的n4)也被纳入结果OPTIONAL MATCH (n)-[r]-():匹配节点的所有符合类型的边,若无对应边则r为nullcount(CASE ...):对每种边类型单独计数,当边类型匹配时返回该边对象,否则返回null;count函数会忽略null值,因此无对应边时计数为0ORDER BY Node:按节点ID排序,与示例输出顺序一致
执行上述查询后,将直接得到与期望格式一致的单行结果,无需额外后处理。
内容的提问来源于stack exchange,提问作者Zaya
相关产品推荐
相关产品推荐

