2016-10-24 106 views
0

我想在我的Neo4j數據庫修復了不正確的數據,我想有隻是一個暗號做更新,而不是數百萬行的轉移到自定義應用程序和背部。CQL - 如何在cypher中使用動態密鑰來設置Neo4j節點屬性?

我已經創建了一個使用動態密鑰通過標籤我各種類型的問題指定的所有節點上每個屬性搜索讀查詢 - 在這種情況下,不正確的序列化字符串。我遇到的問題是,在使用動態密鑰讀取查詢的偉大工程:

MATCH (n:xLabelNamex) 
WITH 
    n, 
    [x IN keys(n) 
     WHERE n[x] STARTS WITH "\"" 
     AND n[x] ENDS WITH "\"" 
    ] AS doesMatch 
WHERE size(doesMatch) > 0 
UNWIND doesMatch AS label 
    MATCH (m:xLabelNamex) 
    WHERE id(n)=id(m) 
    RETURN SUBSTRING(m[label], 1, SIZE(m[label]) - 2) 

但是如果我離開一切不變,並從

RETURN SUBSTRING(m[label], 1, SIZE(m[label]) - 2) 

最後一行更改爲:

SET m[label] = SUBSTRING(m[label], 1, length(m[label]) - 2) 

結果在誤差:

Invalid input '[': expected an identifier character, node labels, a property map, whitespace, a relationship pattern, '(', '.', '=' or "+=" (line 12, column 10 (offset: 255)) 
" SET m[label] = SUBSTRING(m[label], 1, SIZE(m[label]) - 2)" 
     ^

有沒有辦法做到這一點,或者我在這裏走錯了路?

看看關於Github的討論,我發現使用動態密鑰讀取節點的增加是在一年前添加的,但它看起來像是專門針對只讀。我開始挖掘Neo的來源,但這是一個巨獸。任何幫助,將不勝感激。

+0

AFAIK,你是正確的,書面形式向動態鍵控性能不Cypher支架原生支持。但是,'apoc'中有很多選項可以這麼做。 –

+0

Apoc看起來很棒,謝謝!這裏有很多功能,關於你認爲我應該開始在文檔中尋找我想要做什麼的任何指針? –

+0

我還沒有與它在一段時間的工作,但我相信你可以創建'apoc.map.fromPairs()'一個地圖,通過動態生成的密鑰,值對,然後'設置的M + = result'哪裏結果就是你所說的程序結果。如果你的項目不能阻止你使用貝塔斯,我會建議切換到3.1並獲得最新的APOC,它允許你調用'apoc.map'作爲一個函數,而不是一個過程。 –

回答

1

對於任何人在此之後,Tore建議 - APOC - 剛剛發佈了3.0.4.2版本,其中引入了「apoc.create.setProperty」,並且正是我所需要的。另外,我發現Neo4j中的正則表達式比直接文本搜索要快得多(快一個數量級),所以我也是這樣做的。

我最後的暗號出來是:

MATCH (n:xLabelNamex) 
WITH 
    n, 
    [x IN keys(n) 
     WHERE n[x] =~ '".*"' 
    ] AS doesMatch 
WHERE size(doesMatch) > 0 
UNWIND doesMatch AS label 
    MATCH (m:xLabelNamex) 
    WHERE id(n)=id(m) 
    CALL apoc.create.setProperty(m, label, SUBSTRING(m[label], 1, SIZE(m[label]) - 2)) 
    YIELD node 
RETURN node 

就像一個魅力。

道具撕毀,再次感謝您!

相關問題