2

我正在使用 Spring 数据 neo4j 2.1.0.BUILD-SNAPSHOT 和 Neo4j 1.6.1 服务器。我在两个用户节点之间有一个友谊关系,我想确保为每个用户 1、用户 2 对只创建一个关系(顺序不计算在内)。

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

我能想到的最佳解决方案是使用带有 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 data neo4j 的最新版本支持使用 Neo4jTemplate.getOrCreateNode() 对节点进行此检查,但我不确定它是否适用于关系。其余的 API 应该在那里。独特的关系

所以我有两个问题:

1 有没有更好的选择?

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

谢谢

4

1 回答 1

3

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

它还没有利用 Neo4j 中的唯一性支持。

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

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

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

于 2012-04-02T08:59:51.033 回答