条件 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());
我正在根据传递的参数构建查询。例如,如果传递 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());