apache / apache/hugegraph

[Feature] gremlin or() 查询,支持命中索引查询

Open
#1,488 1 comment 1 reaction 0 assignees View on GitHub
feature
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.