当在 has() 子句中使用索引属性时,JanusGraph 有时会返回空结果

问题描述

我们使用 JanusGraph(与 Ca​​ssandra)作为我们的后端数据库,并且在 has() 子句中使用它时遇到了索引属性的一些问题。

以下查询返回空响应:

g.V().has('fooName','foovalue').has('barName','barValue')

但是,以下查询返回了正确的响应:

g.V().has('barName','barValue').values('fooName')
==> foovalue

这两个属性都已编入索引(复合)。数据集大约有 20k 个顶点,'fooName' 属性的值为 'foovalue',这也通过以下有效的查询得到确认:

g.V().has('fooName','foovalue').count()
==> 20000

这种情况是间歇性发生的,并不是所有顶点都发生。在 20k 个顶点中,大约 6k 个顶点显示了上述问题。对所有顶点添加属性值的方法相同。

如果我们为顶点添加一个复合索引,其中的值域将很小,并且顶点集的范围将很少,并且一个集合在结果索引查询的宇宙中占有非常大的份额,是否会出现这种情况?会因为错误地声称匹配谓词的当前顶点不存在而失败吗?

遍历报告当前顶点不存在,而不是触发完整扫描。如果是这种情况,综合指数在什么阈值开始失效,可以在哪里调整?

我们知道最近对索引缓存和事务进行了更改。对于失败的索引查询,我们还观察到“gV().has('fooName','foovalue').count()”被限制为 4000 的查询限制值(如 .profile() 所示)报告),直到事务提交。提交后,count() 跳回到预期值。 (20,000)。这有关系吗?

解决方法

@Anya 让我们看看 https://github.com/JanusGraph/janusgraph/issues/735

这看起来与 [他的] 11 月 15 日在 gitter 上的帖子相同。查询优化器 插入了一个限制(4000),也许也在这里。关闭智能限制( query.smart-limit=false ) 解决了这个问题。

https://docs.janusgraph.org/basics/configuration-reference/

enter image description here