Gremlin - 用于添加顶点(如果不存在)的批量查询



我们在项目中使用Gremlin JavaScript语言变体和Amazon Neptune,我们有多个批量创建顶点和边的用例。

一个简单的例子是一个包含200 - 1000个用户的数组。我需要执行一个批量查询,检查用户是否存在。如果用户存在,则添加带有属性的顶点,否则忽略该用户。所有这些条件都需要批量完成。

注意:需要避免使用Gremlin脚本。所以遍历就是我要找的。

可以使用包含要插入的数据的映射列表作为查询的种子。您可以进一步扩展该模式,使用coalesce步骤执行条件插入。使用航线数据集是一个简单的例子,它创建了一个新的XYZ机场,并计算出已经存在的其他机场。请注意,中间遍历的V步骤使得这个查询有点昂贵,因为对于列表中的每个映射,所有顶点都必须"搜索"。

g.inject([['code':'AUS'],['code':'XYZ'],['code':'SFO']]).
unfold().as('data').
coalesce(V().hasLabel('airport').
where(eq('data')).
by('code').
by(select('code')),
addV('airport').
property('code',select('code')))

还讨论了如何使用此模式来避免查询中addVaddE步骤的长链。

https://tinkerpop.apache.org/docs/current/recipes/long-traversals

运行查询时,您可以看到为XYZ机场创建了一个新ID,并为其他机场找到了现有ID。

gremlin> g.inject([['code':'AUS'],['code':'XYZ'],['code':'SFO']]).
......1>   unfold().as('data').
......2>   coalesce(V().hasLabel('airport').
......3>     where(eq('data')).
......4>       by('code').
......5>       by(select('code')),
......6>     addV('airport').
......7>       property('code',select('code')))
==>v[3]
==>v[61286]
==>v[23]    

最新更新