以下查询应返回最多limit
个顶点,其标签为REPOSITORY
,最后一次更新minLastUpdated
且不属于FILE_UPLOAD
,除非{{ 1}}标志已设置。
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
。感谢你提出的任何建议。
答案 0 :(得分:1)
只有PropertyKey.INDEXED_LABEL.name()
和PropertyKey.LAST_UPDATED.name()
相关,其他属性不能用于索引查找。也就是说,创建一个搜索索引是有意义的a)你有多个属性,b)其中一个有一个范围条件:P.lt(minLastUpdated)
(没有其他索引可以回答范围查询并且有多个属性覆盖众所周知,复合指数迟早会引起麻烦。创建一个涵盖这两个属性的索引,以获得最佳性能。
mgmt.buildIndex('repositoryByTypeAndLastUpdated', Vertex.class).
addKey(indexedLabelKey, Mapping.STRING.asParameter()).
addKey(lastUpdatedKey).indexOnly(repositoryLabel).buildMixedIndex("search")
<强>更新强>
INDEXED_LABEL
实际上不是可索引的,或者不应该被编入索引,因为它似乎只是作为属性存储的顶点标签的副本。以下是一个完整的示例,它不会向您发出有关完整扫描的任何警告。
gremlin> graph = TitanFactory.open("conf/titan-berkeleyje-es.properties")
==>standardtitangraph[berkeleyje:/projects/aurelius/titan/conf/../db/berkeley]
gremlin> g = graph.traversal()
==>graphtraversalsource[standardtitangraph[berkeleyje:/projects/aurelius/titan/conf/../db/berkeley], standard]
gremlin> m = graph.openManagement()
==>com.thinkaurelius.titan.graphdb.database.management.ManagementSystem@10a0a1e
gremlin> repository = m.makeVertexLabel("repository").make()
==>repository
gremlin> lastUpdated = m.makePropertyKey("lastUpdated").dataType(Long.class).make()
==>lastUpdated
gremlin> needsUpdate = m.makePropertyKey("needsUpdate").dataType(Boolean.class).make()
==>needsUpdate
gremlin> type = m.makePropertyKey("type").dataType(String.class).make()
==>type
gremlin> m.buildIndex("repositoryByLastUpdated", Vertex.class).
gremlin> addKey(lastUpdated).indexOnly(repository).buildMixedIndex("search")
==>repositoryByLastUpdated
gremlin> m.commit()
==>null
gremlin> g.V().has("repository", "lastUpdated", lt(System.currentTimeMillis())).
gremlin> or(has("type", neq("FILE UPLOAD")), has("needsUpdate", true)).limit(10)
gremlin>
我的图表中没有数据,但警告会显示w /或数据。