CQL - 如何在cypher中使用动态密钥设置Neo4j节点属性?

时间:2016-10-24 01:06:56

标签: neo4j cypher cql

我正在尝试在我的Neo4j数据库中修复不正确的数据,并且我想只有一个密码来进行更新,而不是将数百万行传输到自定义应用程序并返回。

我创建了一个Read查询,它使用动态密钥搜索我为各种类型的问题指定的标签的所有节点上的每个属性 - 在这种情况下,是一个错误的序列化字符串。我遇到的问题是,使用动态密钥的Read查询效果很好:

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的来源,但这是一个庞然大物。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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

像魅力一样。

道具转向Tore,再次感谢你!