如果数组中还没有值,则将其添加到数组中

问题描述 投票:0回答:3

如果数组尚不存在,我想将其添加到数组中。 到目前为止,我的代码看起来像这样(请注意,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

neo4j cypher
3个回答
7
投票

我猜你需要使用

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

2
投票

使用

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
)

0
投票

在 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 的所有元素(名称除外)的新列表。然后,附加名称。

© www.soinside.com 2019 - 2024. All rights reserved.