6

Titan グラフの 2 つの頂点間に一意のエッジを作成し、削除して再作成しない限り、再度作成できないことを確認する方法はありますか?

基本的に私は作成する必要があります:

vertex1--follows-->vertex2

しかし、同じ関係に対して複数のエッジを作成し続けます。

vertex1--follows-->vertex2
vertex1--follows-->vertex2
vertex1--follows-->vertex2
vertex1--follows-->vertex2

私の基本的な addEdge クエリは次のとおりです。

def follow(target)
  grem = "g.addEdge(
    g.V('id', '#{id}').next(),
    g.V('id', '#{target.id}').next(),
    'follows',
    [since:#{Time.now.year}]
  )"

  $graph.execute(grem).results
end

私が見つけようとしているのは、このようなものです

def follow(target)
  grem = "g.addEdge(
    g.V('id', '#{id}').next(),
    g.V('id', '#{target.id}').next(),
    'follows',
    [since:#{Time.now.year}]
  ).unique(Direction.OUT)"

  $graph.execute(grem).results
end

このドキュメントにはuniqueと呼ばれるメソッドがありますが、これをエッジで機能させることはできず、頂点のプロパティのみです。

https://github.com/thinkaurelius/titan/wiki/Type-Definition-Overview

create addEdge の前にクエリを実行して既存のエッジを確認することもできますが、これはハックのようで、競合状態の問題を引き起こす可能性があります。

エッジが既に存在する場合、重複するエッジの作成を防ぐ addEdge に追加できるメソッドが存在する可能性はありますか?

または、エッジに固有のプロパティ ラベルを作成する方法はありますか?

問題のグレムリン セッションは次のとおりです。

gremlin>  g.makeType().name('follows').unique(IN).makeEdgeLabel();
==>v[36028797018964558]
gremlin> u = g.addVertex([name:'brett'])
==>v[120004]
gremlin> u2 = g.addVertex([name:'brettU'])
==>v[120008]
gremlin> e = g.addEdge(u, u2, 'follows')
==>e[2w5N-vdy-2F0LaTPQK2][120004-follows->120008]
gremlin> e = g.addEdge(u, u2, 'follows')
An edge with the given type already exists on the in-vertex
Display stack trace? [yN] 
gremlin> e = g.addEdge(u2, u, 'follows')
==>e[2w5P-vdC-2F0LaTPQK2][120008-follows->120004]
gremlin> u3 = g.addVertex([name:'brett3'])
==>v[120012]
gremlin> e = g.addEdge(u3, u, 'follows')
An edge with the given type already exists on the in-vertex
Display stack trace? [yN] N
gremlin> g.E
==>e[2w5N-vdy-2F0LaTPQK2][120004-follows->120008]
==>e[2w5P-vdC-2F0LaTPQK2][120008-follows->120004]

unique(IN|BOTH|OUT) を設定すると、ユーザーごとに 1 人のフォロワーしか持てないという問題が発生します。もちろん、これは user -> follow -> [users] 関係を持つことを不可能にします。

エッジに一意のプロパティを設定しようとする別の例を次に示します。これも失敗します。

gremlin> g.makeType().name('follows_id').unique(BOTH).makeEdgeLabel();
==>v[36028797018964942]
gremlin>  u = g.addVertex([name:'brett'])
==>v[200004]
gremlin>  u2 = g.addVertex([name:'brett2'])
==>v[200008]
gremlin>  u3 = g.addVertex([name:'brett3'])
==>v[200012]
gremlin> e = g.addEdge(u, u2, 'follows', [follows_id:'200004-20008'])
Value must be a vertex
Display stack trace? [yN] N
gremlin> g.E
==>e[4c9z-Q1S-2F0LaTPQQu][200004-follows->200008]
gremlin> e = g.addEdge(u, u2, 'follows', [follows_id:'200004-20008'])
Value must be a vertex
Display stack trace? [yN] N
gremlin> g.E
==>e[4c9z-Q1S-2F0LaTPQQu][200004-follows->200008]
==>e[4c9B-Q1S-2F0LaTPQQu][200004-follows->200008]
4

2 に答える 2

7

ここでループを閉じるために、この質問はAurelius Graphs メーリング リストで回答されました。基本的:

次の理由により、一意性制約を頂点のペアに適用する使用例は実際には見られません (a la - 頂点 A と B の間に存在できるエッジは 1 つだけです)。

  • ほとんどの場合、クエリ側で dedup() を使用すると、非常に安価に重複を取り除くことができます: v.out('follows').dedup().....
  • 競合の可能性ははるかに低く (頂点の組み合わせが N^2 であるため)、ロックは競合の可能性に比べて非常に高価になります。

つまり、Titan では適用できないため、アプリケーションでエッジの存在を検証する必要があります。

于 2013-09-16T11:13:08.023 に答える