有没有办法重用聚合步骤?

GuðjónRagnar Brynjarsson

我有一个存储不同类型实体的图形数据库,并且正在构建一个API以从图形中获取实体。但是,这有点复杂,因为对于每种类型的实体,都有一组规则用于获取相关实体以及原始实体。为此,我使用了聚合步骤将要提取的所有相关实体聚合到集合中。

另一个要求是获取一批实体(和相关实体)。我将通过更改has获取实体以使用步骤P.within并将聚合映射到每个找到的实体步骤来执行此操作如果我继续获取单个实体,则此方法有效,但是如果我要获取两个实体,则我的结果集对于第一个实体将是正确的,但是第二个的结果集将包含第一个实体的结果及其自身的结果。我认为这是因为第二个集合将简单地从第一个集合添加到集合集合中,因为聚合键是相同的。我还没有找到清除第一个和第二个之间的集合的任何方法,也没有找到具有动态聚合副作用键的任何方法。

码:


return graph.traversal().V()
    .hasLabel(ENTITY_LABEL)
    .has("entity_ref", P.within(entityRefs)) // entityRefs is a list of entities I am looking for
    .flatMap(
        __.aggregate("match")
          .sideEffect(
                // The logic that applies the rules lives here. It will add items to "match" collection.
          )
          .select("match")
          .fold()
    )
    .toStream()
    ...

结果应为实体列表的列表,其中外部列表​​中的第一个实体列表包含中的第一个实体的entityRefs结果,第二个实体列表包含中的第二个实体的结果entityRefs

例如:我要为实体裁判取顶点AB及其相关实体。假设我期望结果为[[A, C], [B, D, E]],但得到结果[[A, C], [A, C, B, D, E]](第二个结果包含第一个结果)。

问题:

  1. 选择后是否有清除“匹配”集合的方法?
  2. 有没有一种方法可以让我为每个动态创建副作用的动态副作用键entityRef
  3. 我可能有其他方法可以做到这一点吗?
  4. 我误认了问题吗?

编辑:这是一个示例,是该问题的缩影。该图的设置如下:

g.addV('entity').property('id',1).property('type', 'customer').as('1').
  addV('entity').property('id',2).property('type', 'email').as('2').
  addV('entity').property('id',6).property('type', 'customer').as('6').
  addV('entity').property('id',3).property('type', 'product').as('3').
  addV('entity').property('id',4).property('type', 'subLocation').as('4').
  addV('entity').property('id',7).property('type', 'location').as('7').
  addV('entity').property('id',5).property('type', 'productGroup').as('5').
  addE('AKA').from('1').to('2').
  addE('AKA').from('2').to('6').
  addE('HOSTED_AT').from('3').to('4').
  addE('LOCATED_AT').from('4').to('7').
  addE('PART_OF').from('3').to('5').iterate()

我想获取一批实体,给定它们的ID并获取相关实体。应该返回哪些相关实体是原始实体类型的函数。我当前的查询是这样的(在此示例中稍作修改):

g.V().
    hasLabel('entity').
    has('id', P.within(1,3)).
    flatMap(
        aggregate('match').
        sideEffect(
            choose(values('type')).
                option('customer',
                    both('AKA').
                        has('type', P.within('email', 'phone')).
                        sideEffect(
                            has('type', 'email').
                                aggregate('match')).
                        both('AKA').
                        has('type', 'customer').
                        aggregate('match')).
                option('product',
                    bothE('HOSTED_AT', 'PART_OF').
                        choose(label()).
                        option('PART_OF',
                            bothV().
                                has('type', P.eq('productGroup')).
                                aggregate('match')).
                        option('HOSTED_AT',
                            bothV().
                                has('type', P.eq('subLocation')).
                                aggregate('match').
                                both('LOCATED_AT').
                                has('type', P.eq('location')).
                                aggregate('match')))
        ).
        select('match').
        unfold().
        dedup().
        values('id').
        fold()
    ).
    toList()

如果我仅获取一个实体,我将获得正确的结果。因为id: 1我得到[1,2,6]id: 3我得到[3,5,4,7]但是,当我两者都获取时,我得到:

==>[3,5,4,7]
==>[3,5,4,7,1,2,6]

第一个结果正确,但第二个结果包含两个ID的结果。

贾维斯

您可以利用(记录得不好,说实话,但遍历步骤看似强大)group().by(key).by(value)

这样一来,您就可以删除aggregate()引起麻烦的副作用步骤。作为一种选择,可以将与某些遍历匹配的多个顶点收集到我使用的列表中union()

使用您发布的图表的示例(为简便起见,我仅包括“客户”选项):

g.V().
    hasLabel('entity').
    has('id', P.within(1,3)).
    <String, List<Entity>>group()
      .by("id")
      .by(choose(values("type"))
        .option('customer', union(
          identity(),
          both('AKA').has('type', 'email'),
          both('AKA').has('type', within('email', 'phone')).both('AKA').has('type', 'customer'))
          .map((traversal) -> new Entity(traversal.get())) //Or whatever business class you have 
          .fold() //This is important to collect all 3 paths in the union together
        .option('product', union()))
     .next()
    

这种遍历具有明显的缺点,即代码更加冗长。它声明它将两次从客户那里跳过“ AKA”。您的遍历只声明了一次。

但是,它确实使步骤by(value)一部分group()在不同的键之间分开的。这就是我们想要的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有办法重用数据注释?

来自分类Dev

有没有办法重用WebService?Java的春天

来自分类Dev

有没有办法合并这些json聚合?

来自分类Dev

有没有办法在代码中重用具有不同值的函数?

来自分类Dev

有没有办法重新运行Plone中的升级步骤?

来自分类Dev

有没有办法监视Pytorch中优化程序的步骤?

来自分类Dev

有没有办法允许cloudbuild步骤访问GCP中的Cloud SQL

来自分类Dev

除了使用临时表之外,有没有办法在单独的步骤中过滤/排序?

来自分类Dev

有没有办法将方法包含在表单布局的响应步骤中

来自分类Dev

有没有办法使多步骤工作表更改宏工作?

来自分类Dev

有没有办法在训练步骤后直接更新层/变量的权重?

来自分类Dev

有没有办法在给定的int32_t上重用std :: atomic?

来自分类Dev

有没有办法在ELKI中将Optics算法的输出重用于Optics Xi?

来自分类Dev

有没有办法可以保存用户输入然后在 python 中重用它?

来自分类Dev

有没有办法允许在聚合物中绑定安全的html数据?

来自分类Dev

有没有办法允许在聚合物中绑定安全的html数据?

来自分类Dev

聚合物保留事件太短了,有没有办法延长它?

来自分类Dev

有没有办法从 GetStream webhook 检索聚合通知

来自分类Dev

Matlab Euler Explicit ode 求解器具有自适应步骤,有没有办法使代码更快?

来自分类Dev

有没有办法在 GCC 或 cl.exe 的预处理和编译之间插入一个步骤?

来自分类Dev

有没有办法使用 SAS 数据步骤添加记录计数列,当变量更改时会增加?

来自分类Dev

有没有办法通过道具传递动作?使用react-redux制作可重用组件

来自分类Dev

有没有办法在HTML中多次使用同一代码(代码可重用性)?

来自分类Dev

有没有办法在模块中设置数据以在 Ruby 的模块方法中重用它?

来自分类Dev

有没有办法在运行时重用 Hibernate 实现 Bean 验证的就地验证?

来自分类Dev

有没有办法通过沿时间维度计算每个单元格的模式来聚合 xarrray DataArray?

来自分类Dev

有没有办法将聚合值传递给 Vega Lite 中简单直方图上的工具提示编码

来自分类Dev

有没有办法比较lambda?

来自分类Dev

有没有办法缩短is / as构造?

Related 相关文章

  1. 1

    有没有办法重用数据注释?

  2. 2

    有没有办法重用WebService?Java的春天

  3. 3

    有没有办法合并这些json聚合?

  4. 4

    有没有办法在代码中重用具有不同值的函数?

  5. 5

    有没有办法重新运行Plone中的升级步骤?

  6. 6

    有没有办法监视Pytorch中优化程序的步骤?

  7. 7

    有没有办法允许cloudbuild步骤访问GCP中的Cloud SQL

  8. 8

    除了使用临时表之外,有没有办法在单独的步骤中过滤/排序?

  9. 9

    有没有办法将方法包含在表单布局的响应步骤中

  10. 10

    有没有办法使多步骤工作表更改宏工作?

  11. 11

    有没有办法在训练步骤后直接更新层/变量的权重?

  12. 12

    有没有办法在给定的int32_t上重用std :: atomic?

  13. 13

    有没有办法在ELKI中将Optics算法的输出重用于Optics Xi?

  14. 14

    有没有办法可以保存用户输入然后在 python 中重用它?

  15. 15

    有没有办法允许在聚合物中绑定安全的html数据?

  16. 16

    有没有办法允许在聚合物中绑定安全的html数据?

  17. 17

    聚合物保留事件太短了,有没有办法延长它?

  18. 18

    有没有办法从 GetStream webhook 检索聚合通知

  19. 19

    Matlab Euler Explicit ode 求解器具有自适应步骤,有没有办法使代码更快?

  20. 20

    有没有办法在 GCC 或 cl.exe 的预处理和编译之间插入一个步骤?

  21. 21

    有没有办法使用 SAS 数据步骤添加记录计数列,当变量更改时会增加?

  22. 22

    有没有办法通过道具传递动作?使用react-redux制作可重用组件

  23. 23

    有没有办法在HTML中多次使用同一代码(代码可重用性)?

  24. 24

    有没有办法在模块中设置数据以在 Ruby 的模块方法中重用它?

  25. 25

    有没有办法在运行时重用 Hibernate 实现 Bean 验证的就地验证?

  26. 26

    有没有办法通过沿时间维度计算每个单元格的模式来聚合 xarrray DataArray?

  27. 27

    有没有办法将聚合值传递给 Vega Lite 中简单直方图上的工具提示编码

  28. 28

    有没有办法比较lambda?

  29. 29

    有没有办法缩短is / as构造?

热门标签

归档