2017-04-09 3 views
0

Ein Einkaufswagen wird bei Neo4j geloggt.Beim Entfernen von veralteten Beziehungen

HINWEIS: Jeder Warenkorb ist einzigartig für einen Besucher und definiert durch den Warenkorb: Pfad (der eigentlich ein Einkaufswagen-ID-Cookie ist). Jeder Artikel ist ein Lineitem im Warenkorb. Es ist einzigartig für den Warenkorb und das Produkt im Warenkorb (eindeutiger Schlüssel ist item.key). Schließlich bezieht sich product_id auf ein Produkt.

Der Einkaufswagen enthält Zeilen, die aktualisiert werden müssen, auch wenn jemand eine Zeile löscht oder die Menge ändert.

Der Satz aktualisiert Werte für vorhandene Linien, aber es werden keine Linien entfernt, die aus dem Wagen gelöscht werden, wenn der aktualisierte Wagen json ankommt.

Gibt es eine einfache Möglichkeit, diese Abfrage zu ändern, um entfernte Zeilen automatisch zu löschen?

UNWIND items as item 
MATCH (p:Cart {path:px.upath}) 
    SET p.total_price=cart.total_price 
MERGE (i:Item {key:item.key}) 
    SET 
      i.product_id=item.product_id, 
      i.quantity=item.quantity, 
MERGE (i)-[:LineOf]->(p) 

Antwort

0

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 
+0

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

Verwandte Themen