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)
Другие вопросы по тегам