有效地检查是否至少有一个类型的关系连接到节点,如果没有-删除节点



让我们假设这个Neo4j数据构造。

(:Store)<-[:FROM]-(:Notification)-[:FOR]->(//users//:User)

例如,它应该作为用户在商店新销售的通知
这样的通知可以同时发送给大量用户,在这种情况下,我可以看到这种数据建模的两种方法:

  1. 为每个:User创建单独的:Notification和关系;全部连接到单个:Store节点。因此,当收到通知时,关系和:Notification节点将被删除
  2. 我认为在性能方面应该更有效的方法,我的问题是:创建一个连接到商店的单个:Notification节点和多个用于不同用户的[:FOR]节点。收到通知-已删除此用户的:FOR,如果没有剩余的:FOR,则删除:Notification本身

所以我的问题是:
我认为第二个是更好的练习,这是正确的吗
通常,在删除关系后,我如何检查是否还有更多这样的关系,并且在不使Neo4j匹配所有连接的此类关系的情况下进行,即检查是否至少还有一个此类关系?

通常情况下,首先创建较少的对象会更有效率。这将导致2n更少的对象(每个用户1个节点和关系)。例外情况是,如果每个通知的用户太多,以至于节点密度太高。为了避免这种情况,您可以简单地在特定的用户阈值下创建额外的通知。

下面的问题改编自@Luane对这个问题的回答,我认为这个问题很巧妙。

假定除了User节点之外,到Notification节点的唯一其他连接是存储节点。如果连接到Notification节点的节点的度为1,则它必须只剩下一个Store节点。删除与Store节点的关系,然后删除Notification节点。

MATCH (n:Notification {name: 'Notification One'} )-[store_rel:FROM]->(s:Store)
WHERE size((n)--())=1
DELETE store_rel, n

最新更新