Neo4j同节点间边数控制求助:仅保留两节点间至多一条边
Eurovision Votes示例多边问题解决思路
我之前折腾Neo4j示例的时候也碰到过类似的情况,给你梳理几个可行的解决方向:
1. 先排查数据是否存在重复关系
首先得确认是不是数据本身就有重复的投票关系。你可以跑下面的查询,找出所有节点间存在多条边的情况:
MATCH (a:Country)-[r:VOTED_FOR]->(b:Country) WITH a, b, count(r) as edgeCount WHERE edgeCount > 1 RETURN a.country, b.country, edgeCount
如果返回结果里有记录,说明你的数据库里确实存在重复的投票关系,大概率是导入数据时重复执行了导入语句导致的。
2. 清理重复的关系(如果数据重复)
要是确认是数据重复,你可以用下面的语句删除重复的关系,只保留每组重复关系中的第一条:
MATCH (a:Country)-[r:VOTED_FOR]->(b:Country) WITH a, b, collect(r) as relList WHERE size(relList) > 1 FOREACH (rel IN tail(relList) | DELETE rel)
⚠️ 注意:执行删除操作前最好先备份数据,或者在测试环境验证后再操作。
3. 修改查询语句,聚合显示单条边
如果不想修改原始数据,也可以在查询时对关系进行聚合,让可视化界面显示单条边(带上聚合后的属性,比如总票数)。比如把查询12改成类似这样:
MATCH (from:Country)-[v:VOTED_FOR]->(to:Country) WITH from, to, sum(v.points) as totalPoints RETURN from, to, totalPoints
这样Neo4j Browser在可视化时,会自动将同一对节点间的聚合结果显示为单条边,边的属性可以显示总票数,和示例效果一致。
4. 重新导入数据(彻底解决重复问题)
如果是因为重复执行导入步骤导致的数据重复,最彻底的方法是清空数据库,然后重新执行一次导入语句,确保只导入一次数据。
内容的提问来源于stack exchange,提问作者K.Hua
相关产品推荐
相关产品推荐

