0

我是 neo4j 的新手,遇到 MERGE 子句的问题。我有一个方法来做这样的查询:

def upsert (idValue, valueField1):
   query = "MERGE (n:Node {id: '" + idValue+ "'}) "
   query += "ON MATCH SET n.field1= n.field1+ " + str(valueField1) + " "
   query += "ON CREATE SET n = {id: '" + idValue + "', field1: 0} "
   return db.run(query)

然后,我调用这样的方法:

upsert("1", 0)
upsert("2", 0)
upsert("3", 5)
upsert("1", 2)
upsert("1", 1)

所以,在那之后,我期待这个:

node (id="1", field1=3)
node (id="2", field1=0)
node (id="3", field1=0)

但是,我得到了这个:

node (id="1", field1=2)
node (id="2", field1=0)
node (id="3", field1=0)

此外,如果我再次拨打相同的电话,我会得到:

node (id="1", field1=4)
node (id="2", field1=0)
node (id="3", field1=5)

谁能解释一下发生了什么,我做错了什么?我在互联网上寻找,但我找不到任何对我有帮助的东西。

4

1 回答 1

0

使用此查询,这与您正在执行的操作完全相同,我得到了很好的结果:

WITH [
        {idValue:'1', valueField1:0},
        {idValue:'2', valueField1:0},
        {idValue:'3', valueField1:5},
        {idValue:'1', valueField1:2},
        {idValue:'1', valueField1:1}
    ] AS data
UNWIND data AS item
MERGE (n:Node {id:item.idValue}) 
  ON MATCH SET n.field1= n.field1 + item.valueField1
  ON CREATE SET n = {id:item.idValue, field1: 0}

然后用MATCH (n:Node) RETURN n.id, n.field1 ORDER BY n.id LIMIT 25

n.id    n.field1
"1"     3
"2"     0
"3"     0

所以我认为问题不在于查询本身,而在于它的构造。

您应该考虑使用参数化查询。阅读查询会更容易,但也可以对其进行编码,并且它在 Neo4j 中的性能更高。所以你的代码应该是:

def upsert (idValue, valueField1):
   query = "MERGE (n:Node {id:$id}) "
           " ON MATCH SET n.field1= n.field1 + $value"
           " ON CREATE SET n = {id:$id, field1: 0}"
   return db.run(query, id=idValue, value=valueField1)
于 2017-12-07T10:37:22.053 回答