【发布时间】:2015-07-11 20:49:47
【问题描述】:
我的目标是在密码查询中访问和改变节点的属性,其中要访问和改变的属性的名称是未知字符串值。
例如,考虑一个命令:
查找包含两个属性的所有节点,使得第一个属性的名称是小写的,而后者的名称是前者的大写表示。 然后,将具有小写字符串名称的属性的值传播到具有大写名称的属性的值。
特殊情况很简单:
MATCH ( node )
WHERE has(node.age) AND has(node.AGE) AND node.age <> node.AGE
SET node.AGE = node.age
RETURN node;
但我似乎找不到在单个请求中实现一般情况的方法。
具体来说,我无法:
- 使用字符串和值访问节点的属性
- 用字符串和值改变节点的属性
为了清楚起见,我将尝试处理一般情况。在我未能修改节点属性的地方,我能够为一个命令生成密码,如果它在后续事务中执行,它将实现我的最终目标。
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)
事后思考: 似乎能够通过属性名称改变节点属性将是一个非常普遍的要求,但缺乏对该功能的明显支持让我相信该功能被省略了故意地?如果确实不支持此功能,是否有任何文档来解释原因以及该方法与 Neo/Cypher 中推荐的做事方式之间是否存在冲突?
【问题讨论】:
标签: reflection neo4j cypher graph-databases