Ich bin ein wenig verwirrt durch die Abfrage, da es, wie Sie in den Punkten sind verschmelzenden scheint, wie sie in den Warenkorb gelegt sind, um passende auf bestehende Produkte im Gegensatz. Außerdem scheinen die Item-Nodes, die Sie hinzufügen, spezifisch für die Transaktion eines einzelnen Benutzers zu sein (Sie legen die Menge basierend auf der Eingabe fest), daher scheint es unklug, MERGE hier zu verwenden ... was ist, wenn zwei Benutzer versuchen, das hinzuzufügen gleiche Art von Artikel zur gleichen Zeit, aber unterschiedliche Mengen? Eine dieser Transaktionen wird die andere überschreiben ... Benutzer 1 fügt 2 von: Artikel a hinzu, aber Benutzer 2 fügt 10 von Artikel a hinzu, der Benutzer 1 ändert: Warenkorb, um jetzt 10 zu lesen: Artikel ausgewählt (obwohl der: Warenkorb insgesamt wurde nicht aktualisiert ...) Es scheint, als ob das Modell einige Verbesserungen verwenden könnte.
Eine Möglichkeit besteht darin, die Menge für die Beziehung zum Einkaufswagen und nicht für das Element festzulegen.
Etwas wie folgt aus:
UNWIND items as item
MATCH (p:Cart {path:px.upath})
SET p.total_price=cart.total_price
MERGE (i:Item {key:item.key})
// doesn't seem the place to set product_id, but leaving it in
SET i.product_id=item.product_id
MERGE (i)-[r:LineOf]->(p)
SET r.quantity=item.quantity
So ist es wie diese Abfrage scheint, ist für Artikel in den Warenkorb gelegt hinzufügen, und Sie müssen eine Abfrage für Elemente zu löschen.
Diese den Trick tun sollten:
// assume toDelete is your list of items to delete
WITH toDelete
MATCH (p:Cart {path:px.upath})
SET p.total_price=cart.total_price
MATCH (p)<-[r:LineOf]-(i)
WHERE i.key in toDelete
DELETE r
Wenn Sie eine einzelne Abfrage möchten, dass Ihre Artikel wie in Ihrem ersten Abfrage festgelegt wird, und löschen Sie alle anderen Linien, die nicht geschickt werden, dann kombiniert diese Abfrage sollte Arbeit:
UNWIND items as item
MATCH (p:Cart {path:px.upath})
SET p.total_price=cart.total_price
// first delete all items from the cart that aren't listed
OPTIONAL MATCH (p)<-[r:LineOf]-(i)
WHERE NOT i.key in items
DELETE r
// now add/update the rest
MERGE (i:Item {key:item.key})
// doesn't seem the place to set product_id, but leaving it in
SET i.product_id=item.product_id
MERGE (i)-[r:LineOf]->(p)
SET r.quantity=item.quantity
Ein Hinweis hinzugefügt, um die Struktur zu klären. Ich mag Ihre zweite Abfrage und werde sie an meinen Anwendungsfall anpassen. Vielen Dank! – fodon