【问题标题】:Gremlin - batch query for adding a vertices if it doesn't existGremlin - 如果不存在则添加顶点的批量查询
【发布时间】:2021-12-13 02:04:53
【问题描述】:

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

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

注意:需要避免使用 Gremlin 脚本。所以遍历是我正在寻找的。​​strong>

【问题讨论】:

  • 你能分享一下你目前尝试过的Gremlin吗?我假设您想要结合 injectcoalesce 来执行此操作?
  • 我是 Gremlin 的新手,所以我不知道注入和合并的目的。我尝试了简单的批处理。例如:g.addV("User").property(id, "user1").property("name", "user1").as("user1")。 addV("User").property(id, "user2").property("name", "user2").as("user2").next()。这最多可以添加 200 到 1000,并且此查询正在添加顶点而不检查图中是否存在数据。
  • 我会尽快写一个例子作为答案。本质上,您可以inject 将地图放入遍历中并使用它来填充顶点和/或边。 coalesce 步骤有助于更新插入模式,例如“如果不存在则创建”

标签: gremlin amazon-neptune gremlin-server gremlinjs


【解决方案1】:

可以使用包含要插入的数据的地图列表来为查询播种。您可以进一步扩展该模式以使用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]    

【讨论】:

  • 谢谢。它在 Gremlin 控制台中按预期工作。现在我正在尝试使用 Gremlin JavaScript 语言变体来实现它
猜你喜欢
  • 2020-07-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2018-02-12
  • 2022-06-12
  • 2019-06-13
  • 1970-01-01
  • 2019-02-26
相关资源
最近更新 更多