【问题标题】:How to access and mutate node property value by the property name string in Cypher?如何通过 Cypher 中的属性名称字符串访问和改变节点属性值?
【发布时间】: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;

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

具体来说,我无法:

  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 中推荐的做事方式之间是否存在冲突?

【问题讨论】:

    标签: reflection neo4j cypher graph-databases


    【解决方案1】:

    在 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 团队!

    【讨论】:

      【解决方案2】:

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

      作为一种解决方法,我建议将其实现到 unmanaged extension 中。

      【讨论】:

      • 是否可以使用非托管扩展扩展默认密码处理?
      • 这就是我的想法......所以当你说通过属性名称实现变异属性作为非托管扩展时,你的意思是什么? (REST api 支持开箱即用)
      • 您创建一个带有适当 JAX-RS 注释的 java 类以使其可访问,例如通过 POST 到 /myextension/fixProps。该方法的实现遍历所有节点,并使用 java api 如您在上面描述的那样修改属性。在这个级别上,您还可以轻松地选择合理的事务大小,大约为 10k - 50k 个单独的更改。
      • 我明白您的意思,但是,我的问题中的示例是对一个更复杂的问题的人为简化,该问题需要所描述的功能,而不是支持特定用例的扩展。
      猜你喜欢
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多