gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:25:17 25 4
gpt4 key购买 nike

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

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

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

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

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

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

在使用 UNWIND 处理同一件事时,有两个问题我无法解决:

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

    这意味着这样的事情是行不通的:

UNWIND {nodes} as node WITH node, node.label AS label, node.labeledName AS variableName CREATE (variableName:label) SET variableName += node // somehow need to let it know NOT to set 'label' and 'labeledName' properties

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

非常感谢任何帮助!

最佳答案

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

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

此外,您不能使用 Cypher 动态设置标签,但我们可以再次使用 APOC 程序来执行此操作。

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

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

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']将为您提供相应的节点,您传递的字符串可以是来自字符串变量的动态字符串。

关于neo4j - 是否可以为在 UNWIND 期间创建的每个节点动态设置可变节点名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54943428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com