在TinkerPop3 Gremlin查询和JanusGraph中将数组的第一项作为对象获取

时间:2018-09-19 15:28:14

标签: gremlin tinkerpop tinkerpop3 janusgraph graph-traversal

在将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}...]

2 个答案:

答案 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;