如何遍历嵌套的json数组并根据条件更改节点属性?

时间:2019-04-06 10:41:19

标签: json foreach neo4j cypher

我想根据条件为现有节点创建新属性。更具体地说,当节点属性与嵌套JSON数组中的属性匹配时,我想创建一个新的节点属性。我的json结构看起来像这样:

{"some tasks":[
        {"id":1,"name":"John Doe"},
        {"id":2,"name":"Jane Doe"}
    ],
 "some links":[
        {"id":1,"type":"cartoon"}
        {"id":2,"type":"anime"}
    ]
}

我已经创建了具有任务属性的节点-现在,我想遍历链接部分并在ID匹配时更新节点的属性。我尝试像这样使用foreach-

call apoc.load.json("file:///precedence.json")yield value as line
foreach(link in line.link| match (n) where n.id=link.source)
return n

返回错误-

Neo.ClientError.Statement.SyntaxError: Invalid use of MATCH inside FOREACH (line 2, column 28 (offset: 93))
"foreach(link in line.link| match (n) where n.id=link.source)"

那我如何在foreach中检查这种情况?

1 个答案:

答案 0 :(得分:1)

您不能在FOREACH中使用MATCH,它只允许更新子句。

相反,您可以UNWIND将列表重新排成行(列表中每个条目将有一行),然后可以根据需要进行MATCH和SET。

我还强烈建议您在查询中使用标签,并确保您在label和id属性中具有索引以进行快速查找。对于本示例,我将使用:Node作为标签(因此对于本示例,索引将具有:Node(id)):

CALL apoc.load.json("file:///precedence.json") yield value as line
UNWIND line.link as link
MATCH (n:Node)
WHERE n.id = link.source
SET n.type = link.type