Janusgraph中替换SET/LIST属性的高效方法
Efficient way to replace SET/LIST property in Janusgraph
在 JanusGraph 中,我想替换 SET(或 LIST)的整个值 属性。
根据 ,为了一致性和效率,必须考虑存储后端和索引后端(ES、Solr)行为,尽管这篇文章是关于 Titan 1.0 的。
目前,我有两种选择,如下所示。哪一个更好 ?或者是否有更新 JanusGraph 中 SET/LIST 属性 的最佳方法。
- JanusGraph 版本:github master
- 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> 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]]
在 JanusGraph 中,我想替换 SET(或 LIST)的整个值 属性。
根据
目前,我有两种选择,如下所示。哪一个更好 ?或者是否有更新 JanusGraph 中 SET/LIST 属性 的最佳方法。
- JanusGraph 版本:github master
- 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> 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]]