用于实体沿袭的 AWS Neptune DB 与 Dynamo DB

AWS Neptune DB vs. Dynamo DB for entity lineage

我正在尝试评估最适合以下用例的方法:

存在一组可以表示为图形的实体。图中的每个顶点代表一个实体,每个(单向边)代表一个子到父关系。一个实体可能有多个父实体,一个父实体可能有多个子实体。通常,有一个 "master" 个实体,所有实体都可以追溯到该实体。无法删除任何实体。要求是应该很容易追踪任何实体的所有祖先。以下是我要评估的一些条件:

  1. 深树(最高祖先可以很远)与浅树(最高祖先通常不远)
  2. 宽遍历路径(一个顶点可以有多个父节点)与窄遍历路径(一个顶点通常没有多个父节点)
  3. 我错过的任何其他重要条件

以此图为例:

在常规的类似 DynamoDB 的数据库中,这将表示为:

-------------------
entity | parents  |
-------------------
A      | []       |
-------------------
B      | [A]      |
-------------------
C      | [A]      |
-------------------
D      | [A]      |
-------------------
E      | [B, C, D]|
-------------------
F      | [C, D]   |
-------------------

原有疾病是:

我对 DynamoDB 更加熟悉,但对 NeptuneDB 或任何图形数据库只有非常基本的了解,因此 DynamoDB 需要较少的前期投入。另一方面,NeptuneDB 当然更适合关系图存储,但在什么情况下值得技术开销?

当然有很多方法可以建模和存储连接的数据。正如您所观察到的,您可以像示例中那样使用邻接列表存储图形。在处理高度连接的数据时,图形数据库(如 Amazon Neptune)真正可以提供帮助的地方在于创建和执行查询。例如,使用 Gremlin 查询语言(Neptune 支持 TinkerPop/Gremlin 和 RDF/SPARQL),查找顶点“E”的最远祖先可以简单如下:

g.V('E').repeat(out()).until(__.not(out()))

无论树变得多深,查询都保持不变。如果要使用邻接表对数据建模,则必须自己编写代码来遍历 "graph"。像 Amazon Neptune 这样的图形数据库引擎经过优化,可以高效地执行这些类型的查询。

所以总而言之,您可以使用 Dynamo 或使用 Neptune 来完成它,但是如果图形变得复杂,那么使用具有一组内置图形查询功能的图形数据库应该会使您必须做的工作变得容易得多编写查询来遍历图形。正如您所指出的,最终的决定将取决于在重用您已经熟知的知识与学习新知识以获得轻松编写和执行查询的能力之间进行权衡,无论连接的数据变得多么复杂。我希望这可以帮助您做出决定。

您将在此处找到使用 Gremlin 建模和遍历树的简单示例:

http://www.kelvinlawrence.net/book/PracticalGremlin.html#btree