2016-05-22 8 views
1

私の現在のシナリオは、の製品,の顧客の売り手のノードが私のグラフエコシステムにあるようです。私が直面しています問題は、私はのプロパティとしてをorder_item_id 与えられたorder_idのグラフに単一のエッジを確保する方法は?

(customer)-[buys]->product

の一意性を確保しなければならないということですedge.Iはユニークなエッジがあることを確認する必要が関係を買います指定されたorder_item_idにbuysプロパティを指定します。このようにして、グラフの挿入が冪等のままであり、指定されたorder_item_idの繰り返し購入エッジが作成されないようにしたい。私がこれまでに発見した何order_item_idプロパティ

if(!mgmt.getPropertyKey("order_item_id")){ 
    order_item_id=mgmt.makePropertyKey("order_item_id").dataType(Integer.class).make(); 
}else{ 
    order_item_id=mgmt.getPropertyKey("order_item_id"); 
} 

を作成

は、一意のインデックスを構築することは私の問題を解決するかもしれないということです。以下のような

if(mgmt.getGraphIndex('order_item_id')){ 
    ridIndexBuilder=mgmt.getGraphIndex('order_item_id') 
}else{ 
    ridIndexBuilder=mgmt.buildIndex("order_item_id",Edge.class).addKey(order_item_id).unique().buildCompositeIndex(); 
} 

または私はまた

mgmt.buildEdgeIndex(graph.getOrCreateEdgeLabel("product"),"uniqueOrderItemId",Direction.BOTH,order_item_id)

  • どのように私は与えられた order_item_idのための単一の買いエッジのこの一意性を保証しなければならないようなものを使用することができます。 (私は order_item_idに基づいて検索するためのユースケースを持っていません。)
  • buildIndexを使用してbuildEdgeIndexを用いたエッジにインデックスを作成する基本的な違いは何ですか?

答えて

2

エッジレベルでプロパティの一意性を強制することはできません。 2つの頂点の間(this question on the mailing listを参照)。私があなたの問題を正しく理解している場合は、特定のプロパティの一意性制約を持つエッジにCompositeIndexを作成すると、インデックス付きプロパティでこれらのエッジを検索する予定がなくても問題は解決します。ただし、これにより、ロッキングのために多数のエッジを同時に挿入すると、パフォーマンス上の問題が発生する可能性があります。データを挿入する速度に応じて、ロックをスキップして(=一意制約をスキップし)、重複するエッジを危険にさらしてから、読み取り時に重複排除を処理したり、ポストインポートバッチジョブを実行して潜在的な重複します。

  • buildIndex()グローバル、グラフインデックス(CompositeIndex又はMixedIndexいずれか)を構築します。この種のインデックスでは、通常、Traversalの開始点をグラフ内ですばやく見つけることができます。
  • しかし、buildEdgeIndex()は、high degree(=多数のインシデントエッジ、着信および/または発信)で、頂点間のトラバーサルを高速化するためのローカルの "vertex-centric index"を構築できます。そのような頂点は「スーパーノード」と呼ばれます(A solution to the supernode problem blog post from Aurelius参照)。これらは非常にまれではありますが、それを横切る可能性はそれほど高くありません。

参照:Titan documentation, Ch. 8 - Indexing for better Performance

+0

私たちはロックをスキップしてデータベースの一貫性を危機にさらすことができるように、パフォーマンスに関する問題が非常に深刻です。私はタイタンのDBからリアルタイムの結果が必要ない場合でも、パフォーマンスの欠点はありますか?重いロック挿入が読み込みクエリに影響しますか? –

+0

パフォーマンスの問題は、実際にグラフのサイズとデータを挿入する速度によって異なります。大規模では、高速書き込みパフォーマンスを維持するために、常にロックを避けたいと考えています。スピードを本当に心配しているのであれば、ロックの有無にかかわらずパフォーマンステストを設定し、どのような読み書きパフォーマンスが得られるかを確認することが最善の方法だと思います。 – jbmusso

+0

私は、挿入前チェックを思いつきました。これは、私がエッジ上の建物インデックスをスキップするのを助けました。それを作成する前に特定のエッジの存在をチェックします。それでも私はスピードのためにロックを解除することはできません(私のACIDルーツかもしれません)。私は、輸入後の仕事のオーバーヘッドが大きくなると思います。頂点の挿入の場合にロックの許可も受け入れられますか? –

関連する問題