是否可以为在UNWIND期间创建的每个节点动态设置变量节点名称?

时间:2019-03-01 11:09:47

标签: neo4j

假设我有一个称为节点的参数:

"nodes": [
    {
      "name": "John",
      "age": 18.0,
      "label": "Person",
      "labeledName": "Unit1"
    },
    {
      "name": "Phill",
      "age": 23.0,
      "label": "Animal",
      "labeledName": "Unit2"
    }
  ]

我想展开该参数,并为每个映射列出的属性-值对创建一个节点。然而,  稍后,我需要在查询中重用其中的一些节点,因此需要为每个节点设置一个变量。  另外,我想动态设置此变量(以便没有两个节点具有相同的名称)。变量名将  是“ labeledName”属性的值。

本质上,对于上面列出的节点,我需要这样做:

  

创建(Unit1:Person {name:'John',age:'18'})

     

创建(Unit2:Animal {name:'Phill',age:'23'})

将UNWIND用于同一事物时,有两个我无法解决的问题:

  1. 我无法为每个节点设置变量名称
  2. 我无法在省略“标签”时设置属性“名称”和“年龄”(因为它仅用作节点标签)并且 “ labeledName”

    这意味着类似的东西不起作用:

  

UNWIND {nodes}作为节点WITH节点,node.label AS标签,   node.labeledName AS variableName CREATE(variableName:label)SET   variableName + =节点    //以某种方式让它知道不要设置'label'   和'labeledName'属性

这是我卡住的地方。使用node.labeledName AS variableName不起作用(但是使用node.label AS标签却可以)

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

因此,首先,您不能动态分配变量名,这在Cypher中是不可能的。

但是...使用APOC过程,您可以创建一个字符串名称(您的labeledName)到您创建的节点的映射,然后在该映射中进行动态查找以获取您的节点。

此外,您无法使用Cypher动态设置标签,但是同样,我们可以使用APOC程序来做到这一点。

我们可以再次使用APOC从输入映射中删除属性,以设置属性。

这是一个例子。请注意,您不能在地图中使用带引号的字符串键,因此我将其删除:

UNWIND [
    {
      name: "John",
      age: 18.0,
      label: "Person",
      labeledName: "Unit1"
    },
    {
      name: "Phill",
      age: 23.0,
      label: "Animal",
      labeledName: "Unit2"
    }
  ] as input // though you would typically pass this as a map parameter
CREATE (n)
WITH input, n
CALL apoc.create.addLabels(n, [input.label]) YIELD node
SET n += apoc.map.removeKeys(input, ['label', 'labeledName'])
WITH collect([input.labeledName, n]) as pairs
WITH apoc.map.fromPairs(pairs) as mapping
...

有了该映射,您可以通过键查找值:mapping['Unit2']将为您提供相应的节点,并且您传递的字符串可以从字符串变量中动态获得。