我是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)
有人能解释我发生了什么,我做错了什么?我在互联网上寻找,但我找不到任何对我有用的东西。
答案 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)