【问题标题】:Efficient way to replace SET/LIST property in Janusgraph在 Janusgraph 中替换 SET/LIST 属性的有效方法
【发布时间】:2017-09-01 05:23:25
【问题描述】:

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

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

  • JanusGraph 版本:github 大师
  • Gremlin 版本: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()

【问题讨论】:

    标签: gremlin tinkerpop3 janusgraph


    【解决方案1】:

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

    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]]
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-27
    • 2010-11-28
    • 1970-01-01
    • 2011-07-02
    • 2018-11-02
    相关资源
    最近更新 更多