2016-10-24 44 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 

就像一个魅力。

道具撕毁,再次感谢您!

相关问题