【发布时间】:2017-08-03 08:27:49
【问题描述】:
以下查询最多应返回标签为REPOSITORY 的limit 顶点,这些顶点最后一次更新是在minLastUpdated 之前,并且不是FILE_UPLOAD 类型,除非设置了NEEDS_UPDATE 标志。
g.V()
.hasLabel(VertexLabel.REPOSITORY.name())
.has(PropertyKey.INDEXED_LABEL.name(), VertexLabel.REPOSITORY.name())
.has(PropertyKey.LAST_UPDATED.name(), P.lt(minLastUpdated))
.or(__.not(__.has(PropertyKey.TYPE.name(), RepositoryType.FILE_UPLOAD.name())),
__.has(PropertyKey.NEEDS_UPDATE.name(), true))
.limit(limit);
为了避免全图扫描,我在属性INDEXED_LABEL、TYPE 和NEEDS_UPDATE 上创建了以下索引,这是一个结合了这三个属性的复合索引和一个混合索引:
//By Label
mgmt.buildIndex("byIndexedLabel", Vertex.class)
.addKey(indexedLabelKey)
.buildCompositeIndex();
//By Type
mgmt.buildIndex("byType", Vertex.class)
.addKey(typeKey)
.buildCompositeIndex();
//By Needs Update
mgmt.buildIndex("byNeedsUpdate", Vertex.class)
.addKey(needsUpdateKey)
.buildCompositeIndex();
//Combination of the three
mgmt.buildIndex("byIndexedLabelTypeAndNeedsUpdate", Vertex.class)
.addKey(indexedLabelKey)
.addKey(typeKey)
.addKey(needsUpdateKey)
.buildCompositeIndex();
//Mixed Index
mgmt.buildIndex("repositoryByTypeAndLastUpdated", Vertex.class)
.addKey(indexedLabelKey, Mapping.STRING.asParameter())
.addKey(lastUpdatedKey)
.indexOnly(repositoryLabel)
.buildMixedIndex("search");
但在执行查询时,我收到以下警告:
WARN - StandardTitanTx$6: Query requires iterating over all vertices [()]. For better performance, use indexes
旁注
- 顶点标签与索引在同一事务中定义,这意味着所有索引都应立即可用。
-
PropertyKey和VertexLabel是我自己的enums。 - 索引设置期间使用的键都是我之前添加的
com.thinkaurelius.titan.core.PropertyKey的所有实例。 - 所有属性的数据类型均为
String,但NEEDS_UPDATE除外,它是Boolean。
环境
- 泰坦 1.0.0
- TinkerPop 3.0.1
- 弹性搜索 1.0.0
- 伯克利存储后端
感谢您提出的任何建议。
【问题讨论】: