我的目标是访问并改变密码查询中的节点的属性,其中要访问和突变的属性的名称是未知字符串值。如何通过Cypher中的属性名称字符串访问和更改节点属性值?
例如,考虑一个命令:
查找含有两个属性,使得所述第一属性的名称是小写和后者的名称的所有节点是大写表示的前者。 Then,将小写字符串名称的属性值传递给大写名称的属性值。
的特定情况下是很容易:
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中推荐的处理方式之间是否存在冲突?
是否可以使用非托管扩展来扩展默认密码处理? – smartcaveman
否。非托管扩展暴露为新的REST端点。 –
这就是我的想法......那么当你说要通过属性名称实现变异属性作为非托管扩展时,你究竟意味着什么? (REST api支持开箱即用) – smartcaveman