在 JanusGraph 中,我想替换 SET(或 LIST)属性的整个值。根据这篇文章,存储后端和索引后端(ES、Solr)的行为都必须考虑到一致性和效率,但这篇文章是关于 Titan 1.0 的。
目前,我有两种选择,如下所示。哪一个更好 ?或者有没有最好的方法来更新 JanusGraph 中的 SET/LIST 属性。
- JanusGraph 版本:github 大师
- 小鬼版本:3.2.6
示例架构
mgmt = graph.openManagement()
person = mgmt.makeVertexLabel('Person').make()
name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(SET).make()
mgmt.buildIndex('i_person_name', Vertex.class).addKey(name, Mapping.STRING.asParameter()).buildMixedIndex('elastic-search')
mgmt.commit()
person = g.addV('Person').property('name', 'Alexander').property('name', 'Alex').next()
g.tx().commit()
解决方案 1
删除整个属性值,然后设置新值。
new_names = ['Alex', 'Alexander Emmanuel Rodriguez'] as Set
v = g.V().hasLabel('Person').has('name', 'Alexander').next()
g.V(v).properties('name').drop().iterate()
new_names.each{
v.property('name', it)
}
g.tx().commit()
解决方案 2
仅删除旧值并仅设置新值。
new_names = ['Alex', 'Alexander Emmanuel Rodriguez'] as Set
v = g.V().hasLabel('Person').has('name', 'Alexander').next()
v.properties('name').each {
new_names.remove(it.value()) ? null : it.remove()
}
new_names.each {
v.property('name', it)
}
g.tx().commit()