我正在尝试编写一个查询,该查询应该从一个节点创建,更新和/或删除几个不同的关系。我当前的工作查询如下:
MATCH (myNode:MY_NODE {myId: $nodeId})
OPTIONAL MATCH (myNode)-[r:RELATED_TO]->(n)
WHERE NOT n.nodeId IN $relatedIds
WITH myNode, r
DELETE r
WITH myNode
OPTIONAL MATCH (n)
WHERE n.nodeId IN $relatedIds
FOREACH(_ IN CASE WHEN n IS NOT NULL THEN [1] ELSE [] END |
MERGE (myNode)-[:RELATED_TO]->(n)
)
... // Updates to other relations
此处有OPTIONAL
和FOREACH
子句,用于处理带有空ID列表的情况,该列表仍然有效。这里的问题是,如果$relatedIds
包含一个在任何节点中都不存在的ID,它将被忽略。我希望无效的ID无需任何写操作即可退出查询。
我可以使用以下方法验证所有ID:
...
UNWIND $relatedIds AS relatedId
MATCH (n {nodeId: relatedId})
...
但这不能处理空列表。
我想要的基本上是:
...
FOREACH(_ IN CASE WHEN ANY($relatedIds) THEN [1] ELSE [] END |
UNWIND $relatedIds AS relatedId
MATCH (n {nodeId: relatedId})
)
...
但这是Neo.ClientError.Statement.SyntaxError: Invalid use of UNWIND inside FOREACH
的结果。
是否有一种方法可以在单个查询中实现此目的,或者我必须将其拆分为单独的查询以进行验证和更新?