在使用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