日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Neo4j:Cypher –删除重复的节点

發(fā)布時(shí)間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Neo4j:Cypher –删除重复的节点 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我最近在處理的圖上遇到問(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。