假设我有一个称为节点的参数:
"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用于同一事物时,有两个我无法解决的问题:
我无法在省略“标签”时设置属性“名称”和“年龄”(因为它仅用作节点标签)并且 “ 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标签却可以)
非常感谢您的帮助!
答案 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']
将为您提供相应的节点,并且您传递的字符串可以从字符串变量中动态获得。