我有5个不同标签的节点,比如A, B, C, D, E
。我需要根据某些属性匹配每种类型的节点,并更新匹配节点的其他一些属性。
如果我执行5个不同的match and set
查询,每个标签类型一个查询,查询就可以正常运行。
但是,当我尝试在一个查询中执行所有操作时,该属性似乎会多次更新。我正在更新的属性是一个数组(相同的值多次添加到数组中)。以下是我尝试执行的查询:
match (a:A {a: "abc"})
match (A {a: "abc"})-[RELATED_TO*]-(b:B {b:"def"})
match (c:C {c: "lmn"})
match (d:D {d: "pqr"})
match (e:E {e: "xyz"})
set a.prop=a.prop+"123"
set b.prop=b.prop+"123"
set c.prop=c.prop+"123"
set d.prop=d.prop+"123"
set e.prop=e.prop+"123"
问题在于,当我执行上述查询时,属性数组prop
会多次添加123
。是因为我的match
语句的结果是多个,并且多次运行相同的set语句。如果是这种情况,有人可以建议我在单个查询中执行此操作的最佳方法。
我想在单个查询中执行此操作的原因是因为我使用Bolt协议从远程应用程序发送cypher查询,而且我不想发送5个不同的查询。
[编辑:添加一个简单的例子]
当我在此设置上运行上述查询,并假设属性prop
之前是一个空数组时,以下是运行查询后的属性值:
A.prop = ["123", "123", "123", "123", "123", "123", "123", "123"] // added 8 times
B.prop = ["123", "123", "123", "123", "123", "123", "123", "123"] // added 8 times
C.prop = ["123", "123", "123", "123"] // added 4 times
D.prop = ["123", "123", "123", "123"] // added 4 times
E.prop = ["123", "123", "123", "123"] // added 4 times
然而,期望的结果应该是:
A.prop = ["123"] // added 1 time
B.prop = ["123"] // added 1 time
C.prop = ["123"] // added 1 time
D.prop = ["123"] // added 1 time
E.prop = ["123"] // added 1 time
[编辑2]我发现了一个类似的问题here,但不是一个令人满意的答案。我相信从远程应用程序一次发送多个不相关的查询会比逐个发送它们更好(从应用程序的角度来看)