条件 has()

Conditional has()

我正在根据传递的参数构建查询。例如,如果传递 p1='a' 和 p2='b',我的查询将如下所示:

g.V()
  .has("p1","a")
  .has("p2","b")

如果p2没有通过,那我就不复查了:

g.V()
  .has("p1","a")

是否可以在查询内部执行参数检查,而不是在创建查询之前为参数创建条件检查?

编辑:用例基于 RESTful Web 服务,其中我有类似 /server/myEndpoint?p1=a 和端点实现将仅基于存在性使用 .has() 步骤构建 gremlin 查询p1 或 p2,因此如果未传递 p2,则查询看起来像第二个片段中的查询,如果通过,则看起来像第一个片段中的查询。

作为在您创建搜索时建议的改进,Gremlin 优化的解决方法是通过 parameterized script。从理论上讲,这意味着您正在以查找每个参数的方式构建查询。

但是,我不认为存在固有的“if”语句,所以如果您想使用查询来有选择地处理“有”情况,可以使用“Or Step", an "And Step", or a "Choose Step”。不过,我不鼓励将其作为一种模式。它类似于 MySQL 如何处理 Select 查询中的情况的选项:首先绑定参数几乎总是比让查询构建器整理出程序逻辑。

一种可能的方法是构建 GraphTraversal 直到它不被执行:

        Map<String, String> map = new HashMap<>();
        map.put("p1", "a");
        map.put("p2", null);

        final GraphTraversal<Vertex, Vertex> v = g.V();

        map.forEach((k,v) -> {
            if(v != null) {
                v.has(k,v);
            }
        });

        return v.toStream().collect(Collectors.toList());