在Gremlin/TinkerPop遍历中添加一批边时,如何从注入对象中提取特定属性值?



我想添加一批边到已经包含节点的JanusGraph数据库。我希望我的边支持设置动态/可选属性。

我拼凑了下面的遍历(基于这个SO问题),我相信它说明了我想要做的事情:

1。.inject():一批边2. 从注入边缘批处理的对象中拉出顶点id3.使用.sideEffect()

将边缘批处理对象中的所有字段设置为边缘属性
uuid_1 = "89079f8fa3ee849a61a45e0b3e6d28cd"
uuid_2 = "00a9ae430dc812f483b0660212264190"
edge_batch = [
{
"from_uuid": uuid_1,
"to_uuid": uuid_2,
"posted_at": 1650012568000,
"test_property_2": "I was here"
},
{
"from_uuid": uuid_2,
"to_uuid": uuid_1,
"posted_at": 1650012568888,
"test_property_3": "I'M STILL HERE"
}
]
new_edges = (
g
.inject(edge_batch)
.unfold()
.as_("edge_batch")
.V()
.has("uuid", __.select("edge_batch").select("to_uuid"))
.as_("to_v")
.V()
.has("uuid", __.select("edge_batch").select("from_uuid"))
.addE("MY_EDGE_TYPE")
.to("to_v")
.as_("new_edge")
.sideEffect(
__.select("edge_batch")
.unfold()
.as_("kvp")
.select("new_edge")
.property(
__.select("kvp").by(Column.keys), __.select("kvp").by(Column.values)
)
)
.iterate()
)
如上所述,当引用的顶点存在时,上面的代码会导致遍历超时。如果我将上面的前两个__.select("edge_batch")...表达式替换为对uuid_1uuid_2变量的引用,代码就可以工作了。我想我的问题是我只是不能弄清楚我应该如何引用注入的属性,展开的边缘批处理对象。

我使用的是gremlin-python v3.6.0, JanusGraph v0.6.1, TinkerPop v3.5.1.

您的代码在一个小图形上运行得很好。只是,从包含两个元素的列表中展开两个会使代码运行四次,我猜是无意的。至于为什么代码不能在janusgraph安装上运行:

  • 如果您的图形很大,请确保uuid是一个索引属性
  • 也许您对在janusgraph缓存中存在的uuid_1和uuid_2的顶点感到困惑,因为.has("uuid", ___select ("edge_batch").select("to_uuid"))和.has("uuid", uuid_1)实际上做同样的事情。

最新更新