【问题标题】:Iterate list of values from traversal A in traversal B (Gremlin)在遍历 B (Gremlin) 中迭代遍历 A 的值列表
【发布时间】: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


【解决方案1】:

您要达到的目标仍然不确定。

不过,我认为这个查询可以满足您的需要:

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()

示例:https://gremlify.com/spwya4itlvd

【讨论】:

    猜你喜欢
    • 2021-10-30
    • 2021-12-21
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多