【问题标题】:Is there a false function in tinkerpop gremlin?tinkerpop gremlin 中是否有错误功能?
【发布时间】:2021-04-05 06:11:13
【问题描述】:

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

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

Public class Authorizer {
    List<Role> roles;
    
    public Authorizer(List<Role> roles) {
        this.roles = roles;
    }
    
    public boolean canUserView(User user, String photoId) {
        return graph.V(user.getId()).hasLabel("user").or(getPossibleTraversals(user)).hasId("photoId")
    }

    private GraphTraversal<Object, Vertex>[] getPossibleTraversals(User user) {
        List<GraphTraversal<Vertex, Vertex>> traversals = roles.getTraversal(user).map(traversal -> traversal).collect(Collectors.toList())
        return traversals.toArray(GraphTraversal[]::new);
    }
}

并且在角色类 getTraversal 中用于代码性能,根据用户信息我提供所需的遍历或者我可以提供故障遍历。

现在的问题是如何在这里提供故障遍历。现在我们假设一些不可用的顶点 ID 用于故障遍历。代码如下。

public class Role {

    public GraphTraversal<Object, Vertex> getTraversal(User user) {
        if(user.satisfies(this)) {
            return __.V("assumedUnavailableVertexId").hasLabel("absolutelynotpossible"); //This ID and label assumed
        } else {
            return actualTraversal();   //This will construct the possible traversals
        }
    }
}

如何返回Role中if case的失败遍历?有什么办法可以消除这个假设?

【问题讨论】:

  • 我不确定我是否完全理解您的问题。您是否要求一种简单的方法来返回指示失败的遍历?我经常看到在这种情况下使用像constant('Not allowed') 这样简单的东西。
  • 是的,我需要遍历失败的东西。
  • .constant("Not allowed") 的问题是,.constant() 的返回类型是 GraphTraversal 。在成功的情况下,它将是 GraphTraversal。如果我在没有类型参数的情况下设置返回类型,即 public GraphTraversal getTraversal(),那么我们的 sonarqube 会抱怨,泛型类型参数是必须的。
  • 这种情况下你能接受Traversal &lt;Object,Object&gt;吗?在 Gremlin 中,根据所采用的分支,遍历可能会产生不同的结果,这一点并不少见。
  • 我想没问题。 .constant("NotAllowed") 将在这里工作。有时很难遵守 Sonarqube 规则。 rules.sonarsource.com/java/RSPEC-1452。谢谢@KelvinLawrence

标签: java gremlin tinkerpop


【解决方案1】:

我经常看到像 constant('Not allowed') 这样简单的东西,当遍历需要返回指示存在错误/问题时。

在这种情况下(如果您需要从编译器等处进行干净的通用检查),您需要从 Traversal &lt;Object,Object&gt; 之类的东西开始,因为您的代码中的不同路径现在可能会返回不同类型的遍历。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多