0

我正在使用 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}}

我的问题:如何my_dict在通过 RexPro 创建的顶点上使用新的 KV 对进行更新?


尝试的解决方法/解决方案:

当使用 Python 脚本的非参数化版本创建顶点时,也会出现同样的问题:

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

此外,不确定是否与此问题相关,但看起来在控制台中创建的新地图是 a LinkedHashMap(而 python/rexpro 代码创建了 a HashMap):

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

2 回答 2

3

更新来自顶点属性的字典/映射会绕过数据库级​​别,因为您直接修改堆上的值。换句话说,Titan 不知道您更新了地图,因此不会保留更改。

始终将属性值视为不可变的,即使它们可能是可变的 Java 对象,因为这些突变对数据库是不可见的。

这将起作用:

newdict = v.my_dict.clone()
newdict['hello']='other'
v.setProperty('my_dict',newdict)
graph.commit()
v.map
于 2013-11-15T21:35:40.400 回答
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 回答