购物车正在登录Neo4j。
注意:每个购物车对于访问者来说都是唯一的,并由购物车定义:路径(实际上是购物车ID cookie)。每个项目都是购物车中的lineitem。它独特的推车和购物车中的产品(唯一的关键是item.key)。最后,product_id指的是产品。
购物车包含的行,即使有人删除行或更改数量,也需要更新。
设置更新现有线路的值,但是当更新的购物车json到达时,它不会删除从购物车中删除的线路。
是否有一种简单的方法可以修改此查询以自动删除已删除的行?
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)
答案 0 :(得分:0)
我对这个查询感到有些困惑,因为看起来你正在合并项目,因为它们被添加到购物车中,而不是匹配现有产品。此外,您添加的:项目节点似乎特定于单个用户的事务(您根据输入设置数量),因此在这里使用MERGE似乎是不明智的...如果两个用户尝试添加同一类型的物品,但数量不同?其中一个交易将否决另一个...用户1添加2:项目a,但用户2添加10个项目a,这将更改用户1的:购物车现在读取10个:项目选择(尽管:购物车的总数尚未更新到那...)似乎该模型可以使用一些改进。
您可以这样做的一种方法是设置与购物车的关系的数量,而不是项目上的数量。
这样的事情:
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
因此,此查询似乎是用于向购物车添加商品,您需要查询删除商品。
这应该可以解决问题:
// 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
如果您想要在第一个查询中设置项目的单个查询,并删除未发送的所有其他行,则此组合查询应该有效:
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