NEO4J MERGE未按预期工作

时间:2017-12-06 19:09:32

标签: database neo4j cypher neo4j-python-driver

我是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)

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

1 个答案:

答案 0 :(得分: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)