【问题标题】:Alternative to combining where & and steps in gremlin query在 gremlin 查询中组合 where & 和 steps 的替代方法
【发布时间】:2020-07-08 01:03:32
【问题描述】:

我正在努力编写一个使用and 步骤的多个谓词的快速查询 在亚马逊海王星。基本图结构如下,用于对生物数据进行建模。设置是有“途径”连接到“酶”,“酶”连接到“反应”,“反应”连接到“化合物”。我正在尝试过滤路径,以便只有那些连接到多种化合物的路径才会返回,例如找出与化合物 1 和化合物 2 相关的途径。

g.addV('pathway').property('name', 'pathway 1').as('p1').
  addV('pathway').property('name', 'pathway 2').as('p2').
  addV('pathway').property('name', 'pathway 3').as('p3').
  addV('enzyme').property('name', 'enzyme 1').as('e1').
  addV('enzyme').property('name', 'enzyme 2').as('e2').
  addV('enzyme').property('name', 'enzyme 3').as('e3').
  addV('reaction').property('name', 'reaction 1').as('r1').
  addV('reaction').property('name', 'reaction 2').as('r2').
  addV('reaction').property('name', 'reaction 3').as('r3').
  addV('compound').property('name', 'compound 1').as('c1').
  addV('compound').property('name', 'compound 2').as('c2').
  addV('compound').property('name', 'compound 3').as('c3').
  addV('compound').property('name', 'compound 4').as('c4').
  addV('compound').property('name', 'compound 5').as('c5').
  addV('compound').property('name', 'compound 6').as('c6').
  addE('contains').from('p1').to('e1').
  addE('contains').from('p1').to('e2').
  addE('contains').from('p1').to('e3').
  addE('contains').from('p2').to('e1').
  addE('contains').from('p3').to('e2').
  addE('partof').from('e1').to('p1').
  addE('partof').from('e2').to('e1').
  addE('partof').from('e3').to('p1').
  addE('partof').from('e1').to('p2').
  addE('partof').from('e2').to('p3').
  addE('catalyzes').from('e1').to('r1').
  addE('catalyzes').from('e2').to('r2').
  addE('catalyzes').from('e3').to('r3').
  addE('substrate').from('c1').to('r1').
  addE('product').from('r1').to('c2').
  addE('substrate').from('c3').to('r2').
  addE('product').from('r2').to('c4').
  addE('substrate').from('c5').to('r3').
  addE('product').from('r3').to('c6')

我目前的解决方案是从通路节点开始,结合使用whereand 步骤进行过滤:

g.V().hasLabel('pathway').where(and(
  out('contains').hasLabel('enzyme').
    out('catalyzes').hasLabel('reaction').both().has('compound', 'name', 'compound 6'),
  out('contains').hasLabel('enzyme').
    out('catalyzes').hasLabel('reaction').both().has('compound', 'name', 'compound 4')
  )
).valueMap().toList()

这很好用,我可以搜索任意数量的化合物,但速度很慢,需要几秒钟才能运行查询。

相比之下,如果我从复合节点开始并遍历路径,它几乎是瞬时的,但我不知道如何复制上面的多个谓词:

g.V().has('compound', 'name', 'compound 6').both().
  in('catalyzes').out('partof').hasLabel('pathway').dedup().valueMap().toList()

对于这个玩具数据集,两个查询都很快,但在我的生产数据库中,有 1000 条通路、6000 种酶、10000 种反应和 50000 种化合物,查询可能需要 3-5 秒才能运行。

amazon neptune 中是否有替代 where-and 模式的替代方案,我用于基于多个谓词进行过滤可能会获得更好的性能?

【问题讨论】:

    标签: gremlin amazon-neptune


    【解决方案1】:

    由于and步骤内部的匿名遍历基本相同。 您可以将其替换为 within 并计算不同的值:

    g.V().hasLabel('pathway').where(
      out('contains').hasLabel('enzyme').
        out('catalyzes').hasLabel('reaction').
        both().has('compound', 'name', within('compound 6', 'compound 4'))
        .values('name').dedup().count().is(2)
      ).valueMap()
    

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

    如果您从“复合”顶点开始获得更好的性能,您可以尝试以下方法:

    g.V().
      has('compound', 'name', within('compound 6', 'compound 4')).as('compound').
      both().in('catalyzes').in('contains').hasLabel('pathway').
      group().
        by().
        by(select('compound').values('name').dedup().count()).
      unfold().
      where(select(values).is(2)).select(keys).
      valueMap()
    

    示例:https://gremlify.com/c78cabauv7q/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      相关资源
      最近更新 更多