【问题标题】:How to store history of an edge in graph database?如何在图形数据库中存储边的历史记录?
【发布时间】:2022-10-24 16:20:36
【问题描述】:

我正在设计一种将图形历史存储在图形数据库中的方法。我有以下几点:

一个节点的历史,比如Vertex_A,是通过创建另一个历史节点来维护的,比如History_Vertex_A。每当修改Vertex_A 时,都会创建一个新版本节点,例如Vertex_A_Ver_X。这个新节点存储更改数据的旧值。在历史节点和版本节点之间创建一条新边。下图描述了这个想法。有没有更好的方法将顶点/节点的历史存储在图形数据库中?

                                +------------------+
                                | Vertex_A (Ver N) |
                                +---------+--------+
                                          |
                              +-----------v-----------+
                              | Edge_Vertex_A_History |
                              +-----------+-----------+
                                          |
                                +---------v--------+
                                | History_Vertex_A |
                                +---------+--------+
                                          |
         +---------------------+----------+----------------+----------------------+
         |                     |                           |                      |
  +------v-------+      +------v-------+          +--------v-------+      +-------v--------+
  | Edge_A_Ver_0 |      | Edge_A_Ver_1 |          | Edge_A_Ver_N-2 |      | Edge_A_Ver_N-1 |
  +------+-------+      +------+-------+          +--------+-------+      +-------+--------+
         |                     |                           |                      |
+--------v---------+  +--------v---------+      +----------v---------+  +---------v----------+
| Vertex_A (Ver 0) |  | Vertex_A (Ver 1) | .... | Vertex_A (Ver N-2) |  | Vertex_A (Ver N-1) |
+------------------+  +------------------+      +--------------------+  +--------------------+

现在,假设我有以下关系。 Vertex_A 通过边缘 Edge_AB 连接到 Vertex_B

+----------+      +---------+       +----------+
| Vertex_A +------> Edge_AB +-------> Vertex_B |
+----------+      +---------+       +----------+

我可以按照上述设计存储顶点的历史记录,但我不能使用相同的想法来存储边的历史记录,在这种情况下是边 Edge_AB。这是因为不可能有一条边连接到它对应的历史顶点。边不能连接到顶点。那么在图形数据库中存储边缘历史的最佳方法是什么?

【问题讨论】:

    标签: graph-databases


    【解决方案1】:

    您的方法在不同的图形数据库中普遍适用。

    我们用 NebulaGraph 做的另一种方法是在边缘定义中利用等级概念。

    在 NebulaGraph 中,定义边的一个实例的因素是:[src, dst, edge_type, rank],其中 rank 是一个 int,表示诸如 transaction_id、时间戳、版本或任何在一种边类型中的两个顶点之间生成多个.

    请注意,rank 字段可以省略,其值为 0,因此在使用其他图形数据库时,它不会给我们带来与其他图形数据库相同的思维模型的任何新内容。

    有了排名,我们可以在这里轻松地设计边缘的版本控制。但是我们如何设计顶点的版本控制呢?我们的方法是引入一条自身为 dst-vertex 的边,并将可能与不同版本的顶点不同的属性放在该边中,其中等级是版本,属性位于边上。

    参考:

    【讨论】:

      猜你喜欢
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      相关资源
      最近更新 更多