【发布时间】:2020-11-23 00:25:25
【问题描述】:
这是我的测试数据:
graph = TinkerGraph.open()
g= graph.traversal()
g.addV('Account').property('id',"0x0").as('a1').
addV('Account').property('id',"0x1").as('a2').
addV('Account').property('id',"0x2").as('a3').
addV('Token').property('address','1').as('tk1').
addV('Token').property('address','2').as('tk2').
addV('Token').property('address','3').as('tk3').
addV('Trx').property('address','1').as('Trx1').
addV('Trx').property('address','1').as('Trx2').
addV('Trx').property('address','3').as('Trx3').
addE('sent').from('a1').to('Trx1').
addE('sent').from('a2').to('Trx2').
addE('received_by').from('Trx1').to('a2').
addE('received_by').from('Trx2').to('a3').
addE('distributes').from('a1').to('tk1').
addE('distributes').from('a1').to('tk2').
addE('distributes').from('a1').to('tk3').
iterate()
我需要首先使用分发关系获取所有令牌地址,然后使用这些值循环遍历。这是我需要一个令牌的示例
h = g.V().has('Account','id','0x0').next()
token = '1'
g.V(h).
out('sent').has('address',token).as('t1').
out('received_by').as('a2').
out('sent').has('address',token).as('t2').
out('received_by').as('a3').
select('a3','a2'). \
by('id').toList()
这是输出:
[a3:0x2,a2:0x1]
我可以省略它并通过在遍历结束时放置 where('t1',eq('t2')).by('address') 来确保令牌地址相同,而不是在每个跃点上执行 has('address',token),但考虑到我的数据库设计和索引,这表现不佳.
所以我要做的迭代是:
tokens = g.V(h).out('distributes').values('address').toList()
finalList = []
for (token in tokens){
finalList.add(g.V(h).
out('sent').has('address',token).
out('received_by').as('a2').
out('sent').has('address',token).
out('received_by').as('a3').
select('a3','a2'). \
by('id').toList())
}
这是最后存储在 finalList 中的内容:
==>[[a3:0x2,a2:0x1]]
==>[]
==>[]
这可行,但我想知道如何在不离开 Gremlin 且不引入 for 循环的情况下以这种方式迭代该令牌列表。此外,我的结果包含不是最佳的空结果。对我来说,这里的关键是始终能够使用 Account 节点曾经发送过的令牌为每个跃点执行 has('address',token)。非常感谢。
【问题讨论】:
-
能否提供一个 Gremlin 脚本来创建一些示例数据 - 这是一个示例 stackoverflow.com/questions/51388315/…
-
@stephenmallette 我添加了我的测试数据并编辑了整个解释以使其更清晰。谢谢。
标签: gremlin janusgraph datastax-enterprise-graph