Neo4j:Cypher –删除重复的节点
我最近在處理的圖上遇到問題,因為我沒有應用任何唯一的約束 ,我設法創(chuàng)建了重復的節(jié)點。
我想刪除重復項,并遇到了吉米·魯茨(Jimmy Ruts)的精彩文章 ,其中顯示了一些方法。
讓我們首先創(chuàng)建一個包含一些重復節(jié)點的圖形:
UNWIND range(0, 100) AS id CREATE (p1:Person {id: toInteger(rand() * id)}) MERGE (p2:Person {id: toInteger(rand() * id)}) MERGE (p3:Person {id: toInteger(rand() * id)}) MERGE (p4:Person {id: toInteger(rand() * id)}) CREATE (p1)-[:KNOWS]->(p2) CREATE (p1)-[:KNOWS]->(p3) CREATE (p1)-[:KNOWS]->(p4)Added 173 labels, created 173 nodes, set 173 properties, created 5829 relationships, completed after 408 ms.我們如何找到重復的節(jié)點?
MATCH (p:Person) WITH p.id as id, collect(p) AS nodes WHERE size(nodes) > 1 RETURN [ n in nodes | n.id] AS ids, size(nodes) ORDER BY size(nodes) DESC LIMIT 10╒══════════════════════╤═════════════╕ │"ids" │"size(nodes)"│ ╞══════════════════════╪═════════════╡ │[1,1,1,1,1,1,1,1] │8 │ ├──────────────────────┼─────────────┤ │[0,0,0,0,0,0,0,0] │8 │ ├──────────────────────┼─────────────┤ │[17,17,17,17,17,17,17]│7 │ ├──────────────────────┼─────────────┤ │[4,4,4,4,4,4,4] │7 │ ├──────────────────────┼─────────────┤ │[2,2,2,2,2,2] │6 │ ├──────────────────────┼─────────────┤ │[5,5,5,5,5,5] │6 │ ├──────────────────────┼─────────────┤ │[19,19,19,19,19,19] │6 │ ├──────────────────────┼─────────────┤ │[11,11,11,11,11] │5 │ ├──────────────────────┼─────────────┤ │[25,25,25,25,25] │5 │ ├──────────────────────┼─────────────┤ │[43,43,43,43,43] │5 │ └──────────────────────┴─────────────┘讓我們放大所有具有“ id:1”的人,并計算出他們有多少關系。 我們的計劃是保持連接最多的節(jié)點,并擺脫其他節(jié)點。
MATCH (p:Person) WITH p.id as id, collect(p) AS nodes WHERE size(nodes) > 1 WITH nodes ORDER BY size(nodes) DESC LIMIT 1 UNWIND nodes AS n RETURN n.id, id(n) AS internalId, size((n)--()) AS rels ORDER BY rels DESC╒══════╤════════════╤══════╕ │"n.id"│"internalId"│"rels"│ ╞══════╪════════════╪══════╡ │1 │175 │1284 │ ├──────┼────────────┼──────┤ │1 │184 │721 │ ├──────┼────────────┼──────┤ │1 │180 │580 │ ├──────┼────────────┼──────┤ │1 │2 │391 │ ├──────┼────────────┼──────┤ │1 │195 │361 │ ├──────┼────────────┼──────┤ │1 │199 │352 │ ├──────┼────────────┼──────┤ │1 │302 │5 │ ├──────┼────────────┼──────┤ │1 │306 │1 │ └──────┴────────────┴──────┘因此,在此示例中,我們要保留具有210個關系的節(jié)點并刪除其余的關系。
為了使事情變得容易,我們需要基數最大的節(jié)點在列表中排在第一或最后。 我們可以通過在對節(jié)點進行分組之前對節(jié)點進行排序來確保確實如此。
MATCH (p:Person) WITH p ORDER BY p.id, size((p)--()) DESC WITH p.id as id, collect(p) AS nodes WHERE size(nodes) > 1 RETURN [ n in nodes | {id: n.id,rels: size((n)--()) } ] AS ids, size(nodes) ORDER BY size(nodes) DESC LIMIT 10╒══════════════════════════════════════════════════════════════════════╤═════════════╕ │"ids" │"size(nodes)"│ ╞══════════════════════════════════════════════════════════════════════╪═════════════╡ │[{"id":1,"rels":1284},{"id":1,"rels":721},{"id":1,"rels":580},{"id":1,│8 │ │"rels":391},{"id":1,"rels":361},{"id":1,"rels":352},{"id":1,"rels":5},│ │ │{"id":1,"rels":1}] │ │ ├──────────────────────────────────────────────────────────────────────┼─────────────┤ │[{"id":0,"rels":2064},{"id":0,"rels":2059},{"id":0,"rels":1297},{"id":│8 │ │0,"rels":1124},{"id":0,"rels":995},{"id":0,"rels":928},{"id":0,"rels":│ │ │730},{"id":0,"rels":702}] │ │ ├──────────────────────────────────────────────────────────────────────┼─────────────┤ │[{"id":17,"rels":153},{"id":17,"rels":105},{"id":17,"rels":81},{"id":1│7 │ │7,"rels":31},{"id":17,"rels":15},{"id":17,"rels":14},{"id":17,"rels":1│ │ │}] │ │ ├──────────────────────────────────────────────────────────────────────┼─────────────┤ │[{"id":4,"rels":394},{"id":4,"rels":320},{"id":4,"rels":250},{"id":4,"│7 │ │rels":201},{"id":4,"rels":162},{"id":4,"rels":162},{"id":4,"rels":14}]│ │ ├──────────────────────────────────────────────────────────────────────┼─────────────┤ │[{"id":2,"rels":514},{"id":2,"rels":329},{"id":2,"rels":318},{"id":2,"│6 │ │rels":241},{"id":2,"rels":240},{"id":2,"rels":2}] │ │ ├──────────────────────────────────────────────────────────────────────┼─────────────┤ │[{"id":5,"rels":487},{"id":5,"rels":378},{"id":5,"rels":242},{"id":5,"│6 │ │rels":181},{"id":5,"rels":158},{"id":5,"rels":8}] │ │ ├──────────────────────────────────────────────────────────────────────┼─────────────┤ │[{"id":19,"rels":153},{"id":19,"rels":120},{"id":19,"rels":84},{"id":1│6 │ │9,"rels":53},{"id":19,"rels":45},{"id":19,"rels":1}] │ │ ├──────────────────────────────────────────────────────────────────────┼─────────────┤ │[{"id":11,"rels":222},{"id":11,"rels":192},{"id":11,"rels":172},{"id":│5 │ │11,"rels":152},{"id":11,"rels":89}] │ │ ├──────────────────────────────────────────────────────────────────────┼─────────────┤ │[{"id":25,"rels":133},{"id":25,"rels":107},{"id":25,"rels":98},{"id":2│5 │ │5,"rels":15},{"id":25,"rels":2}] │ │ ├──────────────────────────────────────────────────────────────────────┼─────────────┤ │[{"id":43,"rels":92},{"id":43,"rels":85},{"id":43,"rels":9},{"id":43,"│5 │ │rels":5},{"id":43,"rels":1}] │ │ └──────────────────────────────────────────────────────────────────────┴─────────────┘現在是時候刪除重復項了:
MATCH (p:Person) WITH p ORDER BY p.id, size((p)--()) DESC WITH p.id as id, collect(p) AS nodes WHERE size(nodes) > 1 UNWIND nodes[1..] AS n DETACH DELETE nDeleted 143 nodes, deleted 13806 relationships, completed after 29 ms.現在,如果我們運行重復的查詢:
MATCH (p:Person) WITH p.id as id, collect(p) AS nodes WHERE size(nodes) > 1 RETURN [ n in nodes | n.id] AS ids, size(nodes) ORDER BY size(nodes) DESC LIMIT 10(no changes, no records)如果我們刪除WHERE子句怎么辦?
MATCH (p:Person) WITH p.id as id, collect(p) AS nodes RETURN [ n in nodes | n.id] AS ids, size(nodes) ORDER BY size(nodes) DESC LIMIT 10╒═════╤═════════════╕ │"ids"│"size(nodes)"│ ╞═════╪═════════════╡ │[23] │1 │ ├─────┼─────────────┤ │[86] │1 │ ├─────┼─────────────┤ │[77] │1 │ ├─────┼─────────────┤ │[59] │1 │ ├─────┼─────────────┤ │[50] │1 │ ├─────┼─────────────┤ │[32] │1 │ ├─────┼─────────────┤ │[41] │1 │ ├─────┼─────────────┤ │[53] │1 │ ├─────┼─────────────┤ │[44] │1 │ ├─────┼─────────────┤ │[8] │1 │ └─────┴─────────────┘賀拉,不再重復! 最后,讓我們檢查一下是否保留了我們希望保留的節(jié)點。 我們期望它的“ internalId”為175:
MATCH (p:Person {id: 1}) RETURN size((p)--()), id(p) AS internalId╒═══════════════╤════════════╕ │"size((p)--())"│"internalId"│ ╞═══════════════╪════════════╡ │242 │175 │ └───────────────┴────────────┘哪有! 關系比以前少了很多,因為這些關系中有很多是要復制我們現在已刪除的節(jié)點。
如果我們想更進一步,可以將重復節(jié)點的關系“合并”到我們保留的節(jié)點上,但這是另一篇文章!
翻譯自: https://www.javacodegeeks.com/2017/10/neo4j-cypher-deleting-duplicate-nodes.html
總結
以上是生活随笔為你收集整理的Neo4j:Cypher –删除重复的节点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux端口访问记录(linux端口访
- 下一篇: 安卓原生系统(安卓原声)