2016-10-12 18 views
2

次のグラフ定義があります。DSEグラフ/ Titanの頂点の重複を避ける方法

schema.propertyKey("ID").text().create() 
schema.vertexLabel("Student").properties("ID").create() 

次のGremlinクエリを実行すると、新しい頂点が作成されます。

g.addV(label, 'Student').property('ID', '1234') 

私は再びそれを実行したときに、同じIDを持つ新しい頂点がcreated.I'mが ID値が一意にへの道を探してきました。同じID(1234)の新しい生徒を追加しようとすると、エラーが発生するはずです。どのような助けも高く評価されました。

答えて

1

あなたはグラフのスキーマを定義するタイタンスキーマドキュメントから単一

SINGLEをIDプロパティのカーディナリティを設定します。は、このようなキーの要素ごとに最大1つの値にできます。他の ワードでは、キー→値のマッピングはグラフのすべての要素で一意です。 プロパティキーbirthDateは、それぞれが の1人の生年月日を持つため、単一の基数の例です。

ここで私はDSEグラフについては知らないが、タイタンにインデックスを作成し、一意であることを設定することができ、ドキュメントhttp://s3.thinkaurelius.com/docs/titan/1.0.0/schema.html

+0

あなたは私に私のシナリオに基づいて、いくつかの例を与えることはできますか? – BDR

+0

私はそれを試したことはありませんが、このようなことは仕事をするかもしれません。 '' 'mgmt = graph.openManagement() ID = mgmt.makePropertyKey( 'ID')。dataType(String.class).cardinality(Cardinality.SINGLE ).make() mgmt.commit() '' ' –

+0

いいえ。ありがとうございました。それをチェックします – BDR

2

へのリンクです。しかし、タイタンは重複を避けるために、このようなインデックスを持つ頂点を挿入するためにロックを使用しなければならないので、(少なくとも多くの頂点に影響を与える場合はそうでないことを推奨します)。

頂点が挿入される前に頂点が存在するかどうかをチェックすると、パフォーマンスが向上します。あなたはこれらのクエリの2つが同じ時間に同じIDのために評価され、ここで競合状態に入ることができ、もちろん

g.V().has('Student','ID','1234').tryNext().orElseGet(g.addV(T.label,'Student','ID', '1234').next()) 

: ダニエルKuppitzはメーリングリスト[1]にそのためのクエリを提供します。しかし、これはごくまれにしか起こらないはずです.TinkerPopの次期バージョンでは、OLAPジョブで定期的にクリーンアップを実行できます。 (残念ながら、それはOLAPジョブにグラフを変更することはできません。)

[1] https://groups.google.com/forum/#!topic/gremlin-users/pCYf6h3Frb8

+2

http://s3.thinkaurelius.com/docs/titan/1.0.0/indexes.html#index-unique –

関連する問題