Cypher使用虚拟节点聚合多对多关系统计国家间图书合作问题
问题排查
- 第一个查询错误原因:在每一对跨国作者合作的行维度生成虚拟节点,每一行都会生成新的
Country虚拟节点实例,哪怕国家名完全相同,因此出现大量重复节点;同时未按国家对聚合统计合作图书总数,导致numCollabs始终为1。 - 第二个查询已经实现了国家虚拟节点的正确聚合,只需补充合作关系统计逻辑即可。
正确查询语句
// 第一步:聚合生成所有国家的唯一虚拟节点,存入映射表避免重复生成 MATCH (a:Author) WITH DISTINCT a.country AS countryName, count(a) AS authorCount WITH collect([countryName, apoc.create.vNode(['Country'], {name: countryName, authorTotal: authorCount})]) AS countryPairs WITH apoc.map.fromPairs(countryPairs) AS countryMap // 第二步:统计跨国国家对的合作图书总次数 MATCH (a1:Author)-->(b:Book)<--(a2:Author) WHERE a1.country < a2.country // 过滤避免A-B、B-A重复统计为两条独立合作对 WITH countryMap, a1.country AS c1, a2.country AS c2, count(DISTINCT b) AS collabTotal // 第三步:返回国家虚拟节点和合作虚拟关系 RETURN collect(DISTINCT countryMap[c1]) + collect(DISTINCT countryMap[c2]) AS countryVirtualNodes, collect(apoc.create.vRelationship(countryMap[c1], 'COLLABORATED_WITH', {numCollabs: collabTotal}, countryMap[c2])) AS collaborationRelations LIMIT 25
使用说明
- 如果你的图书节点标签为
Paper而非Book,将查询中(b:Book)替换为(b:Paper)即可 - 若需要保留双向合作关系,将
WHERE a1.country < a2.country修改为WHERE a1.country <> a2.country count(DISTINCT b)确保同一本合著图书不会因多对跨国作者重复计数,保证合作次数数值准确- 所有国家虚拟节点均取自预先生成的映射表,完全避免重复节点问题
内容的提问来源于stack exchange,提问作者Gary Frewin
相关产品推荐
相关产品推荐

