如何在Titan Graph数据库上实现A *?

时间:2016-03-01 10:32:56

标签: graph-databases dijkstra a-star titan tinkerpop3

我使用Titan 1.0.0和Cassandra作为后端。

我将位置数据(纬度,经度)作为这些节点之间的节点和边缘。我想找到从节点A到节点B的最短路径。图形大小非常大。目前我正在使用此查询来查找两个节点之间的路径。

g.V(fromNode).repeat(both().simplePath()).until(is(toNode)).limit(1).path().fill(list);

此查询效率非常低,并且路径大小超过10时会出现内存错误。 在阅读了最短路径算法之后,我开始知道实现A *比实现Dijkstra更可行,因为在A * less图中将会探索。

现在我可以使用JUNG并将TitanGraph加载到内存中并实现我自己的A *以获得最短路径。但我不希望整个图形在内存中。

请建议我如何在TitanGraph上实现A *。我应该使用API​​查询图形还是首先将图形加载到内存中然后在内存中运行A *图形。

我也会感谢任何其他建议。

1 个答案:

答案 0 :(得分:0)

首先,这是一个与Tinkerpop3而非Titan更相关的问题。我同意你的意见,将图形加载到内存中是一个非常糟糕的主意。

最好的方法是实现A star算法直接在Gremlin控制台上运行。

Gremlin控制台执行Groovy代码。您可以在.groovy文件上实现A *算法并以这种方式将其加载到Gremlin控制台:

gremlin> :load my_folder/a-star-algo-tp3.groovy

假设您在此文件中定义了一个名为:

的方法
List<Element> a_star_algo(Graph graph, Object fromId, Object toId)

您可以通过gremlin控制台以这种方式调用它:

list = a_star_algo(graph, v1.id(), v2.id())

您可以使用A *算法实现此方法。这个repo在Groovy中使用自己的数据结构来实现算法。我不确定它们的实现效率如何,但你可以看看。