Graph 在Cassandra中存储加权图时间序列

Graph 在Cassandra中存储加权图时间序列,graph,cassandra,time-series,data-modeling,cql,Graph,Cassandra,Time Series,Data Modeling,Cql,我不熟悉Cassandra,我想集思广益,在Cassandra中存储加权图的时间序列,其中边权重每次都会增加,但也会随着时间的变化而更新。比如说, w_ij(t+1) = w_ij(t)*exp(-dt/tau) + 1 我的第一个镜头涉及两个CQL v3表: 首先,我通过连接图的id和特定边上的两个节点(例如g-V1-V2)来创建一个分区键。我这样做是为了能够在下面描述的复合键的第二个组件上使用“orderby”指令,即类型timestamp。将此字符串称为EID,表示“边缘id” 表1 -

我不熟悉Cassandra,我想集思广益,在Cassandra中存储加权图的时间序列,其中边权重每次都会增加,但也会随着时间的变化而更新。比如说,

w_ij(t+1) = w_ij(t)*exp(-dt/tau) + 1
我的第一个镜头涉及两个CQL v3表:

首先,我通过连接图的id和特定边上的两个节点(例如g-V1-V2)来创建一个分区键。我这样做是为了能够在下面描述的复合键的第二个组件上使用“orderby”指令,即类型timestamp。将此字符串称为EID,表示“边缘id”

表1 -边缘更新的时间序列 -主键:EID、时间、重量 表2 -“上次更新时间”和“上次重量”的值 -主键:EID -列:时间、重量 每次勾选时,我都会获取并更新表2中存储的时间和权重值。我使用这些值来计算时间增量和新权重。然后在表1中插入这些值

这一策略是否存在严重的无效性?应该怎么做?我已经知道表2的更新过程不是幂等的,可能会导致不一致,但我暂时可以接受这一点


编辑:我可以做的一件事是将两个表合并到一个时间序列表中。

对于Cassandra(以及任何其他不能对写入进行比较和交换操作的数据库),您应该避免任何类型的先读后写。

首先:您的应用程序有哪些查询和查询模式? 此外,我还想知道计算和存储每条边的新权重的频率。每一秒,每一小时,每一天

是否可以在内存中保存每条边的最后一个权重?这样你就可以在写之前避免阅读了?这种值的某种延迟加载机制可能是可行的


如果您的查询允许使用此数据模型,我将尝试使用单列族构建解决方案

在用卡桑德拉写作之前,我会避免阅读,因为这真的不太合适。读操作的成本很高,远远高于写操作,为了保持性能,您需要大量的节点来执行相对较少的查询。你的建议并不适合卡桑德拉,因为在你写作之前似乎没有任何办法避免阅读。即使使用单个表,您仍然需要获取最后一个更新条目以执行写入。虽然这当然可以做到,但我认为有更好的工具来完成这项工作。话虽如此,如果您可以将表2中的所有数据都保存在内存中,并可能利用行缓存,那么这将是完全可行的。只要表2不太大,不足以容纳内存中的大多数行,您的读取速度就会显著加快,这可以弥补每次写入时执行读取的需要。然而,这将是一个相当大的挑战,您需要确保内存中只保留每行的“上次更新时间”,并且很少需要触摸磁盘

无论如何,您可能需要考虑的另一个设计是一个实现,其中您不仅使用Cassandra,还使用Cassandra前面的缓存来存储上次更新的时间。这可以与Cassandra一起运行,也可以在单独的节点上运行,但可以仅作为上次更新时间的内存存储,当需要更新行时,可以查询缓存,并将整行写入Cassandra(如果愿意,甚至可以写入上次更新时间)。您可以使用Redis之类的工具来执行此功能,这样您就不必担心墓碑或强制将所有内容存储在内存中等等

TABLE 1 - a time series of edge updates - PRIMARY KEY: EID, time, weight TABLE 2 - values of "last update time" and "last weight" - PRIMARY KEY: EID - COLUMNS: time, weight