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