我将 Gremlin 与 AWS Neptune 一起使用,并尝试以原子方式添加 2 个顶点和 1 个边。我基本上使用
fold() + coalesce()
语义来遍历整个过程,这样我就可以继续创建元素(如果元素不存在的话)。这就是我想出的,想知道人们是否有更好的选择。
g.V("America")
.fold()
.coalesce(unfold(), addV("Country")
.property(T.id, "America")
.property("Population", 300_000_000))
.V("India")
.fold()
.coalesce(unfold(), addV("Country")
.property(T.id, "India")
.property("Population", 1_000_000_000))
.V("America")
.outE("connected")
.inV()
.has(T.id, "India")
.fold()
.coalesce(unfold(), addE("connected")
.property("distanceMiles", 8000)
.from(V("America"))
.to(V("India"))).next();
还有,有什么技巧可以让查询更易读吗?我正在使用 JAVA,并且由于需要链接这些步骤,因此无法将部分查询提取到它自己的方法中,以便它可以重复使用。这个理解对吗?
最后一个问题:IntelliJ 以
Unchecked generics array creation for varargs parameter
的形式向我发出有关查询的警告,在这种情况下我无法理解。有人可以帮忙澄清一下吗?
谢谢!
我可能会为您提供其他变体,但折叠/合并/展开通常是执行此操作的方法,因此代码最终看起来大致相同。请注意,有 current discussions 对这个模式的重大改进。
还有,有什么技巧可以让查询更易读吗?我正在使用 JAVA,并且由于需要链接这些步骤,因此无法将部分查询提取到它自己的方法中,以便它可以重复使用。这个理解对吗?
就我个人而言,我喜欢你采用的形式,但是没有什么可以说链接意味着如果你喜欢那种风格就不能提取部分。怎么样:
private Traversal createCountryTraversal(String id, int pop) {
return __.addV("Country").property(T.id, "America").property("Population", 300_000_000);
}
...
g.V("America")
.fold()
.coalesce(unfold(), createCountryTraversal("America", 300_000_000))
.V("India")
.fold()
.coalesce(unfold(), createCountryTraversal("India",1_000_000_000))
.V("America")
.outE("connected")
.inV()
.has(T.id, "India")
.fold()
.coalesce(unfold(), addE("connected")
.property("distanceMiles", 8000)
.from(V("America"))
.to(V("India"))).next();
您也可以将遍历对象传递给不同的函数以在它们中进行链接,然后以一种元构建器模式返回遍历。或者,如果您想要更优雅的东西,请构建一个 Gremlin DSL。
最后一个问题:IntelliJ 以 Unchecked generics array creation for varargs parameter 的形式向我发出有关查询的警告,我在此上下文中无法理解。有人可以帮忙澄清一下吗?
我认为这是
coalesce()
的问题,但 Gremlin 中的一些泛型有一种在 Java 中生成此警告的方法。我不确定是否有办法避免该警告。
更新: 从 TinkerPop 3.6.0 开始,
fold()/coalesce()/unfold()
模式已在很大程度上被mergeV()
和
mergeE()
的新步骤取代,这大大简化了执行类似更新插入操作所需的 Gremlin。