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

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

今天早些時候,Irfan和我在一個數(shù)據(jù)集上做實驗,運行了一些圖形算法的程序,結(jié)果節(jié)點上多了一些屬性,所以,現(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ù)這個命令就好,但是這個過程可有點痛苦啊----那么這個過程能自動化嗎?當(dāng)然可以,接下來我們就來看看如何自動化這個過程。

首先,我們需要將每個節(jié)點的屬性除了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庫中進行搜索。具體語句如下:

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

運行語句顯示下圖:?

我看到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é)點上還有哪些屬性:

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

哦耶,太好了。

雖然屬性刪除了,但是我還是想再優(yōu)化一下,看是否能夠不在每個節(jié)點上調(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é)點上的屬性時,上面的語句是可以正常工作的。但是在大型數(shù)據(jù)節(jié)點上去刪除屬性時,要怎么做呢?這時apoc.periodic.iterate是你最好的選擇。

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

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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容