在使用Python操作Neo4j数据库的时候,经常会遇到重复的节点,需要将一个节点的属性复制到另一个节点,之后将该节点删除。
def copy_node_properties(source_node_id,target_node_id,graph=None): """ 将节点 source_node_id 的属性复制到节点 target_node_id 上面 """ if source_node_id is None or target_node_id is None: return if graph is None: graph = get_graph() #将源节点的所有的内容合并到目标节点 match = "match (x) where id(x)= %s or id(x)=%s return x " % (source_node_id,target_node_id) result = graph.run(match).data() if result is not None and len(result) == 2 and result[0]["x"] is not None and len(result[0]["x"].nodes) > 0 and result[1]["x"] is not None and len(result[1]["x"].nodes) > 0: n1 = result[0]["x"].nodes[0] n2 = result[1]["x"].nodes[0] to_merge_node = n1 if n1.identity == target_node_id else n2 source_node = n1 if n1.identity == source_node_id else n2 #复制标签到目标节点 target_node_labels = [] if to_merge_node.labels is not None: for a in to_merge_node.labels: target_node_labels.append(a) to_add_labels = [] if source_node.labels is not None: for a in source_node.labels: if a not in target_node_labels: temp = "set x:" + a to_add_labels.append(temp) #复制属性信息 fields = [] for k,v in source_node.items(): if v is None: continue if k in to_merge_node: if to_merge_node[k] is None: continue if to_merge_node[k] == v: continue max = v if len(v) > len(to_merge_node[k]) else to_merge_node[k] min = v if len(v) < len(to_merge_node[k]) else to_merge_node[k] v = max if max.find(min) >= 0 else to_merge_node[k] + "/" + v temp = "set x.%s = '%s'" % (k,v) fields.append(temp) if len(fields) ==0 and len(to_add_labels)==0: return True fields_str = " ".join(fields) labels_str = " ".join(to_add_labels) match = "match (x) where id(x)= %s %s %s return x " % (target_node_id,labels_str,fields_str) result = graph.run(match).data() if result is not None and len(result) > 0: return True else: return False return