Neo4j重复关系
我在节点之间有重复的关系,例如:Neo4j重复关系,neo4j,cypher,Neo4j,Cypher,我在节点之间有重复的关系,例如: (Author)-[:CONNECTED_TO {weight: 1}]->(Coauthor) (Author)-[:CONNECTED_TO {weight: 1}]->(Coauthor) (Author)-[:CONNECTED_TO {weight: 1}]->(Coauthor) 我想把这些关系合并成一个形式的关系:A->{weight:3}B,用于我的整个图 我尝试了如下的方法;(我正在从csv文件读取数据) 但当我开始这个
(Author)-[:CONNECTED_TO {weight: 1}]->(Coauthor)
(Author)-[:CONNECTED_TO {weight: 1}]->(Coauthor)
(Author)-[:CONNECTED_TO {weight: 1}]->(Coauthor)
我想把这些关系合并成一个形式的关系:A->{weight:3}B,用于我的整个图
我尝试了如下的方法;(我正在从csv文件读取数据)
但当我开始这个查询时,ıt会创建重复的共同作者节点。权重将更新。似乎是这样的:
(Author)-[r:CONNECTED_TO]->(Coauthor)
(它为作者创建了3个相同的共同作者节点)如果您需要在事后修复它,您可以聚合所有关系以及每组适用节点之间的权重。然后用新的聚合数更新第一个关系。然后使用关系集合删除第二个到最后一个。仅在存在多个关系的情况下执行更新。像这样的
MATCH (a:Author {name: 'A'})-[r:CONNECTED_TO]->(b:CoAuthor {name: 'B'})
// aggregate the relationships and limit it to those with more than 1
WITH a, b, collect(r) AS rels, sum(r.weight) AS new_weight
WHERE size(rels) > 1
// update the first relationship with the new total weight
SET (rels[0]).weight = new_weight
// bring the aggregated data forward
WITH a, b, rels, new_weight
// delete the relationships 1..n
UNWIND range(1,size(rels)-1) AS idx
DELETE rels[idx]
如果您对整个图形执行此操作,并且图形是可扩展的,那么您可能希望使用limit或其他一些控制机制对其进行批量更新
MATCH (a:Author)-[r:CONNECTED_TO]->(b:CoAuthor)
WITH a, b, collect(r) AS rels, sum(r.weight) AS new_weight
LIMIT 100
WHERE size(rels) > 1
SET (rels[0]).weight = new_weight
WITH a, b, rels, new_weight
UNWIND range(1,size(rels)-1) AS idx
DELETE rels[idx]
如果您想消除加载时的问题
MATCH (a:Author {authorid: csvLine.author_id}),(b:Coauthor { coauthorid: csvLine.coauthor_id})
MERGE (a)-[r:CONNECTED_TO]->(b)
ON CREATE SET r.weight = 1
ON MATCH SET r.weight = coalesce(r.weight, 0) + 1
<强>边注:< /强>不知道你的数据模型,我会考虑建模<代码>合著者<代码> > <代码>作者<代码>,因为它们可能是作者自己的权利。可能只有在特定项目的背景下,他们才会被视为合著者
MATCH (a:Author {authorid: csvLine.author_id}),(b:Coauthor { coauthorid: csvLine.coauthor_id})
MERGE (a)-[r:CONNECTED_TO]->(b)
ON CREATE SET r.weight = 1
ON MATCH SET r.weight = coalesce(r.weight, 0) + 1