Neo4j:Cypher –删除重复的节点
我最近在處理的圖上遇到問(wèn)題,因?yàn)槲覜](méi)有應(yīng)用任何唯一的約束 ,我設(shè)法創(chuàng)建了重復(fù)的節(jié)點(diǎn)。
我想刪除重復(fù)項(xiàng),并遇到了吉米·魯茨(Jimmy Ruts)的精彩文章 ,其中顯示了一些方法。
讓我們首先創(chuàng)建一個(gè)包含一些重復(fù)節(jié)點(diǎn)的圖形:
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.我們?nèi)绾握业街貜?fù)的節(jié)點(diǎn)?
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”的人,并計(jì)算出他們有多少關(guān)系。 我們的計(jì)劃是保持連接最多的節(jié)點(diǎn),并擺脫其他節(jié)點(diǎn)。
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個(gè)關(guān)系的節(jié)點(diǎn)并刪除其余的關(guān)系。
為了使事情變得容易,我們需要基數(shù)最大的節(jié)點(diǎn)在列表中排在第一或最后。 我們可以通過(guò)在對(duì)節(jié)點(diǎn)進(jìn)行分組之前對(duì)節(jié)點(diǎn)進(jìn)行排序來(lái)確保確實(shí)如此。
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}] │ │ └──────────────────────────────────────────────────────────────────────┴─────────────┘現(xiàn)在是時(shí)候刪除重復(fù)項(xiàng)了:
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.現(xiàn)在,如果我們運(yùn)行重復(fù)的查詢(xún):
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 │ └─────┴─────────────┘賀拉,不再重復(fù)! 最后,讓我們檢查一下是否保留了我們希望保留的節(jié)點(diǎn)。 我們期望它的“ internalId”為175:
MATCH (p:Person {id: 1}) RETURN size((p)--()), id(p) AS internalId╒═══════════════╤════════════╕ │"size((p)--())"│"internalId"│ ╞═══════════════╪════════════╡ │242 │175 │ └───────────────┴────────────┘哪有! 關(guān)系比以前少了很多,因?yàn)檫@些關(guān)系中有很多是要復(fù)制我們現(xiàn)在已刪除的節(jié)點(diǎn)。
如果我們想更進(jìn)一步,可以將重復(fù)節(jié)點(diǎn)的關(guān)系“合并”到我們保留的節(jié)點(diǎn)上,但這是另一篇文章!
翻譯自: https://www.javacodegeeks.com/2017/10/neo4j-cypher-deleting-duplicate-nodes.html
總結(jié)
以上是生活随笔為你收集整理的Neo4j:Cypher –删除重复的节点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux端口访问记录(linux端口访
- 下一篇: 安卓原生系统(安卓原声)