使用Neo4j强制关系唯一性
我使用的是Spring数据neo4j 2.1.0.BUILD-SNAPSHOT和neo4j 1.6.1服务器。 我在两个用户节点之间有一个友谊关系,我希望确保每个user1、user2对只创建一个关系(顺序不计算) 通常的建议是,在创建另一个关系之前,在应用程序级别检查关系是否已经存在,但我认为这并不能避免并发问题:应该在数据库级别管理约束 我能想到的最好的解决方案是使用Neo4j 1.6中引入的带有unique属性的@Indexed注释,并基于user1和user2 ID创建一个唯一的约束,比如使用Neo4j强制关系唯一性,neo4j,spring-data-neo4j,Neo4j,Spring Data Neo4j,我使用的是Spring数据neo4j 2.1.0.BUILD-SNAPSHOT和neo4j 1.6.1服务器。 我在两个用户节点之间有一个友谊关系,我希望确保每个user1、user2对只创建一个关系(顺序不计算) 通常的建议是,在创建另一个关系之前,在应用程序级别检查关系是否已经存在,但我认为这并不能避免并发问题:应该在数据库级别管理约束 我能想到的最好的解决方案是使用Neo4j 1.6中引入的带有unique属性的@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()的节点进行这种检查,但我不确定它是否适用于关系。不过restapi应该在那里
所以我有两个问题:
1有没有更好的选择
2我是否应该为这个并发问题而烦恼,或者即使在高流量的站点上也不太可能发生不好的事情,并且应用程序级别的检查应该足够了?我问这个问题是因为在我看来这是一个非常常见的问题,但Neo4j对此几乎没有什么内容。也许嵌入式版本受此影响较小
感谢在SDN中,在两个节点之间建立关系的常用方法已经确保它们之间只有一种类型的关系(通过预先检查) 为此,它还没有利用Neo4j中的唯一性支持 是的,对于REST服务器,这种方法可能会遇到并发/竞速情况 嵌入式版本支持锁定(例如,在两个节点中的一个或两个节点上),然后创建与该锁定的关系。这样就没有第二个线程同时做同样的事情了 如果你乐观地去做的话,这也许是可以的。即创建后检查,之后删除。您还可以直接利用REST-API来支持这种行为。我们可能会通过SDN 2.1添加对该功能的支持。您是否可以在以下位置提出问题(链接到此帖子)