我有一个大型的二分有向图数据集(约2000万个元素)。在目前的使用中,我运行遍历算法,每次运行达到约500,000个节点。这些算法有效,但历史上运行的是从文本文件加载到内存的数据。
文本文件似乎是一种糟糕的方法,因此我将数据作为邻接列表传输到mongoDB中,即。
{ _id: 1, children: [2, 3] }
{ _id: 2, children: [4] }
{ _id: 3, children: [5, 6, 7] }
这很有效,但我觉得这个模型对我正在做的事情效率很低。在伪代码中,从_ id:1 开始的广度优先搜索的查询结构如下所示:
children = getChildren(_id = 1)
for child in children
grandchildren = getChildren(_id = child)
// etc., either recursively or as a nested loop
我对数据库的问题是没有连接节点的逻辑。每个查询都必须遍历索引树,如果我没记错的话,它就是O(log N)。加载后文本文件方法为O(1),因为我可以制作一些简单的查找规则直接指向节点子节点。
TL; DR 有没有办法在O(1)时间内使用数据库遍历大型网络?
答案 0 :(得分:2)
您可以尝试使用NoSQL图形数据库Neo4J。我没有使用它,但它承诺高性能。
答案 1 :(得分:0)
MongoDB不是一个多用途数据库。您显然对使用专用的专用图形数据库感兴趣。将MongoDB用于此类图形和相关搜索算法是不行的。