在将gremlin查询从v2迁移到v3时,我遇到了这个问题。
V2方式:inE().has(some condition).outV().map().toList()[0]
将返回一个对象。这包装在transform{label: it./etc/}
步骤中。
V3方式,仍然在制品:inE().has(some condition).outV().fold()
将返回一个数组。这包装在project(...).by(...)
步骤中。
V3正常工作,我只需要手动从数组中解包一个项目即可。我想知道是否有更明智的方法(无论如何,这感觉像是非图形友好的步骤)。
环境:JanusGraph,TinkerPop3 +。对于v2:Titan图db和TinkerPop2 +。
更新:V3查询示例
inE('edge1').
has('cond1').outV(). // one vertex left
project('items', 'count'). // pagination
by(
order().
by('field1', decr).
project('vertex_itself', 'vertex2', 'vertices3').
by(identity()).
by(outE('edge2').has('type', 'type1').limit(1).inV().fold()). // now this is empty array or single-element array, can we return element itself?
by(inE('edge2').has('type', 'type2').outV().fold()).
fold()).
by(count())
所需的结果形状:
[{
items: [
{vertex_itself: Object, vertex2: Object/null/empty, veroces3: Array},
{}...
],
cont: Number,
}]
问题:vertex2
属性始终是一个数组,可以是空元素或单个元素。
期望:vertex2
为对象或为null /空。
更新2:,结果表明我的查询尚未完成,如果在has('cond1').outV()
步骤中没有单个元素,则它返回许多对象,例如[{items, count}, {items, count}...]
答案 0 :(得分:2)
我可能不太了解,但听起来像这样:
inE().has(some condition).outV().fold()
您只想获取遇到的第一个顶点。如果是正确的话,那么根本没有理由fold()
吗?也许就做:
inE().has(some condition).outV().limit(1)
答案 1 :(得分:2)
您的主要问题似乎是从遍历中获取单个项目。
您可以使用next()
进行此操作,它将在当前遍历迭代中检索下一个元素:
inE().has(some condition).outV().next()
我认为iteratee的结构是特定于实现的。例如在javascript中,您可以使用value
属性访问该项目:
const result = await inE().has(some condition).outV().next();
const item = result.value;