使用Graph DB存储PHP之间的距离

时间:2012-09-17 20:36:33

标签: php database-design graph distance graph-databases

我需要能够快速找到给定目的地的n个最近目的地,计算n个目的地的n×n距离矩阵以及与两个或更多目的地之间的距离相关的若干其他此类操作。

我已经了解到,与MySQL数据库相比,Graph DB可以提供更好的性能。我的应用程序是用PHP编写的。

所以我的问题是 - 是否可以将Graph DB与PHP应用程序一起使用,如果是,则哪一个是最佳选项和开源以及如何将这些数据存储在图形DB中以及如何访问它。

提前致谢。

3 个答案:

答案 0 :(得分:4)

Neo4j是一个非常可靠的图形数据库,并且具有灵活(如果有点复杂)许可。它实现了Blueprints API,并且应该很容易使用几乎任何语言,包括PHP。它也有一个REST API,它和它一样灵活,并且PHP中至少有one good example个使用它。

根据您拥有的数据,有多种方法可以存储它。

如果您有“路线”数据,您的点已经通过特定路径相互连接(即,您无法从一个点直接跳到另一个点),那么您只需将每个点设为节点和连接您的路线中的点之间是节点之间的边,距离是这些边的属性。这会给你一个看起来像你的经典“旅行推销员”类问题的图表,计算节点之间的距离只是进行加权广度优先搜索(假设你想要最短路径)。

如果 可以使用您的数据集从一个地方跳转到另一个地方,那么您有一个fully connected图表。显然这是一个很多数据,并且随着你添加更多目的地而呈二次方增长,但图形数据库可能比关系数据库更好地处理这个问题。要存储距离,在向图表添加节点时,还要为每个其他现有节点添加边,并将预先计算的距离作为其中一个属性。然后,要检索一对节点之间的距离,您只需找到它们之间的边缘并获得它的距离属性。

但是,如果您有一个个完全连接的节点,那么最好只存储这些节点的坐标并根据需要计算距离,并可选择缓存结果加快速度。

最后,如果你使用Blueprints API和该堆栈中的其他工具,例如GremlinRexter,你应该能够交换/输出任何兼容图形数据库,可让您更好地使用可满足您需求的不同实现,例如在Titan / Cassandra群集上使用Hadoop

答案 1 :(得分:1)

是的,图形数据库将为您提供比MySQL或Postgres的扩展更多的性能。一个looks really slickOrientDB,一个beta implementation in PHP using the binary protocolanother one that uses HTTP作为传输层。

至于示例代码,Alessandro(来自odino.org)写了implementation Dijkstra's algorithmfull explanation of how to use it with OrientDB to find the minimum distance between cities

答案 2 :(得分:1)

实际上,关于索引的数据库并没有那么多。我使用了MongoDB的geospatial indexing和搜索(文档数据库),它具有用于查找给定坐标的多个最近元素的地理索引 - 具有良好的结果。仍然 - 它只运行简单的查询(找到最近的),如果你的索引不适合RAM,它会变得有点慢(我已经使用了带有坐标的8mln位置的geonames数据库,每个得到0.005-2.5s查询VM - 1. hdd开销2.可能索引不适合RAM)。