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

CQL - How to set Neo4j node property using a dynamic key in 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 的源代码,但它是一个庞然大物。如有任何帮助,我们将不胜感激。

对于在此之后加入的任何人,图书馆 Tore 建议 - APOC - 刚刚发布了引入 "apoc.create.setProperty" 的 3.0.4.2 版本,并且完全满足我的需要。此外,我发现 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

很有魅力。

托雷的道具,再次感谢!