基于关系链重新计算Neo4J关系

svujldwt  于 2023-06-22  发布在  其他
关注(0)|答案(2)|浏览(158)

bounty还有3天到期。此问题的答案有资格获得+50声望奖励。Lucassith正在寻找一个答案从一个有信誉的来源

我有一长串的关系:

:User can have multiple :Territory(ies)
:Account can belong in multiple :Territory(ies)
:Account can be assigned to a multiple :User(s)
:Account can have an :Invoice(s)
:Invoice can have an :InvoiceEntry(ies)

总而言之:

:User-[:BELONGS_TO]->:Territory<-[:EXISTS_IN]-:Account-[:ISSUED]->:Invoice-[:HAS]->:InvoiceEntry

我可以把关系简化为

:User-[:CAN_SEE]->:Invoice

由于我不精通Cypher,我的问题是:

问题1。

当从:Territory中删除:Account并保持有效关系:CAN_SEE不变时,将使用什么查询来刷新:User和:Invoice之间的关系。

问题#2。

与上述相同,但是:用户已从“Territory”中删除,并且无法再查看“Invoice”。

更新16.06.23

我的主要关系链是:User -> :Territory <- :Account -> :Invoice
:User -> :Territory关系由Active Directory提供。
:Account -> :Territory:Account -> Invoice关系从ERP系统中提取。
为了避免昂贵的计算,因为单个:User可以有数百个:Territory,一个:Account可以有数百个:Territory,我想引入一个“快捷”关系:User-[:CAN_SEE]->:Invoice
示例案例:
U1属于T1T2T3
A1存在于T1T4中。
A2存在于T3T4中。
A3存在于T1T2T4中。
A1发布I1
A2发布I2
A3已发布I3
在这里,我最终将其简化为:
U1可以看到I1I2I3

问题1的跟进:

我收到ERP从T1分离A1A3的有效负载。
我删除了A1->T1A3->T1关系。
我需要重新计算[:CAN_SEE],因为U1丢失[:CAN_SEE]I1,因为U1A1不再具有有效的地域关系。U1仍然可以看到I3,因为A3丢失了T1,但T2确保了到I3的链。
查询将是什么样子?

问题2的跟进:

Active Directory已更新:
U1T1分离。U1不再能够看到I1
在这种情况下查询看起来会是什么样子。
换句话说:
我知道如何在现有关系的基础上建立新的关系。我很难理解如何重新无效旧的,并删除那些如果不再有效。

kpbwa7wx

kpbwa7wx1#

如果我答对了问题
1.使用此查询创建:CAN_SEE关系
match(u:User)-->(:Territory)<--(:Account)-->(i:Invoice)merge(u)-[:CAN_SEE]->(i)
合并应防止产生多重关系
1.& 3.如果我没记错,在这两种情况下,您都想检查从用户到发票的路径是否仍然存在,如果路径被破坏,则删除CAN_SEE关系。下面的查询应该可以做到这一点
匹配(u:User)-[r:CAN_SEE]-(i:发票),其中不存在((u)-->(:Territory)<--(:Account)-->(i))删除r
在生产应用之前做测试,但我没有测试

krugob8w

krugob8w2#

我假设您的问题是更新一个已经包含适当的CAN_SEE关系的图。
1.使用以下查询在删除特定帐户(例如A1)时更新图表。查询使用DETACH DELETE删除所有已删除节点的匹配路径和所有关系(包括BELONGS_TOCAN_SEE)。

MATCH p=(a:Account)-[:ISSUED]->(:Invoice)-[:HAS]->(:InvoiceEntry)
WHERE a.id = 'A2'
DETACH DELETE p

1.使用此查询可以断开用户(U1)与地区(T3)的连接,并删除该用户与该地区中所有帐户开具的所有发票之间的所有CAN_SEE关系:

MATCH  (u:User)-[bt:BELONGS_TO]->(t:Territory)<-[:EXISTS_IN]-(:Account)-[:ISSUED]->(:Invoice)<-[cs:CAN_SEE]-(u)
WHERE u.id = 'U1' AND t.id = 'T3'
DELETE bt, cs

相关问题