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

时间:2015-11-08 21:28:37

标签: neo4j cypher

我们假设这个(:Store)<-[:FROM]-(:Notification)-[:FOR]->(//users//:User)数据结构。

:Notification

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

  1. 为每个:User创建具有关系的单独:Store;全部连接到单个:Notification节点。因此,当收到通知时 - 关系和:Notification节点被删除。
  2. 我认为应该更有效的方法以及我的问题是:创建连接到商店的单个[:FOR]节点和针对不同用户创建多个:FOR的方法。已收到通知 - :FOR已删除此用户,如果没有:Notification已删除,则int Base<>::cnt = 42; 本身已被删除。
  3. 所以我的问题是:
    假设第二个是更好的做法,我是否正确? 在删除关系之后,我通常如何检查是否存在更多此类关系,并且在不使Neo4j匹配此类型的所有连接关系的情况下进行,即检查是否至少存在这种类型的关系?

1 个答案:

答案 0 :(得分:1)

一般来说,首先创建的对象越少,效率就越高。这将导致 2n 更少的对象(每个用户1个节点和关系)。例外情况是,如果每个通知有这么多用户,那么节点密度太高。为避免这种情况,您可以在特定用户阈值处创建其他通知。

以下查询改编自@Luanne对此question的回答,我觉得这很简单。

它假定除了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