我看过这些论文:
...和其他一些人。我是数据库的新手(除了在不了解其内部结构的情况下将它们用于 Web 应用程序之外),因此我对如何使用磁盘进行存储没有太多基础。
我想大致了解这些论文在文件系统上存储图形的目的。在简要浏览它们时,他们提到将相关子图从磁盘加载到内存中以进行高效更新/查询。其中一些将边存储在一组文件中(称为“碎片”),将顶点存储在另一组文件中(称为“间隔”)。有些有多个不同的ID,比如TurboGraph中的“记录ID(RID)”和“顶点ID” (下图1)。
但是,我还没有看到所有部分如何组合在一起的完整概述。想知道是否有人可以解释这一点。
具体来说:
- 如何将数据结构化为图形数据库的文件(高级别)。
- 在高层次上将内容加载到内存中进行查询/更新时必须发生什么。
到目前为止我还不清楚什么需要加载到内存中,以及这些 ID 的具体用途。我不确定每个页面(通常>= 1MB)是否被加载到内存中并以某种方式解析,或者逐行扫描,或类似的东西(基本上不确定文件是如何解析/扫描的,如果它是解析成某种内存数据结构,或者如果您可以直接在文件字节上进行图形遍历)。而且我不确定 ID 的用途。在 RDBMS 中,ID 有时是每个表的递增整数,没有其他含义。在这些论文中,ID 似乎更多地与页面中顶点的位置加上某种偏移量等有关。此外,一些论文为一个顶点及其所有边(邻接列表)存储一条大单线(看起来),但我想知道如果每个顶点有数千或数百万条边该怎么办。如果可以指出要寻找的相关特征,那么进行进一步研究将有助于使这一点更加清晰。
非常感谢您抽出宝贵时间,我希望这是有道理的。
图1。
我相信图形的每个实现都会因它们如何从磁盘写入和读取而有所不同。
在Dgraph 的第 2 页第 2.2 节: Manish Jain 的同步复制、事务和分布式图形数据库中,数据存储讨论介绍了:
您问:
数据按主谓组存储到发布列表中。任何包含边列表的节点都会将该列表存储在单个发布列表中,直到它的大小达到某个阈值并且需要拆分为两个或多个列表。这可以理解为任何一对一的关系边或谓词都保存在它自己的列表中,一对多关系边或谓词被组合在一起并将链接的uid或对象值保存到列表中。主要的收获是 Badger 将值与键分开存储,以生成更小的树,从而提高读写性能。
Manish 刚刚发布了一篇关于内存管理的博客文章,并且可以比我自己更好地解释这方面的内容。