如果列表不为空,则匹配列表中的所有值

时间:2019-05-22 09:57:52

标签: neo4j cypher

我正在尝试编写一个查询,该查询应该从一个节点创建,更新和/或删除几个不同的关系。我当前的工作查询如下:

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

此处有OPTIONALFOREACH子句,用于处理带有空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的结果。

是否有一种方法可以在单个查询中实现此目的,或者我必须将其拆分为单独的查询以进行验证和更新?

0 个答案:

没有答案