在mongodb中存储图形

我有一个无向图,每个节点都包含一个数组。 数据可以从数组中添加/删除。 在Mongodb中存储这些信息的最好方法是什么,并且能够有效地执行此查询:给定节点A,选择A中相邻节点中包含的所有数据。

在关系数据库中,您可以创建一个表示边的表和用于在每个节点中存储数据的另一个表。

table 1 
NodeA, NodeB
NodeA, NodeC

table 2 
NodeA, item1
NodeA, item2
NodeB, item3 

然后在查询相邻节点中的数据时加入表格。 但是在MongoDB中连接是不可能的,那么设置这个数据库并在相邻节点中有效查询数据的最佳方式是什么(优先考虑空间上的性能)。


我正在采用mongo,并研究这种模式(无向图,查询来自邻居的信息),我认为我迄今赞成的方式如下所示:

每个节点都包含一个邻居键数组,如下所示。

{
 nodeIndex: 4
 myData: "data"
 neighbors: [8,15,16,23,42]
}

要从邻居中找到数据,使用$ in“操作符”:

db.nodes.find({nodeIndex:{$in: [8,15,16,23,42]}});

您可以使用字段选择将结果限制为相关数据。

db.nodes.find({nodeIndex:{$in: [8,15,16,23,42]}}, {myData:1});

专门的分布图数据库

我知道这听起来与OP有关Mongo的问题有点距离,但现在有更多的专业图形数据库擅长这种工作,并且可能更容易使用,特别是在大图上。

这里有7种此类产品的比较:https://docs.google.com/spreadsheet/ccc?key=0AlHPKx74VyC5dERyMHlLQ2lMY3dFQS1JRExYQUNhdVE#gid=0

在三个最重要的开源产品(Titan,OrientDB和Neo4J)中,它们都支持Tinkerpop Blueprints接口。 所以对于一个看起来像这样的图...

在这里输入图像描述

......对于“Juno非常敬佩自2011年以来她所认识的所有人”的质疑将如下所示:

Iterable<Vertex> results = juno.query().labels("knows").has("since",2011).has("stars",5).vertices()

当然,这只是冰山一角。 非常强大的东西!

如果你必须留在Mongo

将Tinkerpop Blueprints想象成各种数据库中的“存储图结构的JDBC”。 Tinkerpop Blueprints API有一个特定的MongoDB实现,可以为你工作,我敢肯定。 然后使用Tinkerpop Gremlin,您可以使用各种先进的遍历和搜索方法。


请访问http://www.mongodb.org/display/DOCS/Trees+in+MongoDB寻求灵感。

链接地址: http://www.djcxy.com/p/52369.html

上一篇: Storing a graph in mongodb

下一篇: Common Lisp Keyword list