在图DB中找到N个特定类型的邻居

时间:2013-03-27 17:12:00

标签: database graph neo4j dijkstra

假设我有100k节点和500k边缘的有向图。从它们中,15k节点是“重要的”。我需要从一个特定节点开始找到100个最近的“重要”节点。

我在C#中实现了Dijkstra算法,它找到了从起始节点到所有其他节点的距离。然后我按距离排序“重要”节点并首先返回100。这大约需要1秒钟。

现在我需要在服务器端(Linux)执行相同的操作,可能有许多并发查询和不同的起始节点。我已经尝试过node4j图形数据库,在咨询开发人员之后,我们得到的解决方案在10-20秒内完成相同的操作(实际上,如果我们计算没有长度限制的路径,则需要大约10分钟)。这需要很长时间,因为neo4j存储所有最短路径,而我的C#实现仅存储距离。在neo4j中使其更快的唯一选择是编写扩展,这不是一件容易的事。

所以问题是:是否有任何图形数据库(非商业)可以安装在Linux服务器上并且能够快速运行这样的查询?我已经从维基百科列表中检查了所有图形dbs,但没有找到合适的颜色。

另一个选择是在Java中实现相同的算法并创建一个服务(Tomcat?),它将存储图的共享副本(如何?)并将回答这些查询。但是我更喜欢准备好的东西......

2 个答案:

答案 0 :(得分:2)

写一个Neo4j扩展来做到这一点并不像你想象的那么糟糕。

点击此处查看示例: http://maxdemarzi.com/2012/11/26/extending-neo4j/

这个使用A *算法进行“自定义”寻路: http://maxdemarzi.com/2012/11/27/pathfinding-with-neo4j-unmanaged-extensions/

答案 1 :(得分:1)

这是对@MaxDeMarzi给出的答案的赞美......

你提到你的C#实现:(1)找到从起始节点到所有其他节点的距离,(2) SORTS'重要'节点的距离,(3)首先返回100.

为了提高效率,你可以这样做吗?

top = 100

然后,每次Dijkstra找到到新节点的最短路径时:

if (isImportant(node)) resultSet.add(node,distance)
if (resultSet.size() >= top) return resultSet

这将避免找到您不感兴趣的节点的路径