如果数组尚不存在,我想将其添加到数组中。 到目前为止,我的代码看起来像这样(请注意,r.names 和 {name} 都是数组,并且
[1] + [2] = [1,2]
):
MERGE (r:resource {hash:{hash}})
ON CREATE SET r.names = {name}
ON MATCH SET r.names = r.names + {name}
但显然如果
{name}
已经在 r.names
中,它就会再次添加。仅当 {name}
尚未包含时,如何添加 r.names
?
我猜你需要使用
FOREACH
+ CASE WHEN
技巧:使用 case when
你可以使用 1 元素数组(如果你的条件为真)或 0 元素数组,否则作为 FOREACH
中使用的迭代器。 FOREACH
不能在 ON MATCH
或 ON CREATE
处理程序中使用,因此我们将其放在 MERGE
之后,并使用 coalesce
来覆盖 r.names 尚不存在时的情况:
MERGE (r:Resource {hash:{hash}})
FOREACH(x in CASE WHEN {name} in r.names THEN [] ELSE [1] END |
SET r.names = coalesce(r.names,[]) + {name}
)
RETURN r.names
FILTER
获取 r.names
中尚不存在的元素数组并添加它们:
MERGE (r:resource {hash:{hash}})
ON CREATE SET r.names = {new_names}
ON MATCH SET r.names = r.names + FILTER(
el FOR el in {new_names} IF NOT el IN r.names
)
在 Neo4j 的最新版本(从 v5.12 开始)中,FILTER() 已被弃用。相反,使用列表理解来返回原始列表+新元素,方法是有意删除新元素(如果已存在)。使用以下内容,其中名称为字符串类型:
MERGE (r:resource {hash:{hash}})
ON CREATE SET r.names = [name]
ON MATCH SET r.names = [name in r.names where name <> name] + [name]
如果 r 是由 merge() 创建的,则此查询将初始化一个新列表为 r.names,否则它将创建一个包含 r.names 的所有元素(名称除外)的新列表。然后,附加名称。