Titan:如何高效获取一个Long属性的最大值?

Titan: How to efficienlty get the maximum value of a Long property?

所以如果我想检索具有 Long 属性 最大值的顶点,我应该 运行:

graph.traversal().V().has("type","myType").values("myProperty").max().next()

这真的很慢,因为它必须加载所有顶点才能找出最大值。有没有更快的方法?

任何索引都会有帮助吗?我相信复合索引无济于事,但有没有办法使用混合索引和 ElasticSearch 后端来做到这一点?

使用 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 遍历。

编辑:

我最近确认 elasticsearch 和 titan 可以满足您的需求(就像我的一样)。请注意创建索引的方式。只要您创建混合索引并将 Type 键设置为 String 匹配而不是 Text 匹配,Titan 将能够快速执行您的查询。