gpt4 book ai didi

Neo4j:使用可选关系实现软删除

转载 作者:行者123 更新时间:2023-12-05 04:17:53 29 4
gpt4 key购买 nike

我正在尝试在 Neo4j 中实现软删除。从 Alice 的角度来看,Cypher 中描述的图是这样的:

(clyde:User)<-[:FOLLOWS]-(alice:User)-[:LIKES]->(bob:User)

我没有真正删除节点及其关系,而是

  1. 更改其标签以便不再直接查找,即删除其 User 标签并添加 _User 标签(注意下划线)
  2. 替换它的关系,这样我的正常查询就无法再访问它,例如删除其 :FOLLOWS 关系并将其替换为 :_FOLLOWS 关系。

所以这基本上相当于将一行移动到关系数据库中的归档表中。我认为这是一种非常有效的方法,因为您实际上永远不会访问图表中已被软删除的部分。此外,您不必修改任何现有查询。

软删除Alice的结果应该是这样的:

(clyde:User)<-[:_FOLLOWS]-(alice:_User)-[:_LIKES]->(bob:User)

我第一次尝试查询是这样的:

match (user:User {Id: 1})
optional match (user)-[follows:FOLLOWS]->(subject)
remove user:User set user:_User
delete follows
create (user)-[:_FOLLOWS]->(subject);

问题是,当此用户未关注任何人时,查询会尝试在 usernull 之间创建关系,因为第二个匹配项是可选的,因此它给出我这个错误:Other node is null.

我的第二次尝试是这样的:

match (user:User {Id: 1})
remove user:User set user:_User
optional match (user)-[follows:FOLLOWS]->(subject)
foreach (f in filter(f in collect({r: follows, n: subject}) where f.r is not null) | delete f.r create (user)-[:_FOLLOWS]->(f.n));

所以我将关系和主题放入 map 中,将这些 map 收集到一个集合中,将每个“空” map 扔掉并在集合中循环。但是这个查询给了我这个错误:

SyntaxException: Invalid input '.': expected an identifier character, node labels, a property map, whitespace or ')' (line 1, column 238)

有谁知道我该如何解决这个问题?

谢谢,简

最佳答案

能不能先改标签再匹配关系?那么你应该能够使用“非可选”匹配,而不必处理没有跟随关系的情况,比如

MATCH (user:User {Id: 1})
REMOVE user:User SET user:_User
WITH user
MATCH (user)-[follows:FOLLOWS]->(subject)
DELETE follows
CREATE (user)-[:_FOLLOWS]->(subject)

或者您可以携带用户、关注和主题,并在主题不为空的地方进行过滤。有点像

MATCH (user:User {Id: 1})
OPTIONAL MATCH (user)-[follows:FOLLOWS]->(subject)
REMOVE user:User SET user:_User
WITH user, follows, subject
WHERE subject IS NOT NULL
DELETE follows
CREATE (user)-[:_FOLLOWS]->(subject)

编辑:
如果问题是你想为不止一种关系这样做,那么你可以尝试

MATCH (user:User {Id: 1})
REMOVE user:User SET user:_User
WITH user
MATCH (user)-[f:FOLLOWS]->(other)
DELETE f
CREATE (user)-[:_FOLLOWS]->(other)
WITH user LIMIT 1
MATCH (user)-[l:LIKES]->(other)
DELETE l
CREATE user-[:_LIKES]->(other)

你可以继续扩展它与其他关系类型,只是一定要在携带时限制user,因为多个匹配(user)-[r]->(other) 表示用户有多个结果,否则您将多次运行下一个查询部分。

我认为在 cypher 中没有通用的方法,因为你不能动态构建关系类型(即 CREATE (a)-[newRel:"_"+type(oldRel)] ->(b) 不起作用)

您正在寻找类似的东西还是我误解了您的问题?

关于Neo4j:使用可选关系实现软删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20606084/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com