0

Cassandra をデータ ストアとして Titan 0.3.2 を実行しています。また、RexProを介して Titan と対話するためにrexpro-pythonを使用しています。

問題と質問:

この Python コードを実行すると:

>>> import rexpro
>>> conn = rexpro.RexProConnection('localhost', 8184, 'graph')
>>> conn.execute('g.addVertex(null, node_dict)', {'node_dict':{'my_dict':{}}})
{'_type': 'vertex', '_id': '2280164', '_properties': {'my_dict': {}}}
>>> conn.execute('g.commit()')

結果のノードを Gremlin コンソールで検索できます。

gremlin> g.v(2280164).map
==>{my_dict={}}

my_dictマップが適切に作成されているように見えます。

gremlin> g.v(2280164).my_dict.getClass()
==>class java.util.HashMap

my_dictただし、新しいキーと値で更新できません:

gremlin> g.v(2280164).my_dict['abc'] = 123
==>123
gremlin> g.commit()
==>null
gremlin> g.v(2280164).map
==>{my_dict={}}

コンソールで最初に新しいオブジェクトにリセットmy_dictすると、キーを追加しようとするabcと期待どおりに機能します。

gremlin> g.v(2280164).my_dict = [:]
gremlin> g.v(2280164).my_dict['abc'] = 123
==>123
gremlin> g.v(2280164).map
==>{my_dict={abc=123}}

私の質問: my_dictRexPro で作成された頂点で新しい KV ペアを更新するにはどうすればよいですか?


試行された回避策/解決策:

パラメータ化されていないバージョンの Python スクリプトを使用して頂点を作成すると、これと同じ問題が発生します。

>>> conn.execute('g.addVertex([my_dict:[:]])')

また、この問題に関連するかどうかはわかりませんが、コンソールで作成された新しいマップはLinkedHashMap(一方、python/rexpro コードは を作成しましたHashMap) のようです:

gremlin> g.v(2280164).my_dict.getClass()
==>class java.util.LinkedHashMap
4

2 に答える 2

0

REPL でこれを完全に再作成しようとしましたが、できませんでした。を明示的に作成したjava.util.HashMapところ、Titan/Cassandra でも問題なく動作するように見えました。LinkedHashMapを行うときのgroovyのデフォルトだと思います[:]

gremlin> g = TitanFactory.open('bin/cassandra.local')
==>titangraph[cassandrathrift:127.0.0.1]
gremlin> g.addVertex()
==>v[4]
gremlin> g.v(4).my_dict = new java.util.HashMap()
gremlin> g.v(4).map
==>{my_dict={}}
gremlin> g.v(4).my_dict['abc'] = 123
==>123
gremlin> g.v(4).map
==>{my_dict={abc=123}}
gremlin> g.v(4).my_dict.getClass()
==>class java.util.HashMap
gremlin> g.commit()
==>null
gremlin> g.v(4).map
==>{my_dict={abc=123}}

RexPro リクエストをパラメータ化しないとどうなりますか? つまり、次のようにすると、異なる結果が得られますか?

>>> conn.execute('g.addVertex([my_dict:[:]])')

それが機能する場合は、回避策になる可能性があります。RexPro を介して「リクエストをパラメータ化する」ことをお勧めしますが、このスクリプトは基本的に静的であるため、リクエストごとの追加コストがあまりかからずにスクリプトエンジンに適切にキャッシュされます。

于 2013-11-12T13:44:58.967 に答える