【问题标题】:Gremlin query uneven result issueGremlin 查询结果不均匀问题
【发布时间】:2017-10-27 06:04:07
【问题描述】:

假设我有 3 名学生(A、B、C),并且有一个主修科目和相应的分数,但是当我查询结果显示不均匀时。

数据

A -> 数学 -> 77

B -> 历史 -> 70

C -> 科学 -> 97

查询

g.V('Class').has('name',within('A','B','C'))

结果

{"student_name":['A','B','C'], "major_subject":['Math','Science','History'], "marks":[70,77,97]}

查询数据库显示的数据不是按照学生姓名排序的。

【问题讨论】:

  • @stephenmallette 你能帮我解决上述问题吗?
  • 我认为您可能需要稍微完善您的问题。我不了解您如何从该数据到该查询到该结果。您能否将“数据”部分替换为创建数据的实际 Gremlin 脚本,如下所示:stackoverflow.com/a/46685888/1831717?然后更新“查询”部分以更接近您正在执行的实际遍历?也许那时我能理解得更好。谢谢

标签: gremlin


【解决方案1】:

我假设您的图表看起来像这样:

g = TinkerGraph.open().traversal()
g.addV('student').property('name', 'A').
    addE('scored').to(addV('subject').property('name', 'Math')).
      property('mark', 77).
  addV('student').property('name', 'B').
    addE('scored').to(addV('subject').property('name', 'History')).
      property('mark', 70).
  addV('student').property('name', 'C').
    addE('scored').to(addV('subject').property('name', 'Science')).
      property('mark', 97).iterate()

现在收集数据最简单的方法是:

gremlin> g.V().has('student', 'name', within('A', 'B', 'C')).as('student').
           outE('scored').as('mark').inV().as('major').
           select('student','major','mark').
             by('name').
             by('name').
             by('mark')
==>[student:A,major:Math,mark:77]
==>[student:B,major:History,mark:70]
==>[student:C,major:Science,mark:97]

但如果你真的依赖问题中显示的格式,你可以这样做:

gremlin> g.V().has('student', 'name', within('A', 'B', 'C')).
           store('student').by('name').
           outE('scored').store('mark').by('mark').
           inV().store('major').by('name').
           cap('student','major','mark')
==>[major:[Math,History,Science],student:[A,B,C],mark:[77,70,97]]

如果您想获得按标记排序的封顶结果,则需要混合使用 2 个查询:

gremlin> g.V().has('student', 'name', within('A', 'B', 'C')).as('a').
           outE('scored').as('b').
           order().
             by('mark').
           inV().as('c').
           select('a','c','b').
             by('name').
             by('name').
             by('mark').
           aggregate('student').by(select('a')).
           aggregate('major').by(select('b')).
           aggregate('mark').by(select('c')).
           cap('student','major','mark')
==>[major:[History,Math,Science],student:[B,A,C],mark:[70,77,97]]

按输入顺序排序:

gremlin> input = ['C', 'B', 'A']; []
gremlin> g.V().has('student', 'name', within(input)).as('a').
           order().
             by {input.indexOf(it.value('name'))}.
           outE('scored').as('b').
           inV().as('c').
           select('a','c','b').
             by('name').
             by('name').
             by('mark').
           aggregate('student').by(select('a')).
           aggregate('major').by(select('b')).
           aggregate('mark').by(select('c')).
           cap('student','major','mark')
==>[major:[97,70,77],student:[C,B,A],mark:[Science,History,Math]]

【讨论】:

  • 当我在“ inside('B','A','C') ”中更改顺序时,我仍然得到答案为“==>[major:[Math,History ,Science],student:[A,B,C],mark:[77,70,97]]" 但我需要按 B,A,C 的顺序回答。 @stephenmallette
  • 图表中的顺序标准是什么?任何数字字段?
  • 添加了一个示例,说明如何按标记对封顶结果进行排序。
  • 有没有什么方法可以根据 'within' 元素中给出的顺序对结果进行排序,例如 'within('C','A','B')' 而不依赖于任何顺序标准
  • 您可以将其设为外部列表并按“元素”索引排序;不过这需要一个 lambda。
猜你喜欢
  • 2012-01-04
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多