在Neo4j中刪除節(jié)點(diǎn)中多個屬性的方法

譯者言:本文介紹了如何批量刪除節(jié)點(diǎn)的屬性的方法次伶,重點(diǎn)介紹了apoc.create.removeProperties 函數(shù)的使用。

今天早些時候帆卓,Irfan和我在一個數(shù)據(jù)集上做實(shí)驗(yàn)巨朦,運(yùn)行了一些圖形算法的程序,結(jié)果節(jié)點(diǎn)上多了一些屬性剑令,所以糊啡,現(xiàn)在我要想辦法清理這些屬性。

現(xiàn)在的數(shù)據(jù)情況吁津,可以用下面的語句模擬出來:

CREATE (:Node {name: "Mark", pagerank: 2.302, louvain: 1, lpa: 4 })
CREATE (:Node {name: "Michael", degree: 23, triangles: 12, betweeness: 48.70 })
CREATE (:Node {name: "Ryan", eigenvector: 2.302, scc: 1, unionFind: 4 })

除了name屬性悔橄,其他都是算法生成的,我要怎樣才能刪除這些生成的屬性呢?

我可以一次刪除一個屬性癣疟,像下面這樣:

MATCH (n:Node)
REMOVE n.pagerank

對于其他要刪除的屬性只要重復(fù)這個命令就好挣柬,但是這個過程可有點(diǎn)痛苦啊----那么這個過程能自動化嗎?當(dāng)然可以睛挚,接下來我們就來看看如何自動化這個過程邪蛔。

首先,我們需要將每個節(jié)點(diǎn)的屬性除了name,都放到一個列表中扎狱。查詢語句如下:

neo4j> MATCH (n:Node)
WITH [k in keys(n) where not k in ["name"]] as keys
RETURN keys;
+---------------------------------------+
| keys |
+---------------------------------------+
| ["lpa", "pagerank", "louvain"] |
| ["betweeness", "degree", "triangles"] |
| ["unionFind", "eigenvector", "scc"] |
+---------------------------------------+

接下來我們再來嘗試刪除這些屬性侧到,這次我們的查詢語句這么寫:

neo4j> MATCH (n:Node)
WITH n, [k in keys(n) where not k in ["name"]] as keys
UNWIND keys AS key
REMOVE n[key];
Invalid input '[': expected an identifier character, whitespace, node labels, 'u/U', '{', 'o/O', a property map, a relationship pattern, '.' or '(' (line 4, column 9 (offset: 103))
"REMOVE n[key];"

啊偶~, 出錯了.....趕快看看APOC是不是有刪除的方法淤击,我也不知道APOC中有沒有相應(yīng)的方法匠抗,所以,我輸入“remove”在APOC庫中進(jìn)行搜索污抬。具體語句如下:

CALL dbms.procedures() YIELD name, signature, description
WHERE name starts with "apoc" and description contains "remove"
return name, signature, description

運(yùn)行語句顯示下圖:?

我看到apoc.create.removeProperties方法汞贸,應(yīng)該就是刪除屬性的,我們先來試一下:

neo4j> MATCH (n:Node)
WITH n, [k in keys(n) where not k in ["name"]] as keys
CALL apoc.create.removeProperties(n, keys) YIELD node
RETURN count(*);
+----------+
| count(*) |
+----------+
| 3 |
+----------+

我們再來看一下節(jié)點(diǎn)上還有哪些屬性:

neo4j> MATCH (n:Node)
RETURN keys(n) AS keys;
+----------+
| keys |
+----------+
| ["name"] |
| ["name"] |
| ["name"] |
+----------+

哦耶印机,太好了矢腻。

雖然屬性刪除了,但是我還是想再優(yōu)化一下射赛,看是否能夠不在每個節(jié)點(diǎn)上調(diào)用keys方法多柑,而直接傳一個除name之外的屬性列表。我們可以先通過下面的語句得到除name之外的所有屬性:

neo4j> CALL db.propertyKeys() YIELD propertyKey WHERE propertyKey <> 'name'
RETURN collect(propertyKey);
+-----------------------------------------------------------------------------------------+
| collect(propertyKey) |
+-----------------------------------------------------------------------------------------+
| ["degree", "pagerank", "louvain", "lpa", "triangles", "betweeness", "scc", "unionFind"] |
+-----------------------------------------------------------------------------------------+

如果我要把那個屬性列表傳到apoc.create.removeProperties中楣责,只要像下面這樣就可以了:

CALL db.propertyKeys() YIELD propertyKey WHERE propertyKey <> 'name'
WITH collect(propertyKey) AS properties
MATCH (n:Node)
WITH collect(n) AS nodes, properties
CALL apoc.create.removeProperties(nodes, properties)
YIELD node
RETURN count(*)

更多的數(shù)據(jù)

刪除小規(guī)模數(shù)據(jù)節(jié)點(diǎn)上的屬性時竣灌,上面的語句是可以正常工作的。但是在大型數(shù)據(jù)節(jié)點(diǎn)上去刪除屬性時秆麸,要怎么做呢帐偎?這時apoc.periodic.iterate是你最好的選擇。

下面我們先來創(chuàng)建100萬個準(zhǔn)備刪除屬性的節(jié)點(diǎn):

CALL apoc.periodic.iterate(
"UNWIND range(0, 1000000) AS id RETURN id",
"CREATE (:Node {name: 'name-' + id, pagerank: 2.302, louvain: 1, lpa: 4 })", {})

現(xiàn)在我們稍微修改一下前面的刪除語句蛔屹,將刪除除name之外的所有屬性:

neo4j> CALL db.propertyKeys() YIELD propertyKey WHERE propertyKey <> 'name'
WITH collect(propertyKey) AS properties
CALL apoc.periodic.iterate(
"MATCH (n:Node) RETURN n",
"WITH collect(n) AS nodes
CALL apoc.create.removeProperties(nodes, $properties)
YIELD node
RETURN count(*)",
{params: {properties: properties}})
YIELD batches
RETURN batches;
+---------+
| batches |
+---------+
| 101 |
+---------+

最后削樊,我們再來確認(rèn)一下,所有屬性是否都刪除了兔毒?

neo4j> MATCH (n:Node)
RETURN keys(n), count(*);
+---------------------+
| keys(n) | count(*) |
+---------------------+
| ["name"] | 1000001 |
+---------------------+

OK,完美漫贞!

原文鏈接: https://markhneedham.com/blog/2019/03/14/neo4j-delete-dynamic-properties/

譯者言:最后歡迎各位同行留言交流譯文中的不足。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末育叁,一起剝皮案震驚了整個濱河市迅脐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌豪嗽,老刑警劉巖谴蔑,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豌骏,死亡現(xiàn)場離奇詭異,居然都是意外死亡隐锭,警方通過查閱死者的電腦和手機(jī)窃躲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钦睡,“玉大人蒂窒,你說我怎么就攤上這事≤衽” “怎么了洒琢?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長褐桌。 經(jīng)常有香客問我衰抑,道長,這世上最難降的妖魔是什么荧嵌? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任呛踊,我火速辦了婚禮,結(jié)果婚禮上完丽,老公的妹妹穿的比我還像新娘恋技。我一直安慰自己拇舀,他們只是感情好逻族,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骄崩,像睡著了一般聘鳞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上要拂,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天抠璃,我揣著相機(jī)與錄音,去河邊找鬼脱惰。 笑死搏嗡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拉一。 我是一名探鬼主播采盒,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔚润!你這毒婦竟也來了磅氨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嫡纠,失蹤者是張志新(化名)和其女友劉穎烦租,沒想到半個月后延赌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叉橱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年挫以,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赏迟。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡屡贺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锌杀,到底是詐尸還是另有隱情甩栈,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布糕再,位于F島的核電站量没,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏突想。R本人自食惡果不足惜殴蹄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猾担。 院中可真熱鬧袭灯,春花似錦、人聲如沸绑嘹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽工腋。三九已至姨丈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擅腰,已是汗流浹背蟋恬。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趁冈,地道東北人歼争。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像渗勘,于是被迫代替她去往敵國和親沐绒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時呀邢,會觸發(fā)此異常洒沦。 O...
    我想起個好名字閱讀 5,249評論 0 9
  • ??DOM(文檔對象模型)是針對 HTML 和 XML 文檔的一個 API(應(yīng)用程序編程接口)申眼。 ??DOM 描繪...
    霜天曉閱讀 3,619評論 0 7
  • 概要 64學(xué)時 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,125評論 0 3
  • 一瞒津、Python簡介和環(huán)境搭建以及pip的安裝 4課時實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,723評論 0 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,090評論 1 32