我想在单个查询中更新多个节点。我有一个问题,标签更新。
WITH [
{
code: "AAA",
secondprop: "val1",
labels: [
"label1",
"label2"
]
},
{
code: "BBB",
secondprop: "val2",
labels: [
"label3",
"label4"
]
}
] as batch
UNWIND batch as row
MERGE (n:EI:EI_CURRENT{code: row.code})
ON CREATE SET n={uuid: apoc.create.uuid()}
SET n += row
WITH n as nn, apoc.text.join(row.labels,':') as labels
SET nn:labels
REMOVE nn.labels
return nn;
在附加查询中,我使用了某种解决方法-我为每个节点添加标签作为属性labels
的值,然后我试图通过apoc
语句连接它们并设置为节点。
不幸的是,这个查询只为批处理中的每个节点设置一个名为labels
的标签…
我也尝试使用CALL apoc.create.setLabels(nn, nn.labels)
,但此语句覆盖标签,而不是扩展它们(我不知道什么标签目前在节点更新,但我绝对不想覆盖它们)
是否有办法分别更新每个节点的标签?
用apoc.create.addLabels
代替apoc.create.setLabels
:
WITH [
{
code: "AAA",
secondprop: "val1",
labels: [
"label1",
"label2"
]
},
{
code: "BBB",
secondprop: "val2",
labels: [
"label3",
"label4"
]
}
] as batch
UNWIND batch as row
MERGE (n:EI:EI_CURRENT{code: row.code})
ON CREATE SET n={uuid: apoc.create.uuid()}
SET n += row
WITH n as nn, apoc.text.join(row.labels,':') as labels
CALL apoc.create.addLabels(nn, [labels]) YIELD node return node
我用下面的查询解决了这个问题:
CALL apoc.create.setLabels(nn, labels(nn) + nn.labels)
我们只需要将已经存在的标签(labels(nn)
)与新创建的批处理标签合并。