为了账号安全,请及时绑定邮箱和手机立即绑定

Gremlin 查询的 Union 方法的使用及其对 Neptune 交易的影响

Gremlin 查询的 Union 方法的使用及其对 Neptune 交易的影响

暮色呼如 2023-07-28 16:50:50
假设我在 AWS Neptune 上创建了一个图,并且想要获取有关某个顶点的多个信息。我使用 union 方法通过以下查询获取多个信息,this.graphTraversalSource.V().hasLabel("label1").hasId("id1")                .union(__.valueMap(true) ,__.outE().groupCount().by(T.label).unfold(),                   __.inE("created_post").outV().valueMap(true))简单来说,查询试图获取以下内容: 1. 顶点本身的属性。2. 出边及其计数 3. 创建 id1 帖子的用户的属性 上面的查询返回一个Gremlin-Server 上上述查询的示例结果如下所示=>{label=label1, id=id1, text=[My sample text]}==>has_comment=1==>has_like=1==>{label=user, id=user1}现在,假设我要用 Java 编写这些内容,正如您所知,查询必须以 next() 或 iterate() 结束。如果我输入 next(),那么将返回上述结果中的第一项。{label=label1, id=id1, text=[My sample text]}。但是,如果我尝试使用 next(4) 那么我将得到完整的结果。或者,我知道我可以使用next() and hasNext()GraphTraversal 根据需要获取结果,而无需使用next(4)我担心提交给海王星的交易,因为根据他们的说法事务 Neptune 在每次 Gremlin 遍历开始时打开一个新事务,并在成功完成遍历后关闭事务。当出现错误时,事务会回滚。单个事务中包含由分号 (;) 或换行符 (\n) 分隔的多个语句。除最后一条语句之外的每个语句都必须以要执行的 next() 步骤结束。只返回最终的遍历数据。不支持使用 tx.commit() 和 tx.rollback() 的手动事务逻辑。根据上面的内容,我了解到每个 .next() 语句都会导致在 Neptune 上发生一次 tx。说了这么多,我的问题是,我对海王星交易技术的理解是否属实?如果是,这是否意味着每次我写.next()一个事务都会发生?其行为如何.next(int),例如使用是否.next(4)意味着将发生 4 笔交易?我该如何优化这个?使用一次数据库访问和一项事务来获取所有需要的数据?即有没有更好的方法来满足我的需求?如何使用一行获取上述查询的所有结果?即不使用 hasNext() 和 next() 方法?有没有办法知道结果集的大小,从而使用 next(result-set-size) 方法?谢谢哈迪
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

next()您可以通过and之外的多种方式终止遍历iterate()- 例如toList()抓取所有结果并将它们打包到一个List对象中。我想说这是人们终止遍历的最常见方式(并且最容易使用),假设您不介意List在客户端上实现内存中。

由于 Neptune 使用 TinkerPop 驱动程序,我可以说对next()(或toList() or other terminators) on bytecode-based traversals will not trigger additional requests to Neptune and therefore not start new transactions. The call tonext() ,toList()` 的调用以及其他终止步骤对流回客户端的数据进行操作。

我相信您指出的这部分文档:

单个事务中包含由分号 (;) 或换行符 (\n) 分隔的多个语句。除最后一条语句之外的每个语句都必须以要执行的 next() 步骤结束。只返回最终的遍历数据。

与基于脚本的执行相关,并且可能不适用,因为您似乎正在使用基于字节码的遍历。


查看完整回答
反对 回复 2023-07-28
  • 1 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信