我正在尝试编写一个 Cypher 语句,它根据给定的项目标签名称列表来管理标签节点的创建和关系。
调用参数示例:
{
itemId: "foo",
tagNames: ["Tag1", "Tag2", "Tag3"]
}
这是 Cypher 声明:
MATCH (i:Item {id: $itemId})
OPTIONAL MATCH (i)-[previousRelations:hasTag]->(:Tag)
DELETE previousRelations
WITH *
CALL {
UNWIND $tagNames as tagName
MERGE (tag:Tag {name: tagName})
ON CREATE SET tag.id = randomUUID(), tag.createdAt = datetime()
RETURN tag
}
MERGE (i)-[:hasTag]->(tag)
RETURN i
标签节点的创建和分配工作一切正常!
我的问题在于RETURN i
如果我的$tagNames
列表为空([]
)的语句。在这种情况下,该语句返回NULL而不是,i
但我需要它始终返回i
。
我还尝试了此处建议的“FOREACH-Trick”: https: //stackoverflow.com/a/27578798/5106474
FOREACH(ignoreMe IN CASE WHEN tag IS NOT NULL THEN [1] ELSE [] END |
MERGE (i)-[:hasTag]->(tag)
)
但仍然是同样的行为。
在此先感谢您的任何建议!
这
RETURN tag
就是当 为空时将基数减少到零$tagNames
。要解决此问题,请将 包装CALL
在另一个中CALL
以保留第一个 MATCH 的基数: