我的节点上有一个属性A
,它包含一个字符串值数组:
n.A=["ABC","XYZ","123","ABC"]
在合并期间,我经常会编写类似于n.A = n.A + "New Value"
的代码。我遇到的问题是我的数组中有重复的值;不是不可克服的,但我想避免它。
A
中的所有重复值?此时已经插入了一些重复项,我想要清理它们。答案 0 :(得分:2)
将UNWIND上的部分信息与其他问题排查相结合,并提出了以下Cypher查询,以便从现有数组属性中删除重复项。
match (n)
unwind n.system as x
with distinct x, n
with collect(x) as set, n
set n.system = set
答案 1 :(得分:2)
清理现有重复项后,可以在添加新值时使用此项:
match (n)
set n.A = filter (x in n.A where x<>"newValue") + "newValue"
答案 2 :(得分:2)
可以有效地完成添加非重复值的查询(在此示例中,我假设提供了id
和newValue
参数):
OPTIONAL MATCH (n {id: {id}})
WHERE NONE(x IN n.A WHERE x = {newValue})
SET n.A = n.A + {newValue};
此查询不会创建临时数组,并且只会更改n.A
数组(如果它尚未包含{newValue}字符串。
[EDITED]
如果您希望(a)创建n
节点(如果该节点尚不存在),并且(b)仅在{newValue}
不是n.A
时才{}向{newValue}
追加n.A
已经在OPTIONAL MATCH (n { id: {id} })
FOREACH (x IN (
CASE WHEN n IS NULL THEN [1] ELSE [] END ) |
CREATE ({ id: {id}, A: [{newValue}]}))
WITH n, CASE WHEN EXISTS(n.A) THEN n.A ELSE [] END AS nA
WHERE NONE (x IN nA WHERE x = {newValue})
SET n.A = nA + {newValue};
,这应该有效:
OPTIONAL MATCH
如果FOREACH
失败,则{id}
子句将创建一个新节点节点(包含{newValue}
和一个包含SET
的数组),以及以下{{ 1}}子句将不执行任何操作,因为n
将为NULL。
如果OPTIONAL MATCH
成功,则FOREACH
子句将不执行任何操作,并且以下SET
子句会将{newValue}
附加到n.A
iff n.A
中尚未存在。如果应该执行SET
,但现有节点还没有n.A
属性,那么查询会将空数组连接到{newValue}
(从而生成一个只包含{{{1}的数组1}})并将其设置为{newValue}
值。