如何通过Cypher中的属性名称字符串访问和改变节点属性值?

sma*_*man 9 reflection neo4j graph-databases cypher

我的目标是在cypher查询访问和改变节点的属性,其中要访问和变异的属性的名称是未知的字符串值.

例如,考虑一个命令:

查找包含两个属性的所有节点,以使第一个属性的名称为小写,后者的名称为前者的大写表示. 然后,使用小写字符串名称将属性的值传播到具有大写名称的属性的值.

特殊情况很简单:

MATCH ( node )
WHERE has(node.age) AND has(node.AGE) AND node.age <> node.AGE
SET node.AGE = node.age
RETURN node;
Run Code Online (Sandbox Code Playgroud)

但我似乎无法找到在单个请求中实现一般情况的方法.

具体来说,我无法:

  1. 使用字符串和值访问节点的属性
  2. 使用字符串和值来突变节点的属性

为了清楚起见,我将包括我处理一般情况的尝试.在我未能修改节点属性的情况下,我能够生成一个命令的密码,如果它在后续事务中执行,它将完成我的最终目标.

MERGE ( justToMakeSureOneExists { age: 14, AGE : 140 } ) WITH justToMakeSureOneExists 
MATCH (node) 
WHERE  ANY ( kx IN keys(node) WHERE kx = LOWER(kx) AND ANY ( ky in keys(node) WHERE ky = UPPER(kx) ) )
REMOVE node.name_conflicts // make sure results are current
FOREACH(kx in keys(node) | 
  SET node.name_conflicts 
        = COALESCE(node.name_conflicts,[]) 
        + CASE kx
          WHEN lower(kx)
          THEN []
               +  CASE WHEN any ( ky in keys(node) WHERE ky = upper(kx) )
                  THEN ['match (node) where id(node) = ' + id(node)+ ' and node.' + upper(kx) + ' <>  node.' + kx + '  set node.' + upper(kx) + ' = node.' + kx + ' return node;']
                  ELSE [] END
          ELSE []
          END )
RETURN node,keys(node)
Run Code Online (Sandbox Code Playgroud)

事后想法:看起来通过属性名称变异节点属性的能力似乎是一个非常普遍的要求,但缺乏对该功能的明显支持使我相信故意省略了该功能?如果确实不支持此功能,是否有任何文档可以解释为什么以及Neo/Cypher中的方法与推荐的处理方式之间是否存在冲突?

sma*_*man 2

看来所需的语言功能已以“动态属性”的名称添加到 Neo4j 2.3.0 中的 Cypher 中。2.3.0 版以上的 Cypher 文档将以下语法组声明为有效的 cypher 表达式:

动态属性:n["prop"], rel[n.city + n.zip], map[coll[0]].

此功能在2.3.0中有记录,但在之前的版本 (2.2.9)中不存在。

谢谢 Neo4j 团队!