在 Cassandra DB 中建模图数据

The*_*ist 7 cassandra graph

我想使用 Apache Cassandra 根据属性图模型存储大量图数据。该模型包含以下实体:

  • Vertices:包含键/值对(属性)的映射。一些键应该被索引以进行查询(见下文)。
  • :在给定方向上将两个顶点相互连接。包含一个标签和可能的一些边缘数据。边缘数据是键/值对的映射,其中一些键也应该被索引以进行查询。

顶点和边都有一个唯一的主键,可以是字符串或整数值。

例子:

#A vertex
{node_type:'module',pk: 1,...}
#Another vertex
{node_type:'function',pk: 2,...}

#An edge
{incoming_vertex: 1,outgoing_vertex: 2,label: 'body',data : {}}
Run Code Online (Sandbox Code Playgroud)

我想在图表上执行以下类型的查询:

  • 根据它们的主键(例如“使用 pk = a5f...获取顶点”)或一个或多个索引属性的值(例如“使用node_type = 'module'和...获取所有顶点”)检索顶点列表。
  • 从给定的顶点沿其边遍历图,使用边标签、方向和一个或多个索引边属性来确定所采用的路径(例如“通过带有标签主体和属性的输出边获取连接到顶点 A 的所有顶点... = ...)。

此外,我还有以下要求和边界条件:

  • 检索给定顶点的边列表应该尽可能有效(理想情况下为 O(1))。
  • 边的数量将远大于图中的顶点数量。
  • 该模型应扩展到数十亿个顶点和数千亿个边(提供适当的硬件)。
  • 图数据通常只会写入一次并读取多次,因此模型可以以写入性能为代价来优化查询性能。

我对数据模型的最初想法如下:

  • 分别为顶点和边使用一个列族,其中行键是顶点/边的主键,单个文本列包含其 JSON 数据。顶点/边属性上的索引被建模为附加列(其数据被非规范化并在顶点/边数据发生变化时手动更新)
  • 使用一个动态列族来管理顶点的邻接(边)列表,复合主键包含顶点的主键、边的主键、边标签和边方向(传入或传出)每个顶点。

这是一个合理的数据模型吗?关于如何实现这一点的任何其他建议?

Ric*_*wig 3

对于 Cassandra 上的图形数据库,请查看TitanDB

您所需要的已经在 TitanDB 中实现了。实现自己的图形数据库并不简单,而且非常耗时。在大多数情况下,经过验证的解决方案是最好的。(顺便说一句,我没有参与 TitanDB 开发或业务。)我不知道你的用例,但我不认为有理由实施新的东西,除了作为一种爱好。

更新我在数据库中找到了一份关于 Titan GraphDB 数据模型的白皮书:https://github.com/thinkaurelius/titan/wiki/Titan-Data-Model。它给出了一些如何设计图形数据存储的提示。

Aurelius 现在也是 Datastax 的一部分,他们致力于开发在 Cassandra 中存储大图的组合解决方案。