2012-03-29 6 views
2

私は、Springデータneo4j 2.1.0.BUILD-SNAPSHOTとNeo4j 1.6.1サーバを使用しています。 私は2つのユーザーノードの間に友情関係があり、すべてのuser1、user2のペアに対して1つの関係しか作成されないようにしたい(順序は数えません)。Neo4jとの関係を一意にする

一般的な提案は、別のものを作成する前に関係がすでに存在するかどうかをアプリケーションレベルでチェックすることですが、同時性の問題を避けることはできません:データベースレベルで制約を管理する必要があります。私は考えることができる

最善の解決策は、ところで、私が知っている

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

のようなユニークuser1とuser2のIDに基づいて制約、何かをのNeo4j 1.6で導入されたユニークな特性を持つ@Indexedアノテーションを使用して作成することですNeo4jTemplate.getOrCreateNode()でノード上でこのチェックをサポートしているSpringデータneo4jの最新リリースが、リレーションシップで動作するかどうかはわかりません。残りのAPIはそこにあるはずです。 Unique relationship

だから私は二つの質問があります。

1は、任意のより良い代替手段はありますか?

2この並行性の問題に悩まされるべきか、トラフィックが多いサイトでも何か悪いことが起こりにくく、アプリケーションレベルのチェックで十分であるはずです。私はそれが私には非常に共通の問題だと思うので尋ねますが、Neo4jではこれについて少ししかありません。たぶん、埋め込みバージョンはこれで苦しんでいるかもしれません。

おかげ

答えて

3

2つのノード間の関係を有するSDNにおける通常のアプローチは、すでに(先行チェックすることにより)、それらの間のいずれかのタイプの唯一の関係があることを保証します。

Neo4jのユニークさのサポートをまだ活用していません。

そして、REST-Serverでは、このアプローチは同時実行性/競合状態になる可能性があります。

埋め込みバージョンでは、ロックをサポートしています(たとえば、2つのノードのうちの1つ(またはその両方))。同じ時間に同じことをする第二のスレッドがないように。

あなたが楽観的にそれをするなら、それは大丈夫かもしれません。私。作成後に確認してから削除してください。 REST-APIを直接利用して、その動作をサポートすることもできます。おそらく、SDN 2.1のサポートを追加して、http://spring.neo4j.org/issuesに問題を提起することができますか?

+1

完了! https://jira.springsource.org/browse/DATAGRAPH-223 –

関連する問題