4

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

我了解到,与 MySQL 数据库相比,Graph DB 的性能要好得多。我的应用程序是用 PHP 编写的。

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

提前致谢。

4

3 回答 3

4

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

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

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

如果您可以使用数据集从一个地方跳到另一个地方,那么您就有一个完全连接的图。显然,这是大量数据,并且随着您添加更多目的地而呈二次增长,但图形数据库可能比关系数据库更擅长处理这个问题。为了存储距离,当您将节点添加到图形时,您还可以向每个现有节点添加一条边,并将距离预先计算为它的属性之一。然后,要检索一对节点之间的距离,您只需找到它们之间的边并获取它的距离属性。

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

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

于 2012-10-05T21:30:55.303 回答
1

是的,图形数据库将比 MySQL 或 Postgres 的扩展提供更多的性能。一个看起来很漂亮的是OrientDB在 PHP 中有一个使用二进制协议的 beta 实现,另一个使用 HTTP作为传输层。

至于示例代码,Alessandro(来自odino.org)编写了Dijkstra算法的实现,并完整说明了如何将其与 OrientDB 一起使用以找到城市之间的最小距离

于 2012-10-05T11:32:26.807 回答
1

实际上,数据库与索引无关。我使用了 MongoDB 的地理空间索引和搜索(文档 DB),它具有地理索引,旨在查找多个最接近给定坐标的元素 - 效果很好。仍然 - 它只运行简单的查询(查找最近的查询),如果您的索引不适合 RAM,它会变得有点慢(我使用 geonames DB 有 800 万个坐标位置,并且在 VM 上每次查询得到 0.005-2.5 秒 - 1. 硬盘开销 2. 可能索引不适合 RAM)。

于 2012-10-09T18:18:16.420 回答