1

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

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

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

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

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

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

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

4

1 回答 1

1

首先,这是一个与 Tinkerpop3 而不是 Titan 更相关的问题。我同意你的观点,将图表加载到内存中是一个完全坏主意。

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

Gremlin 控制台执行Groovy代码。您可以在文件上实现 A* 算法.groovy并将其加载到 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 中使用他们自己的数据结构来实现算法。我不确定他们的实施效率如何,但你可以看看。

于 2016-03-04T10:43:50.327 回答