组合数据以在图形中生成路线。从哪儿开始?

时间:2014-02-03 11:14:01

标签: mysql algorithm graph routing neo4j

我甚至不确定这个问题的标题最能反映出我真正想做的事情,实际的问题内容也很混乱,因为我不确定我真正需要什么,但我依靠你伙计们帮助我。

我正在尝试找出基于简单直接路线生成航班搜索应用中更复杂和多路径路线的最佳方式。

假设我的路线表中有两条航线:

Origin              Destination
MIA (Miama)         ATL (Atlanta) and
ATL (Atlanta)       LAX (Los Angeles)

通过这两个路由并发出一个简单的查询,例如:

SELECT ... FROM  Routes WHERE origin = 'MIA' AND destination = 'LAX'

我没有得到任何结果,但如果我能够合并我拥有的所有数据,那么我将能够通过ATL(亚特兰大)提供这样的路线:MIA - > ATL - > LAX。

我正在调查Neo4J以保存我的数据并使用最短路径执行搜索,但我不确定我需要这么大的枪。截至目前我正在使用MySql,如果我正确构建数据,我想我应该能够做到。

我已经用Neo4J(http://blog.neo4j.org/2013/08/finding-shortest-path-through-park.html)研究了最短路径算法,但是我还有其他一些关于如何解决这个问题的问题,因为我对这类问题很新。

所以我的问题是:

  1. 我应该使用我的基本直接路线来预先计算复杂路线,例如MIA - > LAX还是应该使用工具/算法根据我拥有的数据动态生成?
  2. 如果我预先计算复杂路线,我从哪里开始?任何算法暗示?这就是我最困难的地方。
  3. 我需要一个图形数据库,还是MySql没问题?我有大约35k个不同的基本路由,每秒不超过10个请求。
  4. 我还想将我的结果限制在不超过3或4条腿的路线上,因为大于此的路线可能会在非常奇怪的长途飞行中连接整个世界
  5. 非常感谢

1 个答案:

答案 0 :(得分:1)

  1. 我认为你应该让算法动态地计算你的路线,因为它会更灵活地设计,当你用更多的数据(在这种情况下是路线)更新时,你不必另外计算和存储复杂的路线
  2. 参考1
  3. 是的,使用图形数据库,您的查询会更快。有关比较,请点击此处:here。有许多此类比较和基准测试和上传,您可以谷歌搜索。
  4. 您可以通过限制密码查询中的跃点数(neo4j的查询语言)轻松实现此目的。
  5. 因此,在您的情况下,图表将是一种

    (MIA)-[:CONNECTS]->(ATL)-[:CONNECTS]->(LAX)
    

    所以你只需要查询

    MATCH p=(f:LOCATION)-[:CONNECTS*1..3]->(g:LOCATION) where f.name = "MIA" and g.name="LAX" return nodes(p) as ConnectingAirports
    

    因此,如果您对LOCATION属性上的name节点编制索引,它将使您的查询更快。此外,上述查询不仅会为您ATL提供CONNECTS,还会为您提供MIA关联互联的所有其他路线位置,距离{{1}}位置的距离为1,2或3跳。