在mongodb中存储图表

kef*_*hou 31 database graph mongodb

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

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

table 1 
NodeA, NodeB
NodeA, NodeC

table 2 
NodeA, item1
NodeA, item2
NodeB, item3 
Run Code Online (Sandbox Code Playgroud)

然后在查询相邻节点中的数据时加入表.但是在MongoDB中无法加入,因此设置此数据库并有效查询相邻节点中的数据的最佳方法是什么(有利于稍微超出空间的性能).

jks*_*der 17

专业分布式图数据库

我知道这听起来有点像关于Mongo的OP问题,但是现在有更多的专业图形数据库在这种工作中表现出色,并且可能更容易使用,尤其是在大型图形上.

此处对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()
Run Code Online (Sandbox Code Playgroud)

当然,这只是冰山一角.相当强大的东西!

如果你不得不留在Mongo

将Tinkerpop Blueprints视为各种数据库中的"存储图形结构的JDBC".Tinkerpop Blueprints API有一个特定的MongoDB实现,我相信它对您有用.然后使用Tinkerpop Gremlin,您可以使用各种先进的遍历和搜索方法.


Chu*_*uck 15

我正在接受mongo,也在研究这种模式(无向图,查询来自邻居的信息)我认为到目前为止我喜欢的方式看起来像这样:

每个节点都包含一个邻居密钥数组,就像这样.

{
 nodeIndex: 4
 myData: "data"
 neighbors: [8,15,16,23,42]
}
Run Code Online (Sandbox Code Playgroud)

要从邻居中查找数据,请使用$ in"运算符":

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

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

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

  • 我不是MongoDB专家,但我认为这是对文档的限制,而不是集合或数据库.在此架构中,1个文档== 1个节点.所以问题是图表的密集程度或稀疏程度,而不是原始的节点数. (3认同)
  • @Zopa是正确的,16MB的限制是通过文件http://docs.mongodb.org/manual/core/document/#document-types-in-mongodb (2认同)

小智 8

请参阅http://www.mongodb.org/display/DOCS/Trees+in+MongoDB获取灵感.

  • 树是子图.这可能有助于思考构建图索引的方法. (3认同)

Mic*_*dis 5

MongoDB将在3.4 版本中引入原生图功能,它可用于存储图结构并对其进行分析,尽管根据情况,性能可能不如Neo4j等原生图数据库那么好,但现在判断还为时过早。

检查这些链接以获取更多信息:

  • 它(目前)可能不如 Neo4j 好,因为它不适用于分片集合等。 (2认同)