如何遍历&查询更快的TitanGraph与Cassandra作为后端?

时间:2016-02-09 18:42:34

标签: indexing apache-spark cassandra graph-databases titan

我在Titan 1.0.0中存储了数百万个节点 Cassandra 2.2.4。我想从Cassandra中检索图形并以快速方式查询或遍历它。

如果我在代码中构建索引,

mgmt.buildIndex("nameSearchIndex", Vertex.class).addKey(namep, Mapping.TEXT.asParameter()).buildMixedIndex("search");
mgmt.buildIndex("addressSearchIndex", Vertex.class).addKey(addressp, Mapping.TEXT.asParameter()).buildMixedIndex("search");

查询似乎仍然较慢。

当我使用

g.traversal().V().count() 

当我已经在代码中构建索引时,它仍会提供警告 - 请使用索引。是否有任何特定配置强制激活索引?如何使用索引查询图形?

g.traversal().V().has("Name","Jason") 

此查询是否使用索引?如果没有那么我如何利用索引更快地查询?

Spark可以用于快速遍历吗?如何使用 SparkComputerGraph ?我无法使用Spark找到 CassnadraInputFormat 的配置。

感谢。

2 个答案:

答案 0 :(得分:1)

这个问题捆绑了很多问题。

您正在制作的索引是混合索引,这些索引由外部索引系统(如Solr或ElasticSearch)实现。如果您正在寻找具有特定名称的顶点,例如您的.has("Name", "Jason)示例,这些将​​有所帮助。

为了确定是否正在使用索引,我建议查看Gremlin中的profile()步骤。你可以read about it here

Spark旨在用于需要潜在加载大于一台机器可容纳的图形的遍历。哪个用例.V().count()很重要?

答案 1 :(得分:1)

这个答案在泰坦mailing list上交叉发布。

索引对于快速遍历非常有用,但最终还是快速查询"取决于许多因素,包括您的图表模型/体积/形状以及您尝试回答的问题类型。

阅读第8章" Indexing for better Performance"在Titan文档中,消化不同类型之间的差异:复合,混合和以顶点为中心。

基于您发布的示例查询,正如Daniel所说,它在我看来就像是一个完全匹配的查询类型,所以我会从一个Composite索引开始。您可以剪切并粘贴此内容以在Titan控制台中进行试用。

graph = TitanFactory.open('inmemory')
mgmt = graph.openManagement()
name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.SINGLE).make()
nameIndex = mgmt.buildIndex('nameIndex',Vertex.class).addKey(name).buildCompositeIndex()
mgmt.commit()
graph.addVertex('name','jason')
g = graph.traversal()
g.V().has('name','jason') // no warning should appear

如果在阅读Composite vs Mixed Index部分后,您认为混合索引(由Elasticsearch,Solr或Lucene支持)是您真正需要的,请阅读第20章" Index Parameters and Full-Text Search&#34 ;和消化映射TEXT,STRING和TEXTSTRING之间的差异。

这是一个使用STRING混合索引

的示例
graph = TitanFactory.build().set('storage.backend','inmemory').set('index.search.backend','elasticsearch').open()
mgmt = graph.openManagement()
name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.SINGLE).make()
nameIndex = mgmt.buildIndex('nameIndex',Vertex.class).addKey(name, Mapping.STRING.asParameter()).buildMixedIndex("search")
mgmt.commit()
graph.addVertex('name','jason')
g = graph.traversal()
g.V().has('name','jason') // no warning should appear