这是我的测试数据:
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]
我可以忽略它,而不是在每一跳上都这样做has('address',token)
,而只需在遍历末尾放置一个where('t1',eq('t2')).by('address')
来确保令牌地址是相同的,但是考虑到我数据库设计和索引。
所以我要做的是迭代:
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)
。非常感谢。
答案 0 :(得分:0)
您要实现的目标仍然不确定。
不过,我认为此查询可以满足您的需求:
g.V().has('Account', 'id', '0x0').as('a').
out('distributes').values('address').as('t').
select('a').
repeat(out('sent').where(values('address').
as('t')).
out('received_by')).
emit()