Gremlin Janusgraph中替换集合/列表属性的有效方法

Gremlin Janusgraph中替换集合/列表属性的有效方法,gremlin,tinkerpop3,janusgraph,Gremlin,Tinkerpop3,Janusgraph,在JanusGraph中,我想替换SET(或LIST)属性的整个值。 根据,存储后端和索引后端(ES,Solr)行为都必须考虑到一致性和效率,尽管这篇文章是关于Titan 1.0的 目前,我有两个选择,如下所示。哪一个更好?或者是否有更新JanusGraph中的SET/LIST属性的最佳方法 JanusGraph版本:github master 小精灵版本:3.2.6 示例模式 解决方案1 删除整个特性值,然后设置新值 new_names = ['Alex', 'Alexander Emma

在JanusGraph中,我想替换SET(或LIST)属性的整个值。 根据,存储后端和索引后端(ES,Solr)行为都必须考虑到一致性和效率,尽管这篇文章是关于Titan 1.0的

目前,我有两个选择,如下所示。哪一个更好?或者是否有更新JanusGraph中的SET/LIST属性的最佳方法

  • JanusGraph版本:github master
  • 小精灵版本:3.2.6
示例模式 解决方案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()
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()
解决方案2 只删除旧值,只设置新值

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()
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()

您可以在一次遍历中删除旧值并添加新值。我必须承认这不是最简单的遍历,但它是有效的:

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV("person").property(list, "name", "Alexander")
==>v[0]
gremlin> g.V().valueMap()
==>[name:[Alexander]]

gremlin> new_names = [ "Alex"
                     , "Alexander Emmanuel Rodriguez"] as Set
==>Alex
==>Alexander Emmanuel Rodriguez

gremlin> g.withSideEffect("nn", new_names).
           V().has("person","name","Alexander").as("p").
           sideEffect(
             properties("name").choose(value().where(without("nn")),
                                         drop(), value().store("x"))).barrier().
           select("nn").unfold().where(without("x")).as("n").
           select("p").property(list, "name", select("n")).iterate()

gremlin> g.V().valueMap()
==>[name:[Alex,Alexander Emmanuel Rodriguez]]

看起来很优雅,谢谢!我不知道withSideEffect,它不是用希腊参考书写的。阅读整个gremlinjavadoc会更好?不是整个javadoc,但值得一看所有可用的GraphTraversalSource方法: