因此,如果我想要检索具有Long属性最大值的顶点,我应该运行:
graph.traversal().V().has("type","myType").values("myProperty").max().next()
这非常慢,因为它必须加载所有顶点以找出最大值。有没有更快的方法?
任何索引都有帮助吗?我相信复合索引不会有帮助,但有没有办法使用混合索引与ElasticSearch后端?
答案 0 :(得分:3)
使用Titan在数值上创建混合索引将导致Elasticsearch正确索引属性。与您类似,我们希望知道属性DEGREE
从最大到最小排序的所有顶点,因此我们目前对属性DEGREE
执行以下操作:
TitanGraph titanGraph = TitanFactory.open("titan-cassandra-es.properties");
TitanManagement management = graph.openManagement();
PropertyKey degreeKey = management.makePropertyKey("DEGREE").dataType(Long.class).make();
management.buildIndex("byDegree", Vertex.class)
.addKey(degreeKey)
.buildMixedIndex("search");
我们目前在让Titan快速遍历这个问题时遇到了问题(由于某种原因,它可以创建索引但很难将其用于某些查询)但我们可以直接查询Elasticsearch:
curl -XGET 'localhost:9200/titan/byDegree/_search?size=80' -d '
{
"sort" : [
{ "DEGREE" : {"order" : "desc"}}
],
"query" : {
}
}
答案快速返回极所以现在我们使用Titan创建索引,但直接查询弹性搜索。
简答: Elasticsearch可以非常轻松地完成数值范围所需的操作,我们这边的问题至少似乎让Titan完全使用这些指数。然而,你试图执行的遍历比我们更简单(你只想要最大值),所以你可能不会遇到这些问题,你可能只能完全坚持Titan遍历。
修改强>
我最近证实,弹性研究和泰坦可以满足您的需求(就像我的一样)。只是要小心你如何创建索引。只要您创建混合索引并将Type
密钥设置为String
匹配而不是Text
匹配,Titan就能够快速执行您的查询。