neo4j 将一个节点的属性复制到另一个节点上


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

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM