【问题标题】:Gremlin: project().by() want to reduce number of traversalsGremlin:project().by() 想要减少遍历次数
【发布时间】:2023-01-12 03:46:33
【问题描述】:

我有一个 Gremlin 查询,我想在其中报告有关学校环境中家庭的某些统计数据。对于每位家长,我想计算他们家庭的某些统计数据:男孩/女孩的数量、参加 STEM 课程的孩子数量等。我正在使用 project().by() 来确保我报告每个家庭的统计数据父母,即使他们没有符合条件的孩子(例如孩子尚未上学的父母)。

我的查询从寻找父母开始。但是,当我尝试获取他们孩子的列表时,我的所有统计数据都是针对所有孩子的,而不仅仅是特定父母的孩子。如果查找子项的遍历步骤是在 by() 步骤内执行的,我会得到父项的子项的正确统计信息。但这意味着我必须在每个 by() 步骤中复制这些遍历步骤。

我的查询看起来像这样:

g.V().hasLabel('Parent').
    project('Parent', 'boys', 'girls', 'STEM_students', 'sport_participants').
    by('name').
    by( <traversal to find parent's children>.
        <filter parent's boys>.count()).
    by( <traversal to find parent's children>.
        <filter parent's girls>.count()).
    by( <traversal to find parent's children>.
        <filter parent's STEM students>.count()).
    by( <traversal to find parent's children>.
        <filter parent's sports students>.count())

我在这个查询中得到了正确的答案,但必须运行遍历四次才能找到每个父母的孩子。我想为每个父母运行一次遍历。关于如何改革我的查询的建议?

【问题讨论】:

    标签: gremlin


    【解决方案1】:

    尝试按父项对子项遍历进行分组,然后您可以直接使用折叠列表运行进一步的遍历,而不必在 project-by 调制器中一次又一次地运行子项遍历。

    g.V().
      hasLabel('Parent').
      group().by().by(<traversal_to_find_children>).
      unfold().as('data').
      select('values').as('grouped_children').
      select('data').select(keys).
      project('Parent','boys','girls','STEM_students','sport_participants').
        by('name').
        by(
          select('grouped_children').
          unfold().
          <traversal_to_find_boys>.count()).
        by(
          select('grouped_children').
          unfold().
          <traversal_to_find_girls>.count()).
        by(
          select('grouped_children').
          unfold().
          <traversal_to_find_stem_students>.count()).
        by(
          select('grouped_children').
          unfold().
          <traversal_to_find_sports_students>.count())
    

    【讨论】:

    • 我已经删除了 select(values) 步骤中的引号,因为我没有得到带引号的数据。但是,现在我只获取每个父母的第一个孩子的数据,而不是他们所有孩子的数据。我错过了什么?
    • 是的,感谢您将值从引号更改为不带引号。您可以在 <traversal_to_find_children> 之后尝试折叠吗?
    • 额外的折叠有帮助,但在尝试生成父名称时出现错误(我尚未将计数遍历添加到我的结果集中): by("name") 调制器只能应用于一个遍历器元素或地图
    • 。折叠()。展开().as('数据')。选择(值).as('grouped_children').select('data').select(键)。项目('父母')。按名字')
    • 在错误消息之后,我得到了所有父顶点的列表
    【解决方案2】:

    我更新的查询:

        g.V().
            hasLabel('Parent').
            group().by().by(<traversal_to_find_children>).
            unfold().as('data').
            select(values).as('grouped_children').
            select('data').select(keys).unfold().
            project('Parent','boys','girls','STEM_students','sport_participants').
                by('name').
                by(
                   select('grouped_children').
                   unfold().
                   <traversal_to_find_boys>.count()).
                by(
                   select('grouped_children').
                   unfold().
                   <traversal_to_find_girls>.count()).
                by(
                   select('grouped_children').
                   unfold().
                   <traversal_to_find_stem_students>.count()).
                by(
                   select('grouped_children').
                   unfold().
                   <traversal_to_find_sports_students>.count())
    

    这项工作尚未完成(我仍在统计数据),但我看到了进展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 2012-10-04
      相关资源
      最近更新 更多