gpt4 book ai didi

gremlin - 在 gremlin 查询中组合 where & 和 steps 的替代方法

转载 作者:行者123 更新时间:2023-12-04 04:03:03 26 4
gpt4 key购买 nike

我正在努力编写一个快速查询,该查询使用 and 步骤使用多个谓词在亚马逊海王星。基本图结构如下,用于对生物数据建模。设置是有“途径”连接到“ enzyme ”,“ enzyme ”连接到“ react ”,“ react ”连接到“化合物”。我正在尝试过滤路径,以便仅返回连接到多个化合物的路径,例如找到与化合物 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 个 enzyme 、10000 个 react 和 50000 个化合物,查询可能需要 3-5 秒才能运行。

在 amazon neptune 中是否有替代 where-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

关于gremlin - 在 gremlin 查询中组合 where & 和 steps 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62786034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com