合并where&;和gremlin查询中的步骤

合并where&;和gremlin查询中的步骤,gremlin,amazon-neptune,Gremlin,Amazon Neptune,我正在努力编写一个使用和步骤使用多个谓词的快速查询 在亚马逊海王星。基本图形结构如下所示,用于生物数据建模。设置是有“路径”连接到“酶”,连接到“反应”,连接到“化合物”。我正在尝试过滤路径,以便只返回那些连接到多个化合物的路径,例如,找到同时连接到化合物1和化合物2的路径 g.addV('pathway').property('name', 'pathway 1').as('p1'). addV('pathway').property('name', 'pathway 2').as('p2

我正在努力编写一个使用
步骤使用多个谓词的快速查询
在亚马逊海王星。基本图形结构如下所示,用于生物数据建模。设置是有“路径”连接到“酶”,连接到“反应”,连接到“化合物”。我正在尝试过滤路径,以便只返回那些连接到多个化合物的路径,例如,找到同时连接到化合物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')
我目前的解决方案是从路径节点开始,使用
其中
步骤的组合来进行过滤:

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中,我使用的基于多个谓词的过滤模式是否可以替代
-
模式,以获得更好的性能?

因为
步骤中的匿名遍历基本相同。
您可以在
内将其替换为
,并计算不同的值:

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()
例如:

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

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()
例如: