我使用Cassandra作为数据存储运行Titan 0.3.2。我也使用rexpro-python通过RexPro与Titan进行交互。
问题&问题:
如果我运行这个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}}
我的问题:如何在通过RexPro创建的顶点上使用新的KV对更新my_dict
?
尝试过的解决方法/解决方案:
当使用非参数化版本的python脚本创建顶点时,会发生同样的问题:
>>> conn.execute('g.addVertex([my_dict:[:]])')
另外,不确定是否与此问题相关,但看起来在控制台中创建的新地图是LinkedHashMap
(而python / rexpro代码创建了HashMap
):
gremlin> g.v(2280164).my_dict.getClass()
==>class java.util.LinkedHashMap
答案 0 :(得分:3)
更新从顶点属性发出的字典/映射会绕过数据库级别,因为您直接修改堆上的值。 换句话说,Titan不知道您更新了地图,因此不会保留更改。
始终将属性值视为不可变的,即使它们可能是可变的java对象,因为这些突变对于数据库是不可见的。
这将有效:
newdict = v.my_dict.clone()
newdict['hello']='other'
v.setProperty('my_dict',newdict)
graph.commit()
v.map
答案 1 :(得分: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“参数化请求”,但由于这个脚本基本上是静态的,所以它会很好地缓存在scriptengine中,而且每个请求的额外成本都不高。