2015-05-01 36 views
9

我的目标是访问并改变密码查询中的节点的属性,其中要访问和突变的属性的名称是未知字符串值。如何通过Cypher中的属性名称字符串访问和更改节点属性值?

例如,考虑一个命令:

查找含有两个属性,使得所述第一属性的名称是小写和后者的名称的所有节点是大写表示的前者。 Then,将小写字符串名称的属性值传递给大写名称的属性值。

的特定情况下是很容易:

MATCH (node) 
WHERE has(node.age) AND has(node.AGE) AND node.age <> node.AGE 
SET node.AGE = node.age 
RETURN node; 

但我似乎无法找到一种方法来实现单个请求的一般情况。

具体来说,我不能:

  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) 

有感:好像变异按属性名称的节点属性将是一个非常常见的需求的能力,但对于功能缺乏明显的支持,使我相信该功能是故意省略?如果此功能确实不受支持,是否有任何文档解释为什么以及该方法与Neo/Cypher中推荐的处理方式之间是否存在冲突?

回答

0

看来,在Neo4j 2.3.0中,名为“动态属性”的Cypher中添加了所需的语言功能。从版本2.3.0式Cypher支架文档声明的语法如下基团作为有效暗号表达式:

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

此功能记录为2.3.0,但缺席previous version (2.2.9)

谢谢Neo4j团队!

3

有关Cypher动态属性访问的改进支持的讨论正在进行中。我非常有信心,我们将来会看到对此的支持,但我无法对目标版本和日期发表评论。

作为解决方法,我建议将其实施到unmanaged extension

+0

是否可以使用非托管扩展来扩展默认密码处理? – smartcaveman

+0

否。非托管扩展暴露为新的REST端点。 –

+0

这就是我的想法......那么当你说要通过属性名称实现变异属性作为非托管扩展时,你究竟意味着什么? (REST api支持开箱即用) – smartcaveman

相关问题