我需要哪些索引来跟踪查询以避免全图扫描?

时间:2017-03-13 10:44:06

标签: indexing titan gremlin

以下查询应返回最多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_LABELTYPE上创建了以下索引,这是一个将所有三个和一个混合索引组合在一起的复合索引:

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之外,所有属性的数据类型均为StringNEEDS_UPDATE

环境

  • Titan 1.0.0
  • TinkerPop 3.0.1
  • Elastic Search 1.0.0
  • Berkeley Storage Backend

感谢你提出的任何建议。

1 个答案:

答案 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 /或数据。