关于删除过时的关系

时间:2017-04-09 01:00:43

标签: neo4j

购物车正在登录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)

1 个答案:

答案 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