我有一个无向图,其中每个节点都包含一个数组。可以从数组中添加/删除数据。将其存储在 Mongodb 并能够有效地执行此查询的最佳方法是什么:给定节点 A,选择 A 的相邻节点中包含的所有数据。
在关系数据库中,您可以创建一个表示边的表和另一个表来存储每个节点中的数据。
table 1
NodeA, NodeB
NodeA, NodeC
table 2
NodeA, item1
NodeA, item2
NodeB, item3
然后在查询相邻节点中的数据时加入表。但是在 MongoDB 中连接是不可能的,那么设置这个数据库并有效地查询相邻节点中的数据的最佳方法是什么(在空间上稍微有利于性能)。
最佳答案
我知道这听起来与 OPs 关于 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 蓝图视为各种数据库中的“存储图形结构的 JDBC”。 Tinkerpop Blueprints API 有一个特定的 MongoDB 实现,我相信它会为您工作。然后使用 Tinkerpop Gremlin,您可以使用各种高级遍历和搜索方法。
https://stackoverflow.com/questions/5125709/