是否有可能在遍历中得到 which or condition resulted true?

Is it possible to get which or condition resulted true in traversals?

我们有一个照片共享服务,其中一个可以允许或拒绝其他用户组查看或不查看。我们将此服务公开为 API /view?caller=userId&photoId=photoId。我们正在使用 AWS Neptune Graph 数据库服务来维护此授权并使用 tinkerpop java 库。

为了代码的可维护性,我们从其他 class 方法中获取可能的路径,并从外部调用 canUserView 方法。

public boolean canUserView(User user, String photoId) {
    return graph.V(user.getId()).hasLabel("user").or(getPossibleTraversals(user)).hasNext();
}

private GraphTraversal<Object, Vertex>[] getPossibleTraversals(User user) {
    List<GraphTraversal<Vertex, Vertex>> traversals = collectTraversalsFromExternal();
    return traversals.toArray(GraphTraversal[]::new);
}

collectTraversalsFromExternal() 查询我们的其他数据存储,并根据结果形成查询。 在每个or遍历的最后我们注入唯一的常量值来标识遍历。

我们之前使用 .union() 来获取结果和常量值。但是由于现在使用 .or() 条件的性能问题。

这可能是个愚蠢的问题。是否有可能获得哪个遍历为真的参考?

使用航线数据集,这是您实现目标的一种方法。

or 将过滤掉所有不在德克萨斯州或佐治亚州的机场。之后 choose 步骤 return 是一个 constant 指示采用了哪条 or 路径。您当然可以做一些更有趣的事情,return 查询中的常量值。

gremlin> g.V(1,3,12).values('region')
==>US-GA
==>US-TX
==>US-NY

gremlin> g.V(1,3,12).
......1>   or(has('region','US-GA'),
......2>      has('region', 'US-TX')).
......3>   choose(has('region','US-GA'),constant(1),constant(2))      

==>1
==>2