gpt4 book ai didi

neo4j - 使用 Neo4j 强制关系唯一性

转载 作者:行者123 更新时间:2023-12-04 05:52:21 25 4
gpt4 key购买 nike

我正在使用 Spring 数据 neo4j 2.1.0.BUILD-SNAPSHOT 和 Neo4j 1.6.1 服务器。
我在两个 User 节点之间有一个 Friendship 关系,我想确保只为每个 user1、user2 对创建一个关系(订单不计算在内)。

常见的建议是在创建另一个关系之前在应用程序级别检查关系是否已经存在,但我认为这并不能避免并发问题:应该在数据库级别管理约束。

我能想到的最佳解决方案是使用 Neo4j 1.6 中引入的具有唯一属性的 @Indexed 注释,并根据 user1 和 user2 id 创建一个唯一约束,例如

@Indexed(unique = true)
private String uniqueConstraint;
public String getUniqueConstraint(){
if(user1.id > user2.id){
return user1.id + "|" + user2.id;
}
return user2.id + "|" + user1.id;
}

顺便说一句,我知道最新版本的 Spring 数据 neo4j 支持使用 Neo4jTemplate.getOrCreateNode() 对节点进行此检查,但我不确定它是否适用于关系。其余的 API 应该在那里。 Unique relationship

所以我有两个问题:

1 有没有更好的选择?

2 我是否应该被这个并发问题所困扰,或者即使在高流量站点中也不太可能发生不好的事情并且应用程序级别的检查就足够了?我问是因为在我看来这是一个非常普遍的问题,但是 Neo4j 几乎没有关于这个问题。也许嵌入式版本受此影响较小。

谢谢

最佳答案

SDN 中在两个节点之间建立关系的常用方法已经确保它们之间只有一种类型的关系(通过预先检查)。

它尚未为此利用 Neo4j 中的唯一性支持。

是的,使用 REST-Server 这种方法可能会遇到并发/竞争条件。

嵌入式版本支持锁定(例如在 2 个节点之一 - 或两者上),然后创建与该锁定的关系。这样就没有第二个线程同时做同样的事情。

可能没问题,如果你乐观地去做。 IE。创建后检查,然后删除。您还可以直接利用 REST-API 来支持该行为。我们可能会通过 SDN 2.1 添加对此的支持,您可以在 http://spring.neo4j.org/issues 提出问题(链接到这篇文章)吗? ?

关于neo4j - 使用 Neo4j 强制关系唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9924466/

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