sql - 如何存储稀疏邻接矩阵

标签 sql nosql sparse-matrix bigdata database

我已经阅读了几个主题,但我迷路了。我对此很陌生。我想存储巨大的稀疏矩阵并有几个想法,但可以在它们之间进行选择。这是我的需求:

  1. 约的邻接矩阵。 5000 万个顶点。
  2. 每个顶点的最大邻居数量 - 大约。 10 000。
  3. 每个顶点的平均邻居数量 - 大约。 200-300。
  4. 快速行查询 - 向量将乘以该矩阵。
  5. 添加边的复杂度为 O(1)。
  6. 很可能不会删除边。
  7. 尽可能快地枚举与 v 相邻的顶点。
  8. 可移植性 - 必须有一种方法可以将基础从一台计算机转移到另一台计算机。

所以,这是我的想法:

  1. 成对(行,列)的巨大表格。非常简单,但顶点枚举至少为 O(log N),其中 N - 表的大小。我认为这很慢。此外,它必须被索引。每个 RDBMS 都有什么用处。
  2. 大量列表:每个顶点一个列表。枚举非常快,但是存储它不会占用很多资源吗?另外,我不确定在这种情况下使用哪个 DBMS:也许是一些 NoSql?
  3. 巨大的表格(行 | 列的集合)。以上两者的结合。我不确定是否有任何 RDBMS 支持任意集。你知道任何?也许 NoSql 在这里会有用?
  4. 邻接列表的集合。任何 RDBMS 都适用于此,并且在复杂性方面的成本很高,但它们可能会被一个顶点的多个数据库请求所扼杀。
  5. HDF5 - 我认为它会因 I/O 而变慢。
  6. Neo4j - 据我所知,它将数据存储在双链表中,因此它实际上与 №4 相同,对吗?

请帮我选择或提供更好的决定。

如果我在某处估计有误,请纠正我。

最佳答案

混合 neo4j/hbase 方法可能会很好地工作,其中 neo4j 优化图形处理方面,而 hbase 明智地处理繁重的可扩展性 - 例如用于存储大量额外属性。

neo4j 包含节点和关系。明智的可扩展性可能就足够了。我在网络上对独立的非 neo4j 站点的调查声称在一台机器上有多达数十亿个节点/关系,其遍历性能比 RDBMS 好几个数量级。

但是.. 如果需要更大的可扩展性,您可以引入 hbase big iron 来存储非关系/节点标识符的额外属性。然后只需将 hbase rowkey 添加到 neo4j 节点信息中,以便在应用程序需要时进行查找。

关于sql - 如何存储稀疏邻接矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15003397/

相关文章:

多次sqlite查询对比

mysql - 可能情况下条件组合的 SQL 选择查询

java - Hibernate GUID 本地生成器

nosql - Cassandra 时间序列数据模型

r - 将系数名称转换为R中的公式

numpy - 保留大矩阵乘积的特定元素

mysql - MYSQL 中的查询,其中列作为表名,另一列作为列作为表名的外键

javascript - 发电机 : Query only every 10th value

matlab - 加速Matlab中inv(X'*X)*Q*inv(X'*X)的计算?

sql - 建模 NoSQL 数据库(从 SQL 数据库转换时)