我有以下查询:
MATCH (u:User)
WHERE u.id = $userId
MERGE (p:Palette {name: $name})
ON CREATE
SET p.name = $name
SET p.id = apoc.create.uuid()
MERGE (u)-[cr:CREATED]->(p)
MERGE (u)-[sa:SAVED]->(p)
WITH p MATCH (p)-[in:INCLUDES]->()
DELETE in
WITH u MATCH (p:Palette)
WHERE (u)-[:SAVED]-() AND p.name = $name
FOREACH (color IN $colors |
MERGE (c:Color {hex: color.hex})
ON CREATE
SET c.hex = color.hex
MERGE (p)-[inc:INCLUDES]->(c)
直到DELETE in
,一切都按预期进行,然后什么也没发生。我得到以下错误:
Neo4j错误:输入"无效:应为")"CALL";"CREATE";"删除";"DETACH";"FOREACH";"LOAD";"MATCH";"合并";"ON";"可选的";"删除";"RETURN";"SET";"UNWIND";"USE";"WITH";
在DELETE statement
之后如何继续此查询?如果我将其分为两个查询(第一个查询以DELETE in
结尾),那么一切都可以按预期进行。
如果我理解正确,DELETE
之前的p
和之后的p
是一样的。如果是这种情况,请使用WITH
来保留您已经搜索过的项目。所以你可以试试:
MATCH (u:User)
WHERE u.id = $userId
MERGE (p:Palette {name: $name})
ON CREATE
SET p.name = $name
SET p.id = apoc.create.uuid()
MERGE (u)-[cr:CREATED]->(p)
MERGE (u)-[sa:SAVED]->(p)
WITH p, u MATCH (p)-[inc:INCLUDES]->()
WITH p, u, inc
DELETE inc
WITH p
FOREACH (color IN $colors |
MERGE (c:Color {hex: color.hex})
ON CREATE
SET c.hex = color.hex
MERGE (p)-[inc:INCLUDES]->(c)
我试过了:
MATCH (p:Palette)
WHERE p.name = "First test palette"
MATCH (p)-[inc:INCLUDES]->(c:Color)
WITH p, inc
DELETE inc
WITH p
MATCH (u)-[:SAVED]-(p)
RETURN u, p
关于此数据示例:
MERGE (e:User {name: "user"})
MERGE (a:Palette {name: "First test palette"})
MERGE (b:Color {hex: "#123123"})
MERGE (c:Color {hex: "#ffffff"})
MERGE (d:Color {hex: "#000000"})
MERGE (a)-[:INCLUDES]-(b)
MERGE (a)-[:INCLUDES]-(c)
MERGE (a)-[:INCLUDES]-(d)
MERGE (e)-[:SAVED]-(a)
它如预期的那样发挥了作用。