Cypher实现多匹配场景下被关注对象频次统计
需求背景
- 现有图数据库结构:携带
name属性的Person节点之间通过有向follows关系建立关注连接,关系方向为关注者指向被关注者,示例关系:(n:Person {name: "a1"})-[:follows]->(m:Person {name: "a2"}) - 待实现逻辑:给定一组Person节点的姓名列表,统计列表内所有节点关注的对象中,每个被关注对象的累计被关注次数
- 示例验证场景:给定姓名列表
["a1", "a2", "a3"],已知关注关系为a1关注b1、b2、b3;a2关注b2、b3;a3关注b3,期望输出统计结果为b3:3、b2:2、b1:1
实现Cypher语句
推荐使用参数化写法,避免注入风险,同时方便动态传入列表:
MATCH (follower:Person)-[:follows]->(followed:Person) WHERE follower.name IN $nameList RETURN followed.name AS followed_person, count(followed) AS follow_count ORDER BY follow_count DESC
如果是固定列表的场景(即对应上述示例场景),可以直接写死列表值:
MATCH (follower:Person)-[:follows]->(followed:Person) WHERE follower.name IN ['a1', 'a2', 'a3'] RETURN followed.name AS followed_person, count(followed) AS follow_count ORDER BY follow_count DESC
语句逻辑说明
- 第一步通过
MATCH匹配所有Person节点间的follows有向关系,明确区分关注者(关系起点)和被关注者(关系终点) - 第二步通过
WHERE条件过滤,仅保留关注者姓名属于给定输入列表的关系路径 - 第三步按被关注者姓名分组,通过
count()函数统计每个被关注者关联的有效路径数,也就是被列表内用户关注的总次数 - 最后通过
ORDER BY按被关注次数倒序排列,输出顺序和示例预期完全一致,执行示例场景的固定语句即可得到b3:3、b2:2、b1:1的结果。
内容的提问来源于stack exchange,提问作者ShortIter
相关产品推荐
相关产品推荐

