从节点数组属性中删除重复项

时间:2015-11-04 03:31:26

标签: neo4j cypher

我的节点上有一个属性A,它包含一个字符串值数组:

n.A=["ABC","XYZ","123","ABC"]

在合并期间,我经常会编写类似于n.A = n.A + "New Value"的代码。我遇到的问题是我的数组中有重复的值;不是不可克服的,但我想避免它。

  • 如何编写一个cypher查询来删除数组A中的所有重复值?此时已经插入了一些重复项,我想要清理它们。
  • 在向现有数组添加新值时,如何确保仅保存具有不同值的数组副本? (最终可能与用于解决我的第一个问题的逻辑完全相同)

3 个答案:

答案 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)

可以有效地完成添加非重复值的查询(在此示例中,我假设提供了idnewValue参数):

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}值。