neo4j 刪除重複節點

這裏的重複節點指的是一個label下的部分節點,屬性A相同,其他屬性不相同

 問題背景:

    本文中的數據爲舉例說明,實際數據不便展示,但表達的意思一致;

1. neo4j中label爲PERSON的的節點有name和wechat兩個屬性,關係type爲FRIEND;

2. 在進行數據的清洗和預處理過程中,name對應的wechat數據獲取出現偏差,導致一個name在先後獲取wechat時取到了不同的值,導致一個人員錄入了兩個節點,如name=Tom前後獲取wechat時分別獲取到了123和456兩個值,最終在neo4j中存儲的節點有兩個:

(:PERSON{name:"Tom",wechat:"123"})
(:PERSON{name:"Tom",wechat:"456"})

 3. 導入的關係數據是以name爲參照建立的,比如 Tom 和 Jerry 爲 FRIEND 關係,由於節點信息的錯誤,則在庫中將存在兩個關係,但實際只應存在一個有效關係:

 

(:PERSON{name:"Tom",wechat:"123"})-[:FRIEND]-(:PERSON{name:"Jerry",wechat:"111"})
(:PERSON{name:"Tom",wechat:"456"})-[:FRIEND]-(:PERSON{name:"Jerry",wechat:"111"})

3. 優化數據清洗和預處理程序後,能確保獲取到唯一一個wechat值,這時neo4j中已經導入了千萬級節點和關係,重新導入的話耗時太長;

解決方案:

1. 節點中name對應的wechat可能會有多個值,但後面的數據分析只需要一個即可,由於節點和關係都是批量導入的,所以同樣是name="Tom"的節點,先導入的節點對應的關係將會多於後導入的節點對應的關係;

2. 解決方案爲刪除name屬性相同的重複節點,保留重複節點中第一個錄入的節點,後面錄入的節點及其關係刪除;

實施步驟:

1. 查看庫中是否存在重複節點:

# 查詢節點總數
match (n:PERSON) return count(n)
# 查詢一個屬性的去重數量
match (n:PERSON) return count(distinct n.name)  # 比較總數和去重後總數可判斷是否存在相同name的節點

2. 獲取重複節點的詳細信息:

# 查詢返回name相同但是節點ID不同的節點,n與m即爲重複節點
match (n:PERSON),(m:PERSON) where n.name=m.name and id(n)<>id(m) return n,id(n),m,id(m);
# 比較重複節點的關係數量可只最先錄入的節點的關係最爲完整最多,後面錄入的節點會缺少部分關係
# 以上一查詢中返回的重複節點 id=12 和 id=460964 進行比較
match (n:PERSON)-[:FRIEND]-(m:PERSON) where id(n)=12 rerurn count(m);
match (n:PERSON)-[:FRIEND]-(m:PERSON) where id(n)=46096 rerurn count(m);

3. 獲取每條重複節點記錄中的id較大值,刪除該節點及節點所有關係:

match (n:PERSON)-[r:FRIEND]-(:PERSON) where id(n)=46096 delete n,r;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章