Cypher(使用bolt)一次多个不相关的查询 - 在单个查询中匹配和修改(设置属性)多个节点

时间:2016-06-30 00:12:34

标签: neo4j cypher

我有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个不同的查询。

[编辑:添加一个简单的例子]

考虑以下数据库中所有5个节点的简单排列: enter image description here

当我在此设置上运行上述查询,并假设属性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,但不是一个令人满意的答案。我相信从远程应用程序一次发送多个不相关的查询会比逐个发送它们更好(从应用程序的角度来看)

0 个答案:

没有答案