2016-04-11 8 views
1

リストプロパティの値全体を更新し、Titan 1.0の新しい値を設定します。単一カーディナリティの場合はvertex.property("single_property",new_value)を使用して全体を上書きしますList型のカーディナリティでは、新しい値がプロパティに追加されます(値全体を上書きしません)。さらに、プロパティを削除して新しい値を追加すると、同じトランザクションでは、操作全体がTitanによって無視されるようです!したがって、私の質問は、どのように適切な方法でリストプロパティの値全体を更新できますか?TitanグラフデータベースのListカーディナリティでvertexプロパティの値を更新する

phaniが提供するソリューションに関して、次のコードは私のためには機能しませんでしたが、挿入部分は機能しましたが、削除部分は機能しませんでした。

keywords = keywordExtractor.getKeywords(getId(nextVertex)) 
if (keywords.size() > 0) { 
    nextVertex.property(VertexProperty.Cardinality.single, "post_keyword", keywords.get(0)); 
    keywords.remove(0); 
      for (String keyword : keywords) { 
        nextVertex.property(VertexProperty.Cardinality.list, "post_keyword", keyword); 
      } 
} 
nextVertex.graph().tx().commit(); 

また、以下で提供されるJasonが提供するソリューションは、いずれも機能しませんでした。問題は削除部分にありました。

keywords = keywordExtractor.getKeywords(getId(nextVertex)) 
    if (keywords.size() > 0) { 
     nextVertex.graph().traversal().V(nextVertex).properties("post_keyword").drop().iterate(); 
       for (String keyword : keywords) { 
         nextVertex.property("post_keyword", keyword); 
       } 
    } 
    nextVertex.graph().tx().commit(); 

また、以下の解決策も調査しました。どちらもうまくいきませんでした。

keywords = keywordExtractor.getKeywords(getId(nextVertex)) 
    if (keywords.size() > 0) { 
     Iterator<VertexProperty<Object>> iter = nextVertex.properties("post_keyword"); 
     while(iter.hasNext()){ 
       iter.next().remove(); 
     } 
     for (String keyword : keywords) { 
       nextVertex.property("post_keyword", keyword); 
     } 
    } 
    nextVertex.graph().tx().commit(); 

答えて

0

主な質問で提示されて提供されるすべてのアプローチは、リスト/セットカーディナリティのプロパティ値全体を更新するの溶液として使用することができます。しかし、実用的な解決策を得るために考慮すべき事実があります。

Titan 1.0では、バックエンド索引付け(ESやSolrなど)を単一のトランザクションで使用すると、不要な削除操作を見つけるためにすべての追加と削除が調査されます。どういうわけか、あるプロパティの削除と同じプロパティの追加はTitanの突然変異クラスに統合され、その結果、削除操作は無視されます。単一カーディナリティの場合、そのような無知はインデックスバックエンドでの追加によって値全体を上書きするため問題にはなりませんが、List/Setカーディナリティではバックエンドインデックスデータに不一致が生じます。

単一のタイタントランザクションでList/Setカーディナリティプロパティに対して1つのプロパティの削除と同じプロパティの追加があるとします。一部をコミットした後、gremlinクエリは上書きするすべてのプロパティが機能することを示しますが、インデックスバックエンドをチェックすると、新しいプロパティが古いプロパティに追加されていることがわかります。 Titanの観点からは、不要な削除を削除するためにremoveプロパティの操作が統合されています。この問題には2つの解決策があります。タイタンのMutationクラスからconsolidationメソッドを削除するか(単一カーディナリティ状況で不要な操作が行われる)、追加操作と削除操作で複数のトランザクションを使用します。私は第2の解決策を選んだ。

0

追加プロパティを追加するには、マルチプロパティでCardinality listを使用します。あなたはマルチプロパティの既存の値を削除し、新しいリストを追加したい場合は、以下の操作を行うことができます

gremlin> v = g.addV('name','marko','name','marko a. rodriguez').next() 
==>v[0] 
gremlin> g.V(v).properties('name').count() //(1) 
==>2 
gremlin> v.property(list, 'name', 'm. a. rodriguez') //(2) 
==>vp[name->m. a. rodriguez] 
gremlin> g.V(v).properties('name').count() 
==>3 
gremlin> g.V(v).property('name','okram') //(3) 
==>v[0] 
gremlin> g.V(v).properties('name') 
==>vp[name->okram] 
gremlin> g.V(v).values('name') //(4) 
==>okram 

1 =>あなたが同じ名前を持つ複数のプロパティでADDVを使用し、したがって、カウントは2です

2 =>既存のエントリを持つ既存の頂点に追加の名前プロパティを追加するには、カーディナリティをリストとして指定します。これは

3 =>すべての既存の名のエントリを削除し、新しいエントリを追加するには、あなたは、単にあなたにそれゆえ=>

方法からカーディナリティを省略するだろう可能な名前のリストに新しい名前を追加します同じ頂点に対して1つの名前しか見ることができません。

+0

残念ながら、あなたのソリューションは私のためには機能しませんでした。 –

0

ファニーは、TinkerGraphですばらしい答えを示しました。 Titanの動作は若干異なりますので、私の提案はまずdrop()のプロパティになり、その後新しいアイテムを追加します。

gremlin> graph = TitanFactory.open('inmemory'); g = graph.traversal() 
==>graphtraversalsource[standardtitangraph[inmemory:[127.0.0.1]], standard] 
gremlin> mgmt = graph.openManagement() 
==>com.t[email protected]71a06021 
gremlin> name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.LIST).make() 
==>name 
gremlin> mgmt.commit() 
==>null 
gremlin> v = g.addV('name','marko','name','marko a. rodriguez').next() 
==>v[4312] 
gremlin> g.V(v).properties('name').count() 
==>2 
gremlin> g.V(v).properties('name').drop().iterate() 
gremlin> g.V(v).properties('name').count() 
==>0 
gremlin> v.property(list, 'name', 'm. a. rodriguez') 
==>vp[name->m. a. rodriguez] 
gremlin> g.V(v).properties('name').count() 
==>1 

を更新:Java code example

+0

Javaクライアントでも動作しますか? –

+0

はい、もちろんあります。 –

+0

残念ながら私の場合はうまくいきません。 –

関連する問題