我有一个无向图,每个节点都包含一个数组。可以从阵列中添加/删除数据。什么是在Mongodb中存储它的最佳方法,并且能够有效地执行此查询:给定节点A,选择A中相邻节点中包含的所有数据。
在关系数据库中,您可以创建一个表示边的表和另一个用于在每个节点中存储数据的表。
table 1
NodeA, NodeB
NodeA, NodeC
table 2
NodeA, item1
NodeA, item2
NodeB, item3
然后在查询相邻节点中的数据时加入表。但是MongoDB中不可能加入,所以最好的方法是设置这个数据库并有效地查询相邻节点中的数据(有利于空间性能)。
答案 0 :(得分:16)
我知道这听起来与OP有关Mongo的问题有点远,但是现在有更专业的图形数据库在这种工作中表现优异,并且可能更容易使用,尤其是在大型图形上。
这里有7个此类产品的比较:https://docs.google.com/spreadsheet/ccc?key=0AlHPKx74VyC5dERyMHlLQ2lMY3dFQS1JRExYQUNhdVE#gid=0
在三个最重要的开源产品(Titan,OrientDB和Neo4J)中,所有这些产品都支持Tinkerpop Blueprints界面。所以对于看起来像这样的图表......
...查询“朱诺非常钦佩自2011年以来她所知道的所有人”看起来像这样:
Iterable<Vertex> results = juno.query().labels("knows").has("since",2011).has("stars",5).vertices()
这当然只是冰山一角。相当强大的东西!
将Tinkerpop Blueprints视为各种数据库中的“存储图形结构的JDBC”。 Tinkerpop Blueprints API有一个特定的MongoDB实现,我相信它对您有用。然后使用Tinkerpop Gremlin,您可以使用各种先进的遍历和搜索方法。
答案 1 :(得分:15)
我正在接受mongo,也在研究这种模式(无向图,查询来自邻居的信息)我认为到目前为止我赞成的方式看起来像这样:
每个节点都包含一个邻居密钥数组,如下所示。
{
nodeIndex: 4
myData: "data"
neighbors: [8,15,16,23,42]
}
要查找邻居的数据,请使用$in "operator":
db.nodes.find({nodeIndex:{$in: [8,15,16,23,42]}});
您可以使用field selection将结果限制为相关数据。
db.nodes.find({nodeIndex:{$in: [8,15,16,23,42]}}, {myData:1});
答案 2 :(得分:8)
答案 3 :(得分:2)
MongoDB 将在 3.4版本中引入本机图形功能,它可以用于存储图形结构并对它们进行分析,尽管与本机相比性能可能不是那么好图形数据库如 Neo4j 取决于案例,但现在判断还为时过早。
检查这些链接以获取更多信息:
答案 4 :(得分:1)
MongoDB可以使用灵活的树层次结构来模拟图形。您可能需要考虑neo4j以满足严格的图形需求。