[Feature] gremlin or() 查询,支持命中索引查询
- Dominant language
- Java
- Stars
- 3.2k
- Forks
- 636
- Avg merge
- 3d 11h
- Merged PRs (30d)
- 14
Description
## Feature Description:
比如一个`vt` vertexlabel,包含属性 A,B,其中A建立了全文索引,B建立了二级索引
现在需要查询 A.textcontains(keyword) 或者 B.equal(keyword)
查询方法:
```
g.V().hasLabel("vt").or(has("A",Text.contains(keyword)),has("B",keyword)).limit(10)
```
当前执行时,可以获得正确结果,但并未走索引。
另外,和作者沟通,尝试了`has.or.has`
```
g.V().hasLabel("vt").has("A",Text.contains(keyword)).or().has("B",keyword).limit(10)
```
这个查询也没有走索引,且limit不生效
## 扩展
or查询,可以等价于`Union`,因此做了下面的尝试,理论上应该可以走索引:
```
union(g.V().hasLabel("vt").has("A",Text.contains(keyword)),g.V().hasLabel("vt").has("B",keyword)).limit(10)
```
但是执行无结果返回,经过debug,发现在applyStrategies这一步的时候,默认的union的DefaultTraversal的Strategies是空的,所以没有成功优化查询。
通过如下代码可以解决:
```java
private GraphTraversal orQuery(String orProperties, boolean keepStartP,
GraphTraversal traversal, HugeGraph g) {
Map orProps = parseProperties(orProperties);
parsePCondtion(keepStartP, orProps);
Traversal[] orTraversals = new Traversal[orProps.size()];
int index = 0;
GraphTraversal current = traversal.asAdmin().clone();
for (Map.Entry entry : orProps.entrySet()) {
orTraversals[index++] = current.asAdmin().clone()
.has(entry.getKey(),
entry.getValue());
}
traversal = new DefaultGraphTraversal(g).union(orTraversals);
return traversal;
}
```
其中 `orProperties={"A":"P.textcontains(\"keyword\")","B":"keyword"}`
Contributor guide
Assessment
This issue has not been assessed yet.