我正准备开始一个项目,我将为餐馆建立一个推荐引擎。我一直在neo4j(图db)和mongodb(文档db)之间胡扯。我的节点/文件将是餐厅和人。我知道我会想要一些边缘,例如person-> likes-> restaurant,或person-> ate_at-> restaurant。然而,我的主要问题是找到位于Y的X英里范围内的餐馆。
如果我在Y的X英里内有20个餐厅,但没有任何边缘连接,neo4j将如何处理空间查询?我知道使用mongodb我可以在lat / long上索引并查询所有餐馆类型。 neo4j在断开连接的图表中提供相同的功能吗?
当回答诸如“我的朋友经常吃哪些餐馆?”之类的问题时,neo4j(图表数据库)的方法是什么?或者mongodb(文档db)是否为我提供了类似的功能?
答案 0 :(得分:10)
Neo4j Spatial引入了一个空间RTree(或其他方法)索引,它是图形本身的一部分。这意味着,即使断开连接的域实体也可以通过空间搜索找到,如果您对它们进行索引(即关系会将Spatial索引连接到Restaurants)。此外,这足够灵活,您可以将RTree中的原始BBox搜索与其他内容(例如同时检查餐馆类别)结合起来,因为您可以跳出图表的不同部分。
通过这种方式,neo4j Spatial支持您可以从完整拓扑中获得的全部搜索功能,例如组合搜索和搜索带孔的多边形等。
请注意Neo4j Spatial是0.7,所以要温和并问http://groups.google.com/group/neo4j/about:)
答案 1 :(得分:7)
我对Neo4J Spatial并不熟悉,但看起来MongoDB至少是一个不错的选择,因为它是Foursquare使用的数据库,完全符合您描述的目的。 MongoDB地理索引非常快,可以很好地扩展。
答案 2 :(得分:1)
另一种可能的解决方案是使用CouchBase。它也使用文档模型 - 尽管您需要更轻松地使用MapReduce进行查询。它具有更好的空间能力,现在感谢MongoDB,但这可能会随着时间而改变。
除了建议之外,我同意您给出的两个选择Mongo将很好地满足您的需求,并且可能更适合您的空间查询。
答案 3 :(得分:0)
Neo4j地理空间不能扩大这种优势。我在neo4j中创建了一个地理空间层,并为此层添加了节点。超过10,000个节点,即使使用neo4j2.0
,向层添加节点也会变得非常慢另一方面,mongodb地理位置工作速度相对更快,可扩展性更强。