我正在寻找使用Titan来创建可扩展的地理空间数据存储(我正在思考R树)。在文档中,有一个GeoShape
查询,文档说titan可以使用Lucene或ElasticSearch执行地理数据。但是,看起来这会非常慢,因为在cassandra中遍历节点本质上是在cassandra中进行连接查询,这是一个非常糟糕的主意。我想我可能会误解数据表示。
我读了Titan Data Model doc,但我还是不太明白。如果所有边缘都存储在Cassandra行中,那么Titan仍然需要加入"在顶点表上。解决此问题的一种方法是使列值等于边属性数据,然后您可以将顶点数据和边数据整齐地打包到行中。但是,当您想要执行超过1个节点的查询时,这会中断,并且我们会再次回到加入问题。
因此。 Titan是否在Cassandra中模拟连接查询? - 和 - 在这些条件下地理查找的性能如何?
答案 0 :(得分:5)
我认为这个问题将边缘遍历与地理空间索引查找混为一谈。它们在API和实现级别都是分开的。索引未在数据模型图片中说明。
让我们更具体一点。假设我使用Murmur3Partitioner或RandomPartitioner与ES和Cassandra一起运行Titan。我在名为"place", as documented in the Getting Started page的边上声明了一个ES地理空间索引。通过地理空间查询(例如此"WITHIN" in the Getting Started docs)查找边缘,首先点击ES。 ES返回ID Titan可以用来快速查找Cassandra中相关的顶点/边缘数据,而无需对关系连接进行模拟。
地理空间数据进行这些边缘查找的成本应该大致相当于ES的WITHIN
实现(我认为委托给Spatial4j)的成本,以及Titan在获取后对Cassandra进行的查找ID,ES应找到的边数大致为线性。这只是背后的估计,所以请大量使用它。
在我通过地理匹配获得边缘之后,如果我想在集合中的每个边缘附近运行任意遍历,那么我将看看在头部/尾部顶点上生成MultiQuery并启用数据库级缓存。如果查询未命中缓存或缓存已冷/禁用,则Titan仍会尝试在可能的情况下检索遍历在每个顶点的单个Cassandra切片中所关注的所有边。如果您担心Titan的边缘遍历效率,那么您可能会发现Boutique Graph Data with Titan很有趣。
HTH