NEO4J MERGE не работает должным образом
Я новичок в 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 ответ
С этим запросом, который в точности совпадает с тем, что вы делаете, я получаю хороший результат:
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)